0

私はこの問題に数日間苦労してきましたが、次のコードの何が問題なのかを見つけることができませんでした。更新するボタンをクリックしても、何も更新されません。ところで、HTML テーブルを使用して顧客の情報を表示し、テーブル内のテキスト ボックスを使用してフィールドを更新しています。しかし、SQL Update ステートメントは機能していません。コードは次のとおりです。

Protected Sub btnUpdate_Click(sender As Object, e As System.EventArgs) Handles btnUpdate.Click

    Dim myConnection As OleDbConnection 

    Dim myCommand As OleDbCommand  

    Dim ID As Integer 

    Dim mySQLString As String, strFirstName As String, strLastName As String, strPhone As String, strEmail, strComment As String, Employee As String, DateCalled, TimeCalled, DateEdited As datetime 

    myConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\wfccdb\datagridview\app_data\t3corp.mdb;")  

    myConnection.Open()  

    ID = Request.QueryString.Item("r") 

    Employee = tbEMP.Text  

    strFirstName = tbFname.Text

    strLastName = tbLname.Text

    strPhone = tbPhone.Text 

    strEmail = tbEmail.Text 

    DateCalled = Convert.ToDateTime(tbDateCalled.Text)  
    TimeCalled = Convert.ToDateTime(tbTimeCalled.Text)  
    strComment = tbComment.Text  
    DateEdited = Now

    mySQLString = "UPDATE customers SET Employee='" + Employee + "', FirstName='" + strFirstName + "', LastName='" + strLastName + "', Phone='" + strPhone + "', Email='" + strEmail + "', DateCalled='" + DateCalled + "', " + _
    "TimeCalled='" + TimeCalled + "', Comment='" + strComment + "', DateEdited='" + DateEdited + "' WHERE ReferenceID=" & Val(ID) & "" 

    myCommand = New OleDbCommand  

    myCommand.Connection = myConnection

    myCommand.CommandText = mySQLString

    myCommand.ExecuteNonQuery()
    myConnection.Close()



    Response.Redirect("ViewEditRecords.aspx?r=" + Request.QueryString.Item("r"))


End Sub 
4

2 に答える 2

1

まず、パラメータ化されたクエリを使用する必要があります。これは、SQL インジェクションに対して脆弱です。

そうは言っても、少なくともDateTimeフィールドに問題があると思います-MS Access DateTimeフィールドを挿入する適切な方法は#Date#を使用する必要があります-クエリはそれらを文字列として挿入していますが、これは機能しませんアクセス。

また、フィールドにアポストロフィが含まれていると、これも壊れます。これは、パラメーター化されたクエリを使用するもう 1 つの理由です。

これが少し役立つことを願っています。

幸運を。

于 2013-01-25T00:06:31.090 に答える
1

更新 SQL 文字列にいくつかの問題が含まれています。最初から始めましょう。

mySQLString = "UPDATE customers SET Employee='" + Employee + "', FirstName='" + strFirstName + "', LastName='" + strLastName + "', Phone='" + strPhone + "', Email='" + strEmail + "', DateCalled='" + DateCalled + "', " + _
"TimeCalled='" + TimeCalled + "', Comment='" + strComment + "', DateEdited='" + DateEdited + "' WHERE ReferenceID=" & Val(ID) & "" 

まず、DateCalled、TimeCalled、DateEdited を割り当てようとしている 3 つの日付/時刻値に注意してください。Access テーブルの実際の日付値であると想定しています。この場合、列の更新ステートメントを次のように作成する必要があります。

".... DateCalled=#" + tbDateCalled.Text + "# ...."

(日付の値を # で囲む必要があります)。TimeCalled に対してもこれを行います。

では、あなたの を見てください"' WHERE ReferenceID=" & Val(ID) & ""VAL関数の動作を確認すると、文字列を数値に変換するという逆の動作をしています。したがって、あなたの場合、使用する必要があります(必要& ""がないため、ドロップします):

"' WHERE ReferenceID=" & CStr(ID)

最後に、 を呼び出した後にエラー文字列を確認してくださいmyCommand.ExecuteNonQuery()。Accessがエラーの内容を教えてくれると確信しています

したがって、sgeddes からの提案を組み込むには、最終的な SQL 文字列は次のようになります。

Employee = Replace(Employee, "''", "'")
Employee = Replace(Employee, "'", "''")
Do this for first name, last name, phone, comment and email to minimise the threat of SQL injections

mySQLString = "UPDATE customers SET Employee='" & Employee & "', FirstName='" & strFirstName & "', LastName='" & strLastName & "', Phone='" & strPhone & "', Email='" & strEmail & "', DateCalled=#" & tbDateCalled.Text & "#, " + _
"TimeCalled=#" & tbTimeCalled.Text & "#, Comment='" & strComment & "', DateEdited=Now() WHERE ReferenceID=" & CStr(ID)
于 2013-01-25T00:09:07.087 に答える