INSERT上的返回ID?

Dan*_*npe 28 c# sql sql-server insert

我有一个INSERT查询,我希望DB返回刚刚插入的行的ID.

sqlString = "INSERT INTO MagicBoxes (OwnerID, Key, Name, Permissions, Active, LastUpdated) VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) SET @ID = SCOPE_IDENTITY();";
cmd = new SqlCommand(sqlString, con);
cmd.Parameters.AddWithValue("@OwnerID", OwnerID);
cmd.Parameters.AddWithValue("@BoxKey", BoxKey);
cmd.Parameters.AddWithValue("@BoxName", BoxName);
cmd.Parameters.AddWithValue("@Username", Username);
cmd.Parameters.AddWithValue("@Date", DateTime.Now);
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

我目前有这个,我不确定接下来我需要做什么......

Ada*_*Dev 36

你只需要在params集合中添加@ID,然后像这样检索它,

cmd.Parameters.Add("@ID", SqlDbType.Int, 4).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
//Now just read the value of: cmd.Parameters["@ID"].value
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢这种语法:

SqlParameter param = new SqlParameter("@ID", SqlDbType.Int, 4);
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param);
Run Code Online (Sandbox Code Playgroud)

  • 执行命令后参数为null,我无法完成这项工作.这里的另一个答案使用ExecuteScalar并且似乎产生正确的值. (2认同)

Mar*_*ell 21

你有两个选择; 你可以声明一个Output名为的参数@ID; 或者 - 您可以将结束更改为SELECT SCOPE_IDENTITY()仅使用:

int id = (int)cmd.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)

我更喜欢形式参数方法,但ExecuteScalar效果很好.


Fil*_*Vos 18

自SQL Server 2008以来,在TSQL的语法中添加了一个OUTPUT子句.这允许您将受DML查询影响的数据添加到表格数据流中.

虽然在查询后查询SCOPE_IDENTITY()会返回正确的信息,但它会强制SQL Server执行2个查询,其中output子句将此限制为一个查询.

知道这一点,正在执行的查询可以改变如下(假设[Id]是身份的名称):

INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated) 
OUTPUT INSERTED.Id
VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date)
Run Code Online (Sandbox Code Playgroud)

另一个问题是不处理SqlCommand.Sql...ADO.net中的大多数对象都实现IDisposable并且应该正确处理.

把所有东西放在一起我会按如下方式实现这段代码:

        using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString))
        using (var cmd = new SqlCommand(@"
                INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated) 
                OUTPUT INSERTED.Id
                VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) ", conn))
        {
            cmd.Parameters.AddRange(new[]
                {
                    new SqlParameter("@OwnerID", SqlDbType.Int).Value = OwnerID,
                    new SqlParameter("@BoxKey", SqlDbType.VarChar).Value = BoxKey, 
                    new SqlParameter("@BoxName", SqlDbType.VarChar).Value = BoxName, 
                    new SqlParameter("@Date", SqlDbType.DateTime).Value = DateTime.Now 
                });

            conn.Open();

            var id = (int)cmd.ExecuteScalar();
        }
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案. (2认同)

Rem*_*ner 5

将其添加到您的参数中

SqlParameter IDParameter = new SqlParameter("@ID",SqlDbType.Int);
IDParameter.Direction = ParameterDirection.Output;
cmd.Parameters.Add(IDParameter);
Run Code Online (Sandbox Code Playgroud)

执行后,您可以检索ID

int id = (int)IDParameter.Value;
Run Code Online (Sandbox Code Playgroud)