我有这个代码:
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
引用此 从存储过程中返回最后插入行的标识