2014-05-23 75 views
0

這是我的第一個VB6應用程序。我的問題是,從窗體到Access數據庫沒有寫入數據的有用示例(包括當前日期&時間)。這是我的代碼,基於來自不同網站的所有研究成果。使用VB6將數據寫入MS Access

如果你不明白我的代碼或者它是錯誤的,請給我一個工作示例。

Private Sub Command1_Click() 

    Dim conConnection As New ADODB.Connection 
    Dim cmdCommand As New ADODB.Command 
    Dim rstRecordSet As New ADODB.Recordset 

    Dim logInId As Integer 
    Dim guardId As String 
    Dim studentId As String 
    Dim laptopName As String 
    Dim laptopBrand As String 
    Dim logInDate As Date 
    Dim logInTime As Date 

    guardId = Text2.Text 
    studentId = Text3.Text 
    laptopName = Text4.Text 
    laptopBrand = Text5.Text 
    logInDate = DateVal(Now) 
    logInTime = TimeVal(Now) 

    conConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _ 
     App.Path & "\" & "Database.accdb;Mode=Read|Write" 
    conConnection.CursorLocation = adUseClient 
    conConnection.Open 

    rstRecordSet.Open "laptopLoggedInLoggedOutInfo", conConnection 
    logInId = rstRecordSet.RecordCount 

    With cmdCommand 
     .ActiveConnection = conConnection 
     .CommandType = adCmdText 
     'f means field 
     .CommandText = "INSERT INTO laptopLoggedInLoggedOutInfo(f1,f2,f3,f4,f5,f6,f7) VALUES (?,?,?,?,?,?,?) " 

     .Prepared = True 
     .Parameters.Append .CreateParameter("f1", adInteger, adParamInput, , logInId + 1) 
     .Parameters.Append .CreateParameter("f2", adChar, adParamInput, 20, guardId) 
     .Parameters.Append .CreateParameter("f3", adChar, adParamInput, 20, studentId) 
     .Parameters.Append .CreateParameter("f4", adChar, adParamInput, 20, laptopName) 
     .Parameters.Append .CreateParameter("f5", adChar, adParamInput, 20, laptopBrand) 
     .Parameters.Append .CreateParameter("f6", adDate, adParamInput, , logInDate) 
     .Parameters.Append .CreateParameter("f7", adDate, adParamInput, , logInTime) 

     Set rstRecordSet = cmdCommand.Execute 
    End With 

    conConnection.Close 

    Set conConnection = Nothing 
    Set cmdCommand = Nothing 
    Set rstRecordSet = Nothing 

End Sub 
+0

當你運行你的代碼時會發生什麼? – Rob

回答

0

我在網上提出的意見對你的代碼:

Private Sub Command1_Click() 

雖然這不要緊,這個特殊的例子,一般不申報對象變量「如新」。手動實例化它會更好。實質上,每當您嘗試使用屬性或方法時,都會檢查「As New」聲明的變量,如果變量爲Is Nothing,則會創建一個新實例。這可能不一定是你想要的。

Dim conConnection As New ADODB.Connection 
    Dim cmdCommand As New ADODB.Command 
    Dim rstRecordSet As New ADODB.Recordset 

    Dim logInId As Integer 
    Dim guardId As String 
    Dim studentId As String 
    Dim laptopName As String 
    Dim laptopBrand As String 
    Dim logInDate As Date 
    Dim logInTime As Date 

    guardId = Text2.Text 
    studentId = Text3.Text 
    laptopName = Text4.Text 
    laptopBrand = Text5.Text 
    logInDate = DateVal(Now) 
    logInTime = TimeVal(Now) 

確保數據源子字符串指向您的Access數據庫。

conConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _ 
     App.Path & "\" & "Database.accdb;Mode=Read|Write" 
    conConnection.CursorLocation = adUseClient 
    conConnection.Open 

我看到你正在使用的記錄只是爲了logInId接收的記錄數。我真的不會用這個ID作爲ID。如果您從表格中刪除記錄,那麼您的ID將會變小。一般來說,如果您想要一個唯一的ID,您必須確保ID 總是增加

rstRecordSet.Open "laptopLoggedInLoggedOutInfo", conConnection 
    logInId = rstRecordSet.RecordCount 

我的建議是:使用「SELECT MAX(F1)的laptopLoggedInLoggedOutInfo」,和檢索的第一個值,以確保如果該值爲null,則返回零,例如

rstRecordSet.Open "SELECT MAX(logInId) FROM laptopLoggedInLoggedOutInfo", conConnection logInId = IIf(IsNull(rstRecordSet.Fields(0)), 0, IsNull(rstRecordSet.Fields(0)))

With cmdCommand 
     .ActiveConnection = conConnection 
     .CommandType = adCmdText 
     'f means field 

難道這些真的的字段名:F1,F2,F2等?我會很驚訝。用正確的字段名稱替換它們。

 .CommandText = "INSERT INTO laptopLoggedInLoggedOutInfo(f1,f2,f3,f4,f5,f6,f7) VALUES (?,?,?,?,?,?,?) " 

請注意,實際參數名稱f1,f2,f3等似乎無關緊要。這是INSERT語句中的順序。

 .Prepared = True 
     .Parameters.Append .CreateParameter("f1", adInteger, adParamInput, , logInId + 1) 
     .Parameters.Append .CreateParameter("f2", adChar, adParamInput, 20, guardId) 
     .Parameters.Append .CreateParameter("f3", adChar, adParamInput, 20, studentId) 
     .Parameters.Append .CreateParameter("f4", adChar, adParamInput, 20, laptopName) 
     .Parameters.Append .CreateParameter("f5", adChar, adParamInput, 20, laptopBrand) 
     .Parameters.Append .CreateParameter("f6", adDate, adParamInput, , logInDate) 
     .Parameters.Append .CreateParameter("f7", adDate, adParamInput, , logInTime) 

在使用下面的行時不要使用返回值。和INSERT語句沒有返回值:

 Set rstRecordSet = cmdCommand.Execute 

而是執行此操作:

 cmdCommand.Execute 

    End With 

    conConnection.Close 

你可能並不需要這些變量設置爲Nothing - VB會爲你,反正。但是,如果這樣做,通常是按照與創建相反的順序執行此操作的最佳做​​法。

Set conConnection = Nothing 
    Set cmdCommand = Nothing 
    Set rstRecordSet = Nothing 

End Sub 
0

使用ACE格式確實沒有太多優勢,只會限制可移植性。 MDB幾乎總是一個更好的主意。

你也有很多的代碼,這是最小的東西。並且不要忘記跳過數據庫路徑,您可以在連接字符串中使用撇號或引號。

使您的「f1」字段類型IDENTITY(「autonumber」)。

Private Sub Command1_Click() 
    Dim cn As ADODB.Connection 
    Dim cm As ADODB.Command 

    Set cn = New ADODB.Connection 
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" _ 
      & App.Path & "\Database.accdb';Mode=Read|Write" 
    Set cm = New ADODB.Command 
    With cm 
     .CommandType = adCmdText 
     'Assume "f1" is type IDENTITY ("Autonumber"). 
     .CommandText = _ 
       "INSERT INTO laptopLoggedInLoggedOutInfo(f2,f3,f4,f5,f6,f7) " _ 
       & "VALUES (?,?,?,?,?,?)" 
     Set .ActiveConnection = cn 
     'Seriously? Give those TextBoxes names! 
     .Execute , _ 
       Array(Text2.Text, Text3.Text, Text4.Text, Text5.Text, Date, Time()), _ 
       adExecuteNoRecords 
    End With 
End Sub