2016-08-30 5 views
2

私は同じデータベース内の2つのテーブルのレコードを作成し、(最終的に)レコードを更新するために.accdbファイルとインターフェイスするVB.Netアプリケーションを開発中です。テーブルに新しい情報を書き込むことはできますが、問題が発生しているテーブルの同じ行に追加情報を追加/変更/追加しています。既存の行に更新を書き込むための私のコードは私の記事の一番下にあります。VB.NETの更新.accdbレコード

私がもっている最大の問題は、このサブルーチンを実行すると、エラーメッセージIErrorInfo.GetDescription failed with E_FAIL(0x80004005)objCmd.ExecuteNonQuery()に失敗することです。私はこことGoogleを使いこなし、さまざまな方法を試してみたり、物事を動かしたりして、何が欠けているのか分かりません。私が知る限り、私はSQLクエリで予約語を使用していません。 Elseステートメントの下のブロックは、新しい行を作成するために機能します(私のプログラムでは問題はありません)。おそらく、UPDATEコマンドの構文が異なるでしょうか?どんな助けや洞察も大変ありがとうございます。

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

'txtSerialNumber.Text'の値である' strcs'を使っているようです。また、@ JonathanAllenによると、動的SQL *を使用するべきではなく、 '... WHERE cameraSer = @ oneMoreParameter'を使用するべきです。 –

答えて

2

私はこのラインを推測:また

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

、使用Usingparametrized queries

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

は間違いですが、あなたは日付を使用していたこと

'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

ああ、私はあなたと@Gord Thompsonの両方が言いました間違った変数を使っているのを見ていないとは信じられません!私は仕事に着くとそれを交換して、それが私の問題を解決するかどうかを見ます。それをした – Alex

+0

。それはついに成功裏に書きました。どのような愚かな間違い。 Using関数に関する質問は、単にすべてのパラメータを呼び出すよりも優れた方法になりますか?私はこの機能を初めて見ました。 – Alex

+0

ブロックとパラメータ化されたクエリを使用することは、2つの異なることです。しかし、通常はそれらを使用する方が良いです。使用する理由[使用する](http://stackoverflow.com/a/75483/5897829)。パラメータ化されたクエリを使用する理由:私の答えのリンクを参照してください。 –

関連する問題