繁体   English   中英

将数据插入表并从增加的主键中获取ID

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM