在具有外键关系的表中插入2行,而不知道主表的主键

Pro*_*994 0 c# sql database sql-server visual-studio

我在SQL Server Manager 2014中有以下数据库方案.

数据库方案

我正在Visual Studio中创建一个C#-windows应用程序,我想插入一个新的订单行和一个新的订单.问题是两个表的主键,在服务器管理器中自动生成,所以我还没有订单表的主键的值,但是我需要该值来填充orderLine的外键柱.如何插入这两行.

亲切的问候

小智 5

SCOPE_IDENTITY返回插入同一范围内的标识列的最后一个标识值.范围是一个模块:存储过程,触发器,函数或批处理.因此,如果两个语句在同一存储过程,函数或批处理中,则它们在同一范围内.

您可以使用SqlCommand.ExecuteScalar执行insert命令并在一个查询中检索新ID.

using (var con = new SqlConnection(ConnectionString)) {
    int newOrderID;
    var cmd = "INSERT INTO Order (column_name) VALUES (@Value) ;SELECT CAST(scope_identity() AS int)";
    using (var insertCommand = new SqlCommand(cmd, con)) {
        insertCommand.Parameters.AddWithValue("@Value", "bar");
        con.Open();
        newOrderID = (int)insertCommand.ExecuteScalar();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将允许您捕获最后生成的OrderId,并在OrderLine表的Insert语句中使用它.

另一种选择是使用以下SQL代码:

string command = "INSERT INTO Order(totalPrice) OUTPUT INSERTED.ID VALUES(@totalPrice)" // this will be a parameter from your code
Run Code Online (Sandbox Code Playgroud)

然后OrderId可以从:

Int32 orderId = (Int32) command.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)