2016-08-30 114 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)。使用參數化查詢的原因:請參閱我的答案中的鏈接。 –