使用 C#、ODBC 和 Jet 4.0 引擎處理(舊)Access 資料庫。該任務要求我不使用 DAO。
遺憾的是,Microsoft Jet 4.0 資料庫引擎不支持“RENAME”關鍵字。以下所有拋出例外:
- RENAME TABLE old_name TO new_name;
- 將舊名稱重命名為新名稱;
- ALTER TABLE old_name 重命名為 new_name;
但以下語法確實有效:
SELECT * INTO new_name FROM old_name;
問題是主鍵沒有被復制。
有沒有辦法創建表的副本,并在副本中保留哪些欄位是主鍵?
uj5u.com熱心網友回復:
使用 ODBC,您可以獲取/獲取索引。大多數時候,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
輸出:

但是,用戶可以創建索引并為其指定不同的名稱。
因此,例如,我可以進入上表,并將主鍵重命名為我想要的任何東西 - 說這個:

所以,真的不是很好。
然而,雖然應用程式和“大部分”代碼可以堅持使用 ODBC?
如果您使用 oleDB,那么您可以以 100% 的可靠性獲得 PK,并且您不必參考 DAO。
因此,雖然上面顯示我們在末尾用“zoo”重命名了 PK,但這個 oleDB 代碼仍將回傳 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”,這并不是真正的要求(它是/被命名為“PrimaryKey”)
所以,你可以考慮 oleDB。
我沒有深入挖掘,但我認為 ODBC 無法獲得可靠的 PK。
您可以使用我上面的 odbc getSchema。有一些代碼片段建議您打開連接,打開閱讀器并使用資料閱讀器的getschema,并且確實有效 - 但我沒有一個作業示例(或者甚至知道這是否可以作業 - 但是有有人建議這可以/確實有效)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/324320.html
