Как можно вернуть значение первичного ключа во время команды «Вставить в», используя MS Access с подключением OleDb? - PullRequest
0 голосов
/ 14 октября 2019

Я могу вставить новую строку данных в свою таблицу MS Access ("Table1") из настольного приложения (C #, WinForms), но не могу понять, как вернуть значение первичного ключа ("UniqueID") для вновь добавленной строки. Я использую OleDbConnection для выполнения всех моих запросов. Я пытался использовать предложение OUTPUT, показанное ниже, а также SCOPE_IDENTITY (), чтобы вернуть значение, но я получаю только исключение: «Синтаксическая ошибка в инструкции INSERT INTO».

Я видел много примеров того, каксделать это с помощью SQL Server, но возможно ли вернуть значение первичного ключа с помощью 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());
}

1 Ответ

3 голосов
/ 14 октября 2019

OUTPUT INSERTED не является допустимым синтаксисом для Jet Sql (механизм sql для Microsoft Access), а также 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());
}
...