MS Access-C#-检索最新插入的guid

本文关键字:guid 插入 最新 Access-C#- 检索 MS | 更新日期: 2023-09-27 18:20:44

有没有办法在C#访问中检索最新插入的guid?

我尝试过这样做:创建了一个表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

编辑

要创建表,您可以在C#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])

MS Access-C#-检索最新插入的guid

我知道这并不完全是您所要求的,但让我提出一个可能解决您潜在问题的替代解决方案。

在C#中创建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,而无需更改现有代码。

如果SELECT @@IDENTITY不适用于"ReplicationID"AutoNumber字段,那么为新记录检索此类值的最可能方法是使用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

您可以使用OUTPUT:这样尝试

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

你可以这样尝试:

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();
  }
}