2017-07-18 38 views
0

我正在使用ADODB在VB 2005中開發一個程序。 考慮兩個MS Access數據庫。一個用table1,另一個用table2,table3。同步兩個數據庫的對象的程序MS Access

當我們運行程序並選擇兩個數據庫。它將創建第二個數據庫的table2,table3到第一個數據庫。要產生

Interface Image

該方案可以成功地產生的表的列表。之後,我有另一個功能來創建「CREATE TABLE」語句。

Function CreateCreateTableStatement(ByVal DBPath As String, ByVal TableName As String) As String 
     On Error GoTo EndErr 
     Dim cnn As New ADODB.Connection 
     Dim TablesSchema, ColumnsSchema, PrimaryKeysSchema As ADODB.Recordset 
     Dim tempsql, PrimaryKeyColumn As String 
     Dim i As Integer = 0 
     cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & DBPath & "';" 
     cnn.Mode = ADODB.ConnectModeEnum.adModeShareExclusive 
     DoLog("Getting tables list of " & DBPath) 
     cnn.Open() 
     TablesSchema = cnn.OpenSchema(ADODB.SchemaEnum.adSchemaTables) 
     TablesSchema.Filter = "TABLE_NAME = '" & TableName & "'" 
     PrimaryKeysSchema = cnn.OpenSchema(ADODB.SchemaEnum.adSchemaPrimaryKeys) 
     PrimaryKeysSchema.Filter = "TABLE_NAME = '" & TableName & "'" 
     If PrimaryKeysSchema.EOF = False Then PrimaryKeyColumn = PrimaryKeysSchema("COLUMN_NAME").Value 
     PrimaryKeysSchema.Close() 
     ColumnsSchema = cnn.OpenSchema(ADODB.SchemaEnum.adSchemaColumns) 
     ColumnsSchema.Filter = "TABLE_NAME = '" & TableName & "'" 
     tempsql = "CREATE TABLE " & TableName & " (" 
     Do While Not ColumnsSchema.EOF 
      tempsql = tempsql + ColumnsSchema("COLUMN_NAME").Value & " " & DataCodeToName(ColumnsSchema("DATA_TYPE").Value) & " " & " (" & ColumnsSchema("CHARACTER_MAXIMUM_LENGTH").Value & ") " '& ColumnsSchema("IS_NULLABLE").Value & ColumnsSchema("COLUMN_DEFAULT").Value & ", " & ColumnsSchema("IS_NULLABLE").Value & ", " & DataCodeToName(ColumnsSchema("DATA_TYPE").Value) & ", " & ColumnsSchema("CHARACTER_MAXIMUM_LENGTH").Value 
      If PrimaryKeyColumn = ColumnsSchema("COLUMN_NAME").Value Then tempsql = tempsql + " PRIMARY KEY, " Else tempsql = tempsql + ", " 
      ColumnsSchema.MoveNext() 
     Loop 
     tempsql = tempsql.Substring(0, Len(tempsql) - 2) + ");" 
     cnn.Close() 
     DoLog("Gotten tables list of " & DBPath) 
     Return tempsql 
     Exit Function 
EndErr: 
     cnn.Close() 
     MsgBox(Err.Description) 
    End Function 

輸出函數的是改變它之前:

CREATE TABLE Table2 (Column1 VARCHAR, Column11 UNSIGNED BYTE, Column12 SHORT, Column13 SINGLE, Column14 DOUBLE, Column15 Guid, Column16 NUMERIC, Column2 VARCHAR, Column3 LONG, Column4 DateTime, Column5 CURRENCY, Column6 LONG PRIMARY KEY, Column7 BIT, Column8 BINARY, Column9 VARCHAR); 

但執行SQL的錯誤「語法錯誤的字段定義」提出之後。所以我稍微改變了功能並增加了最大長度,如上面的代碼所示。上面的代碼生成SQL:

CREATE TABLE Table2 (Column1 VARCHAR (255) , Column11 UNSIGNED BYTE () , Column12 SHORT () , Column13 SINGLE () , Column14 DOUBLE () , Column15 LONG () , Column16 DECIMAL () , Column2 VARCHAR (0) , Column3 LONG () , Column4 DateTime () , Column5 CURRENCY () , Column6 LONG () PRIMARY KEY, Column7 BIT (2) , Column8 BINARY (0) , Column9 VARCHAR (0)); 

生成上述SQL後,錯誤是相同的。 我想要的只是關於create table語句的幫助。下面是Table2的圖像,其中create table語句是。從我的分貝 Table2 image

+0

做了一些測試。無法使Access接受UNSIGNED BYTE類型。 – June7

+0

也不喜歡長,短,二進制,位,單,雙,貨幣後的parens()。根本不喜歡Decimal。 – June7

+0

謝謝你們!你們倆。有效。但現在我陷入了另一個問題。完成一天的辛勤工作後,結果告訴我查詢創建的列沒有設置很多屬性。所以,我必須選擇另一種方法來使用vb 2005在ms access db中創建表格。 任何建議! –

回答

0

代碼在後臺和編輯表屬性創建表:

If IsNull(Me.tbxTestNum) Then 
    MsgBox "Must enter test number.", vbCritical, "Error" 
Else 
    Set cn = New ADODB.Connection 
    'connect to the backend database 
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source='" & gstrBasePath & "Data\LabData.accdb'" 
    'create the test table 
    cn.Execute "CREATE TABLE " & Me.tbxTestNum & " (LabNum text(12) PRIMARY KEY Not Null, method text(30) Not Null);" 

    'set table link 
    Set tdf = CurrentDb.CreateTableDef(Me.tbxTestNum) 
    tdf.SourceTableName = Me.tbxTestNum 
    tdf.Connect = "; DATABASE=" & gstrBasePath & "Data\LabData.accdb" 
    CurrentDb.TableDefs.Append tdf 

    Set rs = New ADODB.Recordset 
    rs.Open "SELECT * FROM BuildTable;", CurrentProject.Connection, adOpenStatic, adLockPessimistic 
    Set db = DBEngine.OpenDatabase(gstrBasePath & "Data\LabData.accdb") 
    While Not rs.EOF 
     If rs!DataField <> "LabNum" And rs!DataField <> "method" Then 
      'create field in new table 
      cn.Execute "ALTER TABLE " & Me.tbxTestNum & " ADD COLUMN " & _ 
         rs!DataField & " " & IIf(rs!DataType = "Boolean", "Bit", rs!DataType) & _ 
         IIf(rs!DataType = "Text", "(" & rs!FieldSize & ")", "") & ";" 
     End If 
     'must use DAO to set AllowZeroLength property, I don't allow zero length fields and Access defaults to Yes 
     If rs!DataType = "Text" Then 
      'change the AllowZeroLength default Yes to No 
      db.TableDefs(Me.tbxTestNum).Fields(rs!DataField).AllowZeroLength = False 
     End If 
     rs.MoveNext 
    Wend 

    rs.Close 
    cn.Close 
    db.Close 

End If 
0
Function CreateCreateTableStatement(ByVal DBPath As String, ByVal TableName As String) As String 
     'CREATE [TEMPORARY] TABLE table (field1 type [(size)] [NOT NULL] [WITH COMPRESSION | WITH COMP] [index1] [, field2 type [(size)] [NOT NULL] [index2] 
     ' [, …]] [, CONSTRAINT multifieldindex [, …]]) 
     On Error GoTo EndErr 
     Dim cnn As New ADODB.Connection 
     Dim TablesSchema, ColumnsSchema, PrimaryKeysSchema As ADODB.Recordset 
     Dim tempsql, PrimaryKeyColumn, ColLen As String 
     Dim i As Integer 
     cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & DBPath & "';" 
     cnn.Mode = ADODB.ConnectModeEnum.adModeShareExclusive 
     DoLog("Getting tables list of " & DBPath) 
     cnn.Open() 
     TablesSchema = cnn.OpenSchema(ADODB.SchemaEnum.adSchemaTables) 
     TablesSchema.Filter = "TABLE_NAME = '" & TableName & "'" 
     PrimaryKeysSchema = cnn.OpenSchema(ADODB.SchemaEnum.adSchemaPrimaryKeys) 
     PrimaryKeysSchema.Filter = "TABLE_NAME = '" & TableName & "'" 
     If PrimaryKeysSchema.EOF = False Then PrimaryKeyColumn = PrimaryKeysSchema("COLUMN_NAME").Value 
     PrimaryKeysSchema.Close() 
     ColumnsSchema = cnn.OpenSchema(ADODB.SchemaEnum.adSchemaColumns) 
     ColumnsSchema.Filter = "TABLE_NAME = '" & TableName & "'" 
     'ColumnsSchema.Sort = "`ORDINAL_POSITION`" 
     tempsql = "CREATE TABLE `" & TableName & "` (" 
     Do While Not ColumnsSchema.EOF 
      If ColumnsSchema("CHARACTER_MAXIMUM_LENGTH").Value.ToString = "" Or ColumnsSchema("CHARACTER_MAXIMUM_LENGTH").Value.ToString = "0" Then ColLen = "" 'Else ColLen = "(" & ColumnsSchema("CHARACTER_MAXIMUM_LENGTH").Value & ")" 
      tempsql = tempsql & "`" & ColumnsSchema("COLUMN_NAME").Value & "` " & DataCodeToName(ColumnsSchema("DATA_TYPE").Value) & " " & ColLen ' & ColumnsSchema("IS_NULLABLE").Value & ColumnsSchema("COLUMN_DEFAULT").Value & ", " & ColumnsSchema("IS_NULLABLE").Value & ", " & DataCodeToName(ColumnsSchema("DATA_TYPE").Value) & ", " & ColumnsSchema("CHARACTER_MAXIMUM_LENGTH").Value 
      If PrimaryKeyColumn = ColumnsSchema("COLUMN_NAME").Value Then tempsql = tempsql + " NOT NULL IDENTITY PRIMARY KEY, " Else tempsql = tempsql + ", " 
      ColumnsSchema.MoveNext() 
     Loop 
     tempsql = tempsql.Substring(0, Len(tempsql) - 2) + ");" 
     cnn.Close() 
     DoLog("Gotten tables list of " & DBPath) 
     Return tempsql 
     Exit Function 
EndErr: 
     cnn.Close() 
     MsgBox(Err.Description) 
    End Function 

謝謝你們。但今天我發現了創建表的正確SQL。

CREATE TABLE `Table3` (`Column1` VARCHAR , `Column11` BYTE , `Column12` SHORT , `Column13` SINGLE , `Column14` DOUBLE , `Column15` GUID , `Column16` DECIMAL , `Column2` VARCHAR , `Column3` LONG , `Column4` DateTime , `Column5` CURRENCY , `Column6` LONG NOT NULL IDENTITY PRIMARY KEY, `Column7` BIT , `Column8` OLEOBJECT , `Column9` VARCHAR); 

一切工作正常,但上面的SQL創建的表和通過MS Access Interface創建的表之間存在一些差異。