[英]Get the new record primary key ID from SQL insert query to insert same value into another table?
[英]Insert data into table and get ID from increased primary key
在我的 ASP.NET 应用程序中,我需要做这样的事情:首先,从用户那里获取数据,然后将此数据插入 SQL Server 数据库表中,然后从该表中获取ID
值(自动递增),然后使用它在另一个插入到另一个表中。
现在,我已经发现为了做到这一点,我需要使用 T-SQL OUTPUT
子句。 但是,当我尝试这样做时,我收到此错误:
我尝试遵循这些帖子中的建议: 在 ADO.NET 中获取输出参数值并在 asp.net c# 中使用 SQL Server 存储过程输出,但我无法使其工作。
我没有使用存储过程,而是使用单个 SQL 语句。 这里是:
INSERT INTO BS_product_sets (User_id, Set_name, Set_id, Products_count)
OUTPUT inserted.ID INTO @NEWID
VALUES (@UID, @SNAME, @SPREFIX, @PCOUNT)
我也试过这个:
DECLARE @NEWID int;
INSERT INTO BS_product_sets (User_id, Set_name, Set_id, Products_count)
OUTPUT inserted.ID INTO @NEWID
VALUES (@UID, @SNAME, @SPREFIX, @PCOUNT)
但后来它变得更加奇怪,因为我得到的错误是:
你们中有人知道如何解决吗? 这是我在 C# 中的其余代码:
public void InsertProductAutoBinds(int user_id, int parameters_count, List<int> cat_ids, List<string> names, List<string> values, string set_name, string set_id)
{
SqlConnection connection = new SqlConnection(DatabaseConstants.ConnectionString);
// Adding set to database
SqlCommand command = new SqlCommand(DatabaseConstants.InsertSet, connection);
command.Parameters.AddWithValue("@UID", user_id);
command.Parameters.AddWithValue("@SNAME", set_name);
command.Parameters.AddWithValue("@SPREFIX", set_id);
command.Parameters.AddWithValue("@PCOUNT", 0);
command.Parameters.Add("@NEWID", SqlDbType.Int).Direction = ParameterDirection.Output;
connection.Open();
command.ExecuteNonQuery();
int new_inserted_id = Convert.ToInt32(command.Parameters["@NEWID"].Value);
connection.Close();
// Adding binds
command = new SqlCommand(DatabaseConstants.InsertAutoBinds1, connection);
command.Parameters.AddWithValue("@UID", user_id);
command.Parameters.AddWithValue("@SID", new_inserted_id);
command.Parameters.AddWithValue("@P1ID", cat_ids[0]);
command.Parameters.AddWithValue("@VN1", names[0]);
command.Parameters.AddWithValue("@VS1", values[0]);
if (parameters_count > 1)
{
command.CommandText = DatabaseConstants.InsertAutoBinds2;
command.Parameters.AddWithValue("@P2ID", cat_ids[1]);
command.Parameters.AddWithValue("@VN2", names[1]);
command.Parameters.AddWithValue("@VS2", values[1]);
}
if (parameters_count > 2)
{
command.CommandText = DatabaseConstants.InsertAutoBinds3;
command.Parameters.AddWithValue("@P3ID", cat_ids[2]);
command.Parameters.AddWithValue("@VN3", names[2]);
command.Parameters.AddWithValue("@VS3", values[2]);
}
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
如果您查看INSERT INTO
的官方 MS 文档,您会看到:
输出到 { @table_variable | 输出表 }
这意味着: OUTPUT ... INTO ....
子句仅适用于表或表变量作为其目标 - 您不能执行OUTPUT .... INTO @variable
- 这OUTPUT .... INTO @variable
不受支持。
所以你需要
OUTPUT ... INTO @tableVar
然后从该表变量中选择第一个值并返回它OUTPUT inserted.ID
(没有任何INTO ....
),只是在抢你的C#代码由SQL命令返回的值-在这种情况下,因为被返回的数据,你需要使用.ExecuteScalar()
代替C# 代码中的.ExecuteNonQuery()
如果你有:
CREATE TABLE tab (Id Int IDENTITY, User_Id Int, ...)
DECLARE @NewID Int
INSERT INTO tab (User_Id,...) VALUES (123, ...)
SET @NewId = @@Identity
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.