在使用带有 OleDb 连接的 MS Access 的 Insert Into 命令期间,如何 return 主键值?

How can one return the primary key value during an Insert Into command using MS Access with an OleDb connection?

我可以从桌面应用程序(C#、WinForms)向我的 MS Access table ("Table1") 中插入一行新数据,但我不知道如何 return 新添加行的主键 ("UniqueID") 的值。我正在使用 OleDbConnection 来执行我的所有查询。我已经尝试使用如下所示的 OUTPUT 子句,以及 SCOPE_IDENTITY() 到 return 值,但我只得到异常:"Syntax error in INSERT INTO statement."

我已经看到很多关于如何使用 SQL 服务器执行此操作的示例,但是是否可以 return 使用 Access 和 OleDbConneciton 的主键值?

int PrimaryKey;
using (OleDbConnection Connection = new OleDbConnection(CONNECTION_STRING))
{
  Connection.Open();

  OleDbCommand Command = new OleDbCommand();
  Command.Connection = Connection;
  Command.CommandText = String.Format(
    "INSERT INTO Table1 (JobNumber, ItemNumber) " +
    "OUTPUT INSERTED.UniqueID " +
    "VALUES (@jobnumber, @itemnumber)");

  Command.Parameters.AddRange(new OleDbParameter[]
  {
    new OleDbParameter("@jobnumber", JobNumber),
    new OleDbParameter("@itemnumber", ItemNumber)
  });

  PrimaryKey = Convert.ToInt32(Command.ExecuteScalar());
}

OUTPUT INSERTED 不是 Jet Sql(Microsoft Access 的 sql 引擎)的有效语法,而且 SCOPE_IDENTITY() 也不被理解。此外,Jet 不支持批处理语句。所以你需要向引擎发送两个不同的命令。

int PrimaryKey;
using (OleDbConnection Connection = new OleDbConnection(CONNECTION_STRING))
{
  Connection.Open();

  OleDbCommand Command = new OleDbCommand();
  Command.Connection = Connection;
  Command.CommandText = @"INSERT INTO Table1 
                          (JobNumber, ItemNumber) 
                          VALUES (@jobnumber, @itemnumber)";

  Command.Parameters.AddRange(new OleDbParameter[]
  {
    new OleDbParameter("@jobnumber", JobNumber),
    new OleDbParameter("@itemnumber", ItemNumber)
  });
  Command.ExecuteNonQuery();

  // Send the next command
  Command.Parameters.Clear();
  Command.CommandText = "SELECT @@IDENTITY";
  PrimaryKey = Convert.ToInt32(Command.ExecuteScalar());
}