2014-05-23 74 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