使用主键复制 Access table
Copy Access table with primary keys
使用 C#、ODBC 和 Jet 4.0 引擎处理(旧的)Access 数据库。该任务要求我不使用 DAO。
不幸的是,Microsoft Jet 4.0 数据库引擎不支持“RENAME”关键字。以下所有抛出异常:
- 重命名 TABLE old_name 至 new_name;
- 将 old_name 重命名为 new_name;
- 更改 TABLE old_name 重命名为 new_name;
但以下语法确实有效:
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 可行)。
使用 C#、ODBC 和 Jet 4.0 引擎处理(旧的)Access 数据库。该任务要求我不使用 DAO。
不幸的是,Microsoft Jet 4.0 数据库引擎不支持“RENAME”关键字。以下所有抛出异常:
- 重命名 TABLE old_name 至 new_name;
- 将 old_name 重命名为 new_name;
- 更改 TABLE old_name 重命名为 new_name;
但以下语法确实有效:
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 可行)。