私は同じデータベース内の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
私のプログラムではないので、Elseの下のコードブロックがコメント(赤い)のように見える理由はわかりません。外側のEnd IfおよびbtnClear.PerformClick()と同じです。 – Alex
SQLインジェクション攻撃の可能性があります: 'cameraSer ="&strcs' –
'txtSerialNumber.Text'の値である' strcs'を使っているようです。また、@ JonathanAllenによると、動的SQL *を使用するべきではなく、 '... WHERE cameraSer = @ oneMoreParameter'を使用するべきです。 –