0

これで MySQL データベースのデータが削除されないのはなぜですか!?

Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click

 Dim dbCon As MySqlConnection      
 Dim strQuery As String = ""           
 Dim SQLCmd As MySqlCommand            
 Dim DR As MySqlDataReader            
 Try               
 dbCon = New MySqlConnection("Server=Localhost;Database=myusers;Uid=root;Pwd=Mypassword")

        strQuery = "DELETE settings FROM settings WHERE user=" & Me.loginuser.Text
        '* FROM settings WHERE user = "Testuser"'
        SQLCmd = New MySqlCommand(strQuery, dbCon)

        ' OPEN THE DB AND KICKOFF THE QUERY 
        dbCon.Open()

        DR = SQLCmd.ExecuteReader

        While DR.Read
            req1.Text = "" And exlink.Text = ""
        End While

        ' DONE! Close DB
        DR.Close()
        dbCon.Close()
    Catch ex As Exception
        TextBox8.Text = ("Fail" & vbCrLf & vbCrLf & ex.Message)
    End Try

これが私のデータベースの写真です:

ここに画像の説明を入力

または、データベースに既にあるものを何らかの形で置き換えることもできます。その場合は、それを手伝ってください。

4

3 に答える 3

1

この方法でコードを変更しようとします

Using con = New MySqlConnection("Server=.....")
     con.Open()
     Dim sqlText = "DELETE * FROM settings WHERE user = @ulogin"
     Using cmd = new MySqlCommand(sqlText, con)
        cmd.Parameters.AddWithValue("@ulogin",  Me.loginuser.Text)
        cmd.ExecuteNonQuery()
     End Using
End Using

何よりもまず、データベース エンジンに渡すコマンド テキストを作成するために文字列連結を使用しないでください。そのようにして、 Sql インジェクションの危険にさらされます。また、ユーザー名に一重引用符が含まれている場合 (O'Hara など)、コードは構文エラーで失敗します (日付の書式設定、数値の小数の解析、およびその他のグローバリゼーションの問題についても同じ問題が発生します)。代わりに、上記のコードのようなパラメーター化されたクエリを使用すると、これらの問題をすべて回避できます。

パラメーター化されたクエリでは、クエリのテキストに、検索条件の実際の値や、データの更新または挿入が含まれていません。代わりに、プレースホルダーが含まれています (この場合は @ulogin と呼ばれます)。MySqlParameterプレースホルダの位置に挿入する正しい値は、 の Parameters コレクションに追加された1 つ以上を使用して指定されますMySqlCommand。この場合、値のデータ型から正しいデータ型を直接導出する AddWithValue メソッドを使用しました。は文字列値であるためMe.loginuser.Text、パラメータは文字列値として扱われ、不適切な一重引用符が置き換えられ、SQL インジェクション攻撃のマウントに通常使用される余分な文字が削除されます。エンジンは、実行時にプレースホルダーに正しい値を挿入して残りを行います

編集:使用されているMySqlコネクタに関するコメントを見て、回答を更新して、NET 1の半同等バージョンを表示しようとします.

Try
     Dim con As MySqlConnection = New MySqlConnection("Server=.....")
     con.Open()
     Dim sqlText as String = "DELETE * FROM settings WHERE user = @ulogin"
     Dim cmd As MySqlCommand = new MySqlCommand(sqlText, con)
     Dim par As MySqlParameter = New MySqlParameter("@ulogin", MySqlDbType.VarChar)
     par.Value = Me.loginuser.Text
     cmd.Parameters.Add(par)
     cmd.ExecuteNonQuery()
Finally
     con.Close()
End Try

コネクタ 1.0.10 が@プレフィックス付きのパラメーター名をサポートするのか、:プレフィックスのみをサポートするのかわかりません

于 2013-03-23T13:20:46.613 に答える
1

試す

strQuery = "DELETE FROM settings " _
         & " WHERE user = '" & Me.loginuser.Text & "'"

ただし、前述のように、パラメーター化されたクエリを使用する必要があります。O'Brien という名前のユーザーがいる場合、単一引用符が埋め込まれているため、クエリ (上記で作成したもの) は失敗します。DELETE を使用すると、レコード全体が削除され、FROM 句でテーブル名が既に指定されています。

于 2013-03-23T14:15:33.387 に答える
0

mysql で二重引用符を使用できるとは思いません。単一引用符のみだと思います。試す

Query = "DELETE * FROM settings WHERE user = '" & Me.loginuser.Text & "'"
于 2013-03-23T12:52:32.267 に答える