如何获取刚添加的行ID

时间:2010-11-20 08:18:43

标签: c# sql-server

我的c#按钮在一个表中添加一些数据。我怎么能得到这一行的id?有人有想法吗?

  private static void InsertIntoTransportation(string ZednadebNumber, DateTime DateTime, int SellerID, int BuyerID, string TransStart, string TransEnd, decimal Quantity, string LoadType, string LoadName, int DriverID, decimal Cost, decimal FuelUsed, decimal salary)
    {
        try
        {
            using (SqlCommand cmd = new SqlCommand("INSERT INTO Transportation (DriverID, ClientIDAsSeller, ClientIDAsBuyer, ZednadebNumber, LoadName, TransStart, TransEnd, LoadType, Quantity, Cost, FuelUsed, DateTime) VALUES (@DriverID, @ClientIDAsSeller, @ClientIDAsBuyer, @ZednadebNumber, @LoadName, @TransStart, @TransEnd, @LoadType, @Quantity, @Cost, @FuelUsed, @DateTime)", new SqlConnection(Program.ConnectionString)))
            {
                cmd.Parameters.AddWithValue("@DriverID", DriverID);
                cmd.Parameters.AddWithValue("@ClientIDAsSeller", SellerID);
                cmd.Parameters.AddWithValue("@ClientIDAsBuyer", BuyerID);
                cmd.Parameters.AddWithValue("@ZednadebNumber", ZednadebNumber);
                cmd.Parameters.AddWithValue("@LoadName", LoadName);
                cmd.Parameters.AddWithValue("@TransStart", TransStart);
                cmd.Parameters.AddWithValue("@TransEnd", TransEnd);
                cmd.Parameters.AddWithValue("@LoadType", LoadType);
                cmd.Parameters.AddWithValue("@Quantity", Quantity);
                cmd.Parameters.AddWithValue("@Cost", Cost);
                cmd.Parameters.AddWithValue("@FuelUsed", FuelUsed);
                cmd.Parameters.AddWithValue("@DateTime", DateTime);
                cmd.Connection.Open();
                cmd.ExecuteNonQuery();
                SqlCommand cmd1 = new SqlCommand("INSERT INTO Salary (DriverID, TransportationID, Salary) VALUES (@DID, @@IDENTITY, @Salary)", new SqlConnection(Program.ConnectionString));
                cmd1.Parameters.AddWithValue("@DID", DriverID);
                cmd1.Parameters.AddWithValue("@Salary", salary);
                cmd1.Connection.Open();
                cmd1.ExecuteNonQuery();
                cmd1.Connection.Close();
                cmd.Connection.Close();
            }
        }
        catch (Exception)
        {

            MessageBox.Show("ვერ ვახერხებ მონაცემთა ბაზასთან კავშირს, დაწრმუნდით თქვენი კომპიუტერის ინტერნეტთან კავშირის გამართულობაში.", "შეცდომა !!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

3 个答案:

答案 0 :(得分:4)

  

我的c#按钮在一个中添加一些数据   表。我怎么能得到这一行的id?   有人有想法吗?

您提供的代码示例插入了两行。

无论哪种方式,只需将语句更改为包含“; SELECT SCOPE_IDENTITY()”,并从命令中获取标量结果。

假设您的行ID是标准整数字段(而不是bigint)

// Edit your command text to have "; SELECT SCOPE_IDENTITY()" at the end. 
int? insertedId = cmd.ExecuteScalar() as int?;
if (insertedId.HasValue) 
 { 
    //  success! 
 }

请注意,如果您的行没有使用自动递增的integer / big-int,那么这将不起作用。

此外,我强烈建议您考虑将语句移动到存储过程,如果这是针对测试/示例代码以外的任何其他内容。

将SQL代码从C#中分离出来意味着您可以重用常用语句(将它们视为方法)。或者,考虑使用ORM解决方案。

答案 1 :(得分:1)

在MS SQL Server上,我的首选项是output clause。你不会执行非查询,它将是一个读者(即使它在技术上是一个插入) - 插入的结果集将包含一行与您选择的字段。如果您有一个ROWVERSION(TIMESTAMP)列,您可能需要进行更新(阻止您进行另一次读取),这将非常有用。

编辑 - 只需使用OUTPUT,而不是OUTPUT INTO(这对SQL Server端代码比C#更有用)。

这也适用于sprocs和触发器,而不是scope_identity(当使用替代触发器时,在不同的范围内,因此返回null),或@@ identity及其所有问题。

答案 2 :(得分:-1)

我的一些同事开发人员将在插入后执行查询以返回标识值。作为一名DBA,还有其他方法可以获得它,如亚历山大所示。虽然查询将在网络上产生额外的IO,但至少它应该仍然在缓存中并且不会再引起磁盘IO。