我有以下函数执行查询并在成功时返回true,在失败时返回false。不,我想扩展该方法,以便在每次触发的插入查询中,类var insertId
包含最后插入的行的ID。
问题是insertId
始终为0,所以executeScalar()
不会返回ID。
有什么想法吗?或其他解决方案来获取最后一次插入查询的ID ....
public int insertId;
public bool executeCommand(string q) {
q += "; SELECT @@IDENTITY AS LastID";
bool retour = true;
SqlConnection myCon = new SqlConnection(Settings.DSN);
SqlCommand cmd = new SqlCommand(q, myCon);
try {
cmd.Connection.Open();
insertId = (int)cmd.ExecuteScalar();
if (insertId > 0) {
MessageBox.Show(insertId.ToString());
}
myCon.Close();
} catch (Exception ex) {
this.error = ex.Message;
retour = false;
}
return retour;
}
答案 0 :(得分:19)
您应该立即更改INSERT
以将插入的ID返回给您(在OUTPUT
子句中)!这适用于SQL Server 2005 - OUTPUT
子句在SQL Server 2000或更早版本中不可用(您没有指定在您的问题中使用的SQL Server的版本) ...)。详细了解OUTPUT
clause on MSDN Books Online。
将插入更改为:
INSERT INTO dbo.YourTable(Col1, Col2, ..., ColN)
OUTPUT Inserted.ID
VALUES(Val1, Val2, ..., ValN);
然后当你从C#执行insert语句时,你应该可以这样做:
using(SqlCommand cmdInsert = new SqlCommand("INSERT.....", myCon))
{
myCon.Open();
var result = cmdInsert.ExecuteScalar();
myCon.Close();
}
并且您的result
变量现在应该包含正确的,新插入的值!
答案 1 :(得分:2)
尝试SCOPE_IDENTITY()而不是@@ IDENTITY,如果这不起作用,您可以发布表格架构和正在运行的插入查询。