2016-08-30 117 views
2

我正在处理与.accdb文件接口的VB.Net应用程序,以创建和(最终)更新同一数据库中两个表上的记录。我能够向表中写入新信息没有任何问题,但它正在更新/更改/添加其他信息到我遇到问题的表中同一行。我写的更新到现有的行的代码是在我的文章的底部。VB.NET更新.accdb记录

我遇到的最大问题是,在执行此子程序后,它在objCmd.ExecuteNonQuery()上失败,并显示错误消息IErrorInfo.GetDescription failed with E_FAIL(0x80004005)。我已经在这里和谷歌梳理,尝试不同的方法和移动的东西,我无法弄清楚我错过了什么。据我所知,我没有在我的SQL查询中使用任何保留字。 Else语句下的块可用于创建新行(我的程序的那一侧没有问题),也许语法与更新命令不同?任何帮助/见解非常感谢。

Private Sub WriteToDatabase() 
    strcs = txtSerialNumber.Text 
    strOrderType = orderType 
    strPoRMA = txtPoRMA.Text 
    strtech = cboTech.Text 
    strDate = calendarTest.SelectionStart 

    'Write to database if Production 
    If strOrderType = "PO" Then 
     'Check database for duplicate record 
     strSQL = "SELECT * FROM [New Camera Database] WHERE cameraSer=" & strcs 
     objCmd = New OleDbCommand(strSQL, dbconn) 
     dr = objCmd.ExecuteReader 
     dr.Read() 

     If dr("calCompleteDate").ToString <> "" Then 
      MsgBox("Camera S/N " & strcs & " completed " & dr("calCompleteDate") & ". Use Lookup to reprint Cert. of Compliance", vbOK + vbExclamation, 
       "Camera S/N " & strcs & " already completed") 
      exitFlag = True 
     Else 
      'Write to New Camera Database Table 
      strSQL = "UPDATE [New Camera Database] SET [email protected] , [email protected], [email protected] WHERE cameraSer=" & strcs 
      objCmd = New OleDbCommand(strSQL, dbconn) 
      objCmd.Parameters.AddWithValue("@poNum", strPoRMA) 
      objCmd.Parameters.AddWithValue("@calCompleteDate", strcs) 
      objCmd.Parameters.AddWithValue("@calCompleteTech", strtech) 
      objCmd.ExecuteNonQuery() 

      'Write to up2DateTravelers Table 
      strSQL = "UPDATE up2DateTravelers SET poRMANum = @poRMANum, calCompleteDate = @calCompleteDate, calCompleteTech = @calCompleteTech WHERE cameraSer=" & strcs 
      objCmd = New OleDbCommand(strSQL, dbconn) 
      objCmd.Parameters.AddWithValue("@poRMANum", strPoRMA) 
      objCmd.Parameters.AddWithValue("@calCompleteDate", strcs) 
      objCmd.Parameters.AddWithValue("@calCompleteTech", strtech) 
      objCmd.ExecuteNonQuery() 
     End If 
    ElseIf strOrderType = "RMA" Then 
     'Create new functions, userform, etc (TBD) 
    End If 
    btnClear.PerformClick() 
End Sub 
+0

不知道为什么Else下面的代码块看起来像是被注释过(红色),因为它不在我的程序中。与外部相同End If和btnClear.PerformClick() – Alex

+0

可能的SQL注入攻击:'cameraSer =“&strcs' –

+3

看起来您正在使用'strcs',它是'txtSerialNumber.Text'的值并尝试使用它作为日期('calCompleteDate')在你的UPDATE语句中。另外,正如@JonathanAllen所说,你不应该使用*动态SQL *;你应该使用'... WHERE cameraSer = @ oneMoreParameter'。 –

回答

2

我想这行:

objCmd.Parameters.AddWithValue("@calCompleteDate", strcs) 

是一个错误,那你想使用日期:

objCmd.Parameters.AddWithValue("@calCompleteDate", strDate) 

此外,使用Usingparametrized queries

'Write to New Camera Database Table 
strSQL = "UPDATE [New Camera Database] SET [email protected] , [email protected], [email protected] WHERE [email protected]" 
Using objCmd As New OleDbCommand(strSQL, dbconn) 
    objCmd.Parameters.AddWithValue("@poNum", strPoRMA) 
    objCmd.Parameters.AddWithValue("@calCompleteDate", strDate) 
    objCmd.Parameters.AddWithValue("@calCompleteTech", strtech) 
    objCmd.Parameters.AddWithValue("@cameraSer", strcs) 
    objCmd.ExecuteNonQuery() 
End Using 

'Write to up2DateTravelers Table 
strSQL = "UPDATE up2DateTravelers SET poRMANum = @poRMANum, calCompleteDate = @calCompleteDate, calCompleteTech = @calCompleteTech WHERE [email protected]" 
Using objCmd As New OleDbCommand(strSQL, dbconn) 
    objCmd.Parameters.AddWithValue("@poRMANum", strPoRMA) 
    objCmd.Parameters.AddWithValue("@calCompleteDate", strDate) 
    objCmd.Parameters.AddWithValue("@calCompleteTech", strtech) 
    objCmd.Parameters.AddWithValue("@cameraSer", strcs) 
    objCmd.ExecuteNonQuery() 
End Using 
+0

哦,jeez,我不敢相信我没有看到我在使用你和@Gord Thompson提到的错误变量!一旦我开始工作,我会交换出来,看看是否能解决我的问题。 – Alex

+0

它做到了。它终于写成功了。多么愚蠢的错误。关于使用函数的问题,是什么让它成为比调用所有参数更好的做法?这是我第一次看到这个功能。 – Alex

+0

使用块和参数化查询是两件不同的事情。但通常使用它们会更好。使用[使用]的原因(http://stackoverflow.com/a/75483/5897829)。使用参数化查询的原因:请参阅我的答案中的链接。 –