使用 Data Set [asp.net, c#] 在 SQL Server 中新建行



我有这个代码:

SqlConnection cnn = new SqlConnection();
cnn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
cnn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "select * from Szkoda";
cmd.Connection = cnn;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
da.Fill(ds, "Szkoda");
SqlCommandBuilder cb = new SqlCommandBuilder(da);
DataRow drow = ds.Tables["Szkoda"].NewRow();
drow["Likwidator"] = tbLikwidator.Text;
drow["FirmaObslugujaca"] = DdFirma.Text;
drow["StanSzkody"] = DdStan.Text;
drow["CzyRegres"] = DdRegres.Text;
drow["KrajZdarzenia"] = DdKraj.Text;
ds.Tables["Szkoda"].Rows.Add(drow);
da.Update(ds, "Szkoda");

问题是如何获取插入的记录 ID?我阅读了有关范围的信息,但我不知道如何在上面的代码中使用它。

我想在保存新记录后获取最后一个 ID 以重定向到查看表单。我正在寻找最简单的解决方案:)

您不能直接从 DataAdapter 的 Update 命令执行此操作。您需要准备一个包含两个命令的自定义插入命令。第一个插入您的记录,第二个返回来自您的连接的最后一个插入的 id

string insertText = @"INSERT INTO Szkoda (Likwidator,FirmaObslugujaca, 
                      StanSzkody, CzyRegres, KrajZdarzenia) 
                      values (@lik, @fir, @sta, @czy, @kra);
                      SELECT SCOPE_IDENTITY()";
SqlCommand cmd = new SqlCommand(insertText, connection);
cmd.Parameters.AddWithValue("@lik", tbLikwidator.Text);
cmd.Parameters.AddWithValue("@fir", DdFirma.Text);
cmd.Parameters.AddWithValue("@sta", DdStan.Text);
cmd.Parameters.AddWithValue("@cay", DdRegres.Text);
cmd.Parameters.AddWithValue("@kra", DdKraj.Text);
object result = cmd.ExecuteScalar();
if(result != null)
{
   int lastInsertedID = Convert.ToInt32(result);
   // now insert the row in your dataset table but instead of
   // da.Update(ds, "Szkoda"); call 
   ds.Tables["Szkoda"].AcceptChanges();
}

当然,这应该与现有代码一起使用,但不要调用 Update,只需对数据表调用 AcceptChanges 以确认表中的新记录

从 C# 代码中将记录插入到表中(使用 sql 查询,而不是存储过程),您可以使用 Get 记录 函数使用 max() 功能选择最后一个记录 id(不推荐,因为在 muliuser 的情况下,这将是错误的)。

select * from Szkoda  where ID IN (select max(id) from Szkoda)

如果使用存储过程插入数据,请在存储过程中使用SCOPE_Identity(),并使用 Output 参数获取 c# 代码中的值。

CREATE PROCEDURE dbo.testSP
  @Col1 VARCHAR(50),
  @Col2  VARCHAR(20),
  @new_identity INT = NULL OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    INSERT dbo.TestTable(Col1, Col2) SELECT @Col1, @Col2;
    SET @new_identity = SCOPE_IDENTITY();
END
GO

引用此 从存储过程中返回最后插入行的标识