Подтвердить что ты не робот

MS Access - С# - Получить последнее вставленное руководство

Есть ли способ получить последнюю введенную директиву при доступе с помощью С#?

Я пробовал это: создал таблицу Cars с полем Id типа autonumber, replicationID и поле Имя varchar (250).

var command = myConnection.CreateCommand();
command.Connection.Open();
command.CommandText = "INSERT INTO Cars(Name) VALUES ('Pagani')";
command.ExecuteNonQuery();
command = context.Database.Connection.CreateCommand();
command.CommandText = "SELECT @@Identity";
Console.WriteLine(command.ExecuteScalar());
command.Connection.Close();

Проблема, которую я получаю:

Console.WriteLine(command.ExecuteScalar());  

всегда показывает 0

ИЗМЕНИТЬ

Чтобы создать таблицу, вы можете использовать этот оператор через соединение С# OleDb (я думаю, что из запроса MS Access не работает)

CREATE TABLE [Cars] (
 [Id] guid not null DEFAULT GenGUID(),
 [Name] text null
);
ALTER TABLE [Cars] ADD CONSTRAINT [PK_Cars_6515ede4] PRIMARY KEY ([Id])
4b9b3361

Ответ 1

Если SELECT @@IDENTITY не работает для полей AutoNumber "ReplicationID", то наиболее вероятным способом получения такого значения для новой записи является использование вставки набора записей Access DAO, например:

// required COM reference:
//     Microsoft Office 14.0 Access Database Engine Object Library
var dbe = new Microsoft.Office.Interop.Access.Dao.DBEngine();
Microsoft.Office.Interop.Access.Dao.Database db = dbe.OpenDatabase(
        @"C:\Users\Public\Database1.accdb");
Microsoft.Office.Interop.Access.Dao.Recordset rst = db.OpenRecordset(
        "SELECT [Id], [Name] FROM [Cars] WHERE FALSE", 
        Microsoft.Office.Interop.Access.Dao.RecordsetTypeEnum.dbOpenDynaset);

rst.AddNew();
// new records are immediately assigned an AutoNumber value ...
string newReplId = rst.Fields["Id"].Value;  // ... so retrieve it
// the returned string is of the form
//     {guid {1D741E80-6847-4CB2-9D96-35F460AEFB19}}
// so remove the leading and trailing decorators
newReplId = newReplId.Substring(7, newReplId.Length - 9);
// add other field values as needed
rst.Fields["Name"].Value = "Pagani";
// commit the new record
rst.Update();

db.Close();

Console.WriteLine("New record added with [Id] = {0}", newReplId);

который производит

New record added with [Id] = 1D741E80-6847-4CB2-9D96-35F460AEFB19

Ответ 2

Я знаю, что это не совсем то, о чем вы просите, но позвольте мне предложить альтернативное решение, которое может решить вашу основную проблему.

Создайте GUID в С# и передайте его в свою вставку:

var newGuid = Guid.NewGuid();

var command = myConnection.CreateCommand();
command.Connection.Open();
command.CommandText = "INSERT INTO Cars(Id, Name) VALUES (?, 'Pagani')";
command.Parameters.AddWithValue("@Id", newGuid);   // Note: OleDb ignores the parameter name.
command.ExecuteNonQuery();

Console.WriteLine(newGuid);

GUID уникальны. Не важно, генерируется ли это ваше приложение или драйвер базы данных Access.

Эта опция во всех отношениях превосходит чтение GUID впоследствии:

  • Вам нужен только один доступ к базе данных.

  • Это меньше кода.

  • Это проще.

И вы все же можете опустить GUID в своем INSERT в случаях, когда вам не нужно знать GUID - не нужно менять существующий код.

Ответ 3

Вы можете попробовать это, используя OUTPUT:

INSERT INTO myTable(myGUID)
OUTPUT INSERTED.myGUID
VALUES(GenGUID())

Забастовкa > Вы можете попробовать следующее:

string str1 = "INSERT INTO Cars(Name) VALUES ('Pagani')";
string str2 = "Select @@Identity";
int ID;
using (OleDbConnection conn = new OleDbConnection(connect))
{
  using (OleDbCommand cmd = new OleDbCommand(str1, conn))
  {
    conn.Open();
    cmd.ExecuteNonQuery();
    cmd.CommandText = str2;
    ID = (int)cmd.ExecuteScalar();
  }
}

Ответ 4

Эта работа для меня с Access 2013. Но будьте осторожны - функции LAST и FIRST доступны для доступа.

SELECT LAST(Id) FROM Cars