使用主键复制 Access table

Copy Access table with primary keys

使用 C#、ODBC 和 Jet 4.0 引擎处理(旧的)Access 数据库。该任务要求我不使用 DAO。

不幸的是,Microsoft Jet 4.0 数据库引擎不支持“RENAME”关键字。以下所有抛出异常:

但以下语法确实有效:

SELECT * INTO new_name FROM old_name;

问题是没有复制主键。

有没有办法创建一个 table 的副本,并在副本中保留哪些字段是主键?

使用 ODBC,您可以 get/grab 索引。大多数时候,PK 列有一个名为主键的索引。这不是 100% 保证。

因此,这在“大部分”时间都有效:

例如:

Sub Test22()

    Using con As New OdbcConnection(My.Settings.Test44ODBC2)
        '            Using cmdSQL As New OdbcCommand("SELECT TOP 1 * From PKTEST", con)

        con.Open()

        Dim schemaTable As New DataTable
        schemaTable = con.GetSchema("Indexes", New String() {Nothing, Nothing, "PKTEST"})
        Me.DataGridView1.DataSource = schemaTable

    End Using

 End Sub

输出:

但是,用户可以创建索引并为其指定不同的名称。

因此,例如,我可以进入上面的 table,然后将主键重命名为我想要的任何名称 - 可以这样说:

所以,不是很好。

但是,虽然应用程序和“大部分”代码可以坚持使用 ODBC?

如果您使用 oleDB,那么您可以 100% 可靠地获得 PK,并且您不必引用 DAO。

因此,虽然上面显示我们在末尾用“zoo”重命名了 PK,但此 oleDB 代码仍将 return PK 列,如下所示:

Sub GetoleDBGetKey()

    Using con As New OleDbConnection(My.Settings.TESTAce)
        Using cmdSQL As New OleDbCommand("SELECT * from PKTEST", con)

            con.Open()
            Dim schemaTable As DataTable = con.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys,
                            New Object() {Nothing, Nothing, "PKTEST"})

            Me.DataGridView1.DataSource = schemaTable
        End Using
    End Using
End Sub

因此,oleDB 将 100% 正常工作。

上面的 ODBC 片段?好吧,我们必须假设“PrimaryKey”,这并不是真正的要求(它 is/was 命名为“PrimaryKey”)

所以,你可以考虑使用 oleDB。

我没有深入挖掘,但我认为ODBC不能可靠地获得PK。

你可以玩我上面的 odbc getSchema。有一些代码片段建议您打开连接,打开 reader,并使用数据 reader 的 getschema,这确实有效——但我没有一个有效的例子(甚至不知道如果这可行 - 但有人建议这 can/does 可行)。