我需要一个函数,它在数据库上执行INSERT语句并返回Auto_Increment主键。我有下面的C#代码,但是,虽然INSERT语句正常工作(我可以看到数据库中的记录,PK生成正确,行数为1),但id值始终为0.关于可能发生什么的任何想法错误?@@ IDENTITY INSERT语句总是返回0
public int ExecuteInsertStatement(string statement)
{
InitializeAndOpenConnection();
int id = -1;
IDbCommand cmdInsert = connection.CreateCommand();
cmdInsert.CommandText = statement;
int rows = cmdInsert.ExecuteNonQuery();
if (rows == 1)
{
IDbCommand cmdId = connection.CreateCommand();
cmdId.CommandText = "SELECT @@Identity;";
id = (int)cmdId.ExecuteScalar();
}
return id;
}
private void InitializeAndOpenConnection()
{
if (connection == null)
connection = OleDbProviderFactory.Instance.CreateConnection(connectString);
if(connection.State != ConnectionState.Open)
connection.Open();
}
在回答的答案,我想:
public int ExecuteInsertStatement(string statement, string tableName)
{
InitializeAndOpenConnection();
int id = -1;
IDbCommand cmdInsert = connection.CreateCommand();
cmdInsert.CommandText = statement + ";SELECT OID FROM " + tableName + " WHERE OID = SCOPE_IDENTITY();";
id = (int)cmdInsert.ExecuteScalar();
return id;
}
但现在我得到的错误“人物SQL语句的结束后,发现”
我使用的MS Access数据库与OleDb连接,提供程序= Microsoft.Jet.OLEDB.4.0
你能澄清你正在使用的数据库服务器,并可能对内嵌InitializeAndOpenConnection/connection.CreateCommand引用,因为它们可能会影响我们的答案您? :) – Rob 2008-10-09 10:00:54
此外 - 整个“选择OID从x其中OID = SCOPE_IDENTITY()”瘦有点过于复杂,你说的(对于插入身份值为3的记录):“SELECT 3 FROM table_x WHERE 3 = 3“ - 有点多余 – Rob 2008-10-09 10:02:21
@Rob:它可能看起来多余,但OID是键入int,其中scope_identity()不是,所以你可以直接抛出(int)cmd.ExecuteScalar() – devio 2008-10-09 13:03:50