在Access中选择@@IDENTITY始终返回0
本文关键字:返回 @@IDENTITY Access 选择 | 更新日期: 2023-09-27 18:30:04
我一直在努力寻找这个问题的解决方案,但到目前为止都没有成功。
private void Insert()
{
string ConnectionStringAccess = Provider=Microsoft.ACE.OLEDB.12.0;Data Source=###Jet OLEDB:Database Password=###;
string query2 = "Select @@Identity";
int id = -1;
string Query = "INSERT INTO tblTable (EmpNo, Name) VALUES (132, 'TestName');";
OleDbConnection con = new OleDbConnection(ConnectionStringAccess);
OleDbCommand cmd = new OleDbCommand(Query, con);
try
{
con.Open();
if (cmd.ExecuteNonQuery() == 1)//the insert succeded
{
cmd.CommandText = query2;
id = Convert.ToInt32(cmd.ExecuteScalar());
}
}
catch (Exception ex)
{
//log the ex
}
finally
{
con.Dispose();
con.Close();
}
}
每次我使用上述方法时,我总是在"id"中返回0。我做错了什么?我尝试使用不同的连接字符串或其他方式来获取最新标识符:
- 提供商=Microsoft.Jet.OLEDB.4.0
- SCOPE_IDENTITY()
但再次一无所获。Access数据库是2003或更旧版本(不完全确定)。
ms访问数据库是2003或更旧版本(不确切)
我能够用Access 97数据库重新创建您的问题。SELECT @@IDENTITY
与Access 2000数据库文件一起正常工作(即使是从与INSERT相同的OleDbCommand对象运行时),但在与Access 97数据库一起运行时,它总是返回零。
如果您希望SELECT @@IDENTITY
正常工作,则需要将数据库文件升级到较新版本。
您正在使用相同的命令对象来插入和检索@@identity。
根据本文,您应该创建一个单独的命令对象来检索@@identity值:
http://support.microsoft.com/kb/815629
此外,为了验证,您要插入的表确实有一个自动递增列,这是正确的吗?否则,@@identity将不会返回任何内容。
为查询创建两个不同的命令,先执行非查询,然后执行标量。它将返回查询返回的结果集中第一行的第一列,它应该是您要查找的id。
private void Insert()
{
string ConnectionStringAccess = Provider=Microsoft.ACE.OLEDB.12.0;Data Source=###Jet OLEDB:Database Password=###;
int id = -1;
string Query = "INSERT INTO tblTable (EmpNo, Name) VALUES (132, 'TestName')";
string Query2 = "SELECT @@Identity";
OleDbConnection con = new OleDbConnection(ConnectionStringAccess);
OleDbCommand cmd = new OleDbCommand(Query, con);
OleDbCommand cmd2 = new OleDbCommand(Query2, con);
try
{
con.Open();
cmd.ExecuteNonQuery();
id = (int)cmd2.ExecuteScalar();
}
catch (Exception ex)
{
//log the ex
}
finally
{
con.Dispose();
con.Close();
}
}
再次感谢
我的解决方案与我的旧数据库(VB6和ACCESS)用VBNET和之前的数据库升级到4。
'MyInsertCommand.CommandText="选择@@Identity"不使用旧的Access数据库
MyInsertCommand.CommandText="通过ME_idn Desc从网格顺序中选择前1个ME_idn";
Dim MyInsertIdn As Integer=MyInsertCommand.ExecuteScaler()