4

adodbとadoxを使用してdbを作成しようとすると、このコードが見つかります。

ここでオリジナルを確認できますが、同じです。著者に感謝

Private Sub Command1_Click()
Dim db_file As String
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim num_records As Integer

' Get the database name.
db_file = App.Path
If Right$(db_file, 1) <> "\" Then db_file = db_file & _
    "\"
db_file = db_file & "People.mdb"

' Open a connection.
Set conn = New ADODB.Connection
conn.ConnectionString = _
    "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & db_file & ";" & _
    "Persist Security Info=False"
conn.Open

' Drop the Employees table if it already exists.
On Error Resume Next
conn.Execute "DROP TABLE Employees"
On Error GoTo 0

' Create the Employees table.
conn.Execute _
    "CREATE TABLE Employees(" & _
        "EmployeeId INTEGER      NOT NULL," & _
        "LastName   VARCHAR(40)  NOT NULL," & _
        "FirstName  VARCHAR(40)  NOT NULL)"

' Populate the table.
conn.Execute "INSERT INTO Employees VALUES (1, " & _
    "'Anderson', 'Amy')"
conn.Execute "INSERT INTO Employees VALUES (1, 'Baker', " & _
    "   'Betty')"
conn.Execute "INSERT INTO Employees VALUES (1, 'Cover', " & _
    "   'Chauncey')"
' Add more records ...

' See how many records the table contains.
Set rs = conn.Execute("SELECT COUNT (*) FROM Employees")
num_records = rs.Fields(0)

conn.Close

MsgBox "Created " & num_records & " records", _
    vbInformation, "Done"
End Sub

しかし、それをより堅牢にする方法なので、dbを削除したくありません。

db が存在するかどうか、および db.tables に私のテーブルが含まれているかどうかを確認する方法は?

追加の質問: このコードが ms-access 2007 のデータベースを作成するのは正しいですか?

手伝ってくれてありがとう!

4

2 に答える 2

4

あなたの質問には次の2つが含まれます:

  1. db が存在するかどうか、および db.tables に私のテーブルが含まれているかどうかを確認する方法は?
  2. このコードが ms-access 2007 のデータベースを作成するのは正しいですか?

#1 の最初の部分では、Dir() 関数を使用します。

If Len(Dir("C:\SomeFolder\YourDb.mdb")) > 0 Then
    Debug.Print "db exists"
Else
    Debug.Print "db not found"
End If

#1 の 2 番目の部分では、この機能を試してください。 pTableは、チェックしているテーブルの名前です。 pDbPathは、調査する db ファイルのファイル名を含むフル パスです。パスは、ドライブ文字で始まるパスにすることも、UNC パス ( \\Server\Share\YourDb.mdb ) にすることもできます。

Public Function TableExists(ByVal pTable As String, _
        Optional ByVal pDbPath As String) As Boolean
    'return True if pTable exists as either a native or linked table '
    'pass any error to caller '
    Dim blnReturn As Boolean
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef

    If Len(Trim(pDbPath)) > 0 Then
        Set db = OpenDatabase(pDbPath)
    Else
        Set db = CurrentDb
    End If

    For Each tdf In db.TableDefs
        If tdf.Name = pTable Then
            blnReturn = True
            Exit For
        End If
    Next tdf

    Set tdf = Nothing
    If Len(Trim(pDbPath)) > 0 Then
        db.Close
    End If
    Set db = Nothing
    TableExists = blnReturn
End Function

2 番目の質問に関しては、あなたが示したコードはどの Access バージョンの db ファイルも作成しません。が既存の db ファイルへのパスでない場合db_file、そのコードは でエラーをスローしますconn.Open。不足している db ファイルは作成されません。

ただし、タイトルに VBA を含め、質問に vba のタグを付けたにもかかわらず、コードが VBA としてコンパイルされるとは思えません。本当に、Stack Overflow の質問に含める前に、少なくとも最初に試してみるべきでした。

于 2012-05-06T20:35:01.057 に答える
3

VB6/VBA コードから MDB ファイルを作成するには、ADOX. MDB ファイルを作成するサンプル関数を次に示します。

Public Function CreateMDB(strDBPath As String) As Boolean
'To make code compile add a reference to Microsoft ADO Ext 2.x for DDL and Security 
'(msADOX.dll)
Dim catDB As ADOX.Catalog
Dim tblNew As ADOX.Table
Dim keyPrim As New ADOX.Key

    Set catDB = New ADOX.Catalog

    If Dir(strDBPath) = "" Then
        CreateMDB = False
    End If

    With catDB
        .Create "Provider=Microsoft.Jet.OLEDB.4.0;Locale Identifier=" & _
            1033 & ";Data Source=" & strDBPath
        .ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & strDBPath
    End With

    Set tblNew = New ADOX.Table
    With tblNew
        .Name = "data"
        With .Columns
            .Append "Field_0", adVarWChar
            .Append "Field_1", adVarWChar
            .Append "Field_2", adVarWChar
            .Append "Field_3", adVarWChar
        End With
    End With
    catDB.Tables.Append tblNew

    Set keyPrim = New ADOX.Key
    With keyPrim
        .Name = "Field_0"
        .Type = adKeyPrimary
        .RelatedTable = "data"
        .Columns.Append "Field_0"
    End With
    catDB.Tables("data").Keys.Append keyPrim

    Set catDB = Nothing
    Set tblNew = Nothing

End Function
于 2012-05-07T04:51:55.797 に答える