3

私は次のMySqlCommandを持っています:

Dim cmd As New MySqlCommand
cmd.CommandText = "REPLACE INTO `customer` VALUES( ?customerID, ?firstName, ?lastName)"

With cmd.Parameters
 .AddWithValue("?customerID", m_CustomerID)
 .AddWithValue("?firstName", m_FirstName)
 .AddWithValue("?lastName", m_LastName)
End With

MySqlCommandsの実行を処理するクラスがあり、すべてのクエリをファイルに記録するようにしたいと思います。次のコマンドで実行されているクエリ/コマンドを取得できます。

cmd.CommandText

ただし、これは、パラメーター(?customerID、?firstNameなど)を含む元のCommandTextを返すだけであり、 AddWithValue関数によって追加された実際の置換値は返しません。実行された実際の「最終」クエリを確認するにはどうすればよいですか?

4

6 に答える 6

3

私は次のことをしました:

dim tmpstring as string = MySqlCommand.CommandText
For each p as MySqlParameter in MySqlCommand.parameters
    tmpstring = tmpstring.replace(p.ParameterName, p.Value)
Next

これはあなたが必要とするすべてを出力するようです

于 2013-05-22T14:44:20.670 に答える
1

私はこれのための方法を見たことがありません。

そして、いずれの場合でも、準備されたステートメントは?customerID、?firstnameパラメーターを使用してサーバーに送信され、次に実際のパラメーターが個別に送信されます-mysqlドライバーは、実行した場合のように最終的なSQLクエリを構築しませんプリペアドステートメントは使用しないでください。

于 2009-08-30T22:19:14.047 に答える
1

使用しているパラメーター化されたメソッドは、SQLインジェクションを防ぐのに問題がないはずです。

.AddWithValue("?customerID", m_CustomerID)

m_CustomerIDにテキストが含まれている場合

ハハ私はあなたのデータを盗んでいます。テーブルをドロップします。

そうすれば、サーバー上で実行されることはありません。あなたのAddWithValueためにそれを整理します。

実際に実行されたクエリについては、有効になっている場合は、クエリログから取得できるはずです。

于 2009-09-17T11:39:04.833 に答える
0

自分で作成する必要があります。

パラメータは、文字列に挿入されてからSQLステートメントとして実行されるだけではありません。RDBMSは実際にSQLを準備し、必要に応じてパラメーター値を使用します。したがって、サーバーに送信されるSQLステートメントは1つではありません。SQLがどうなるかを確認するには、次のことを行う必要があります。

Console.WriteLine("REPLACE INTO `customer` VALUES('" & m_CustomerID & _
    "', '" & m_FirstName & "', '" & m_LastName & "')")
于 2009-08-30T22:16:28.483 に答える
0

私にも同じ必要があります。

私が読んだところによると、クエリテキストはクライアントのパラメータ値と組み合わされていません-それらはそのためにサーバーに送信されます。

サーバーに実際に送信されているクエリを調べるために、mysqldロギングを使用しました。私のバージョンのMySQLでは、次のエントリをmy.cnfに追加しました。

log=queries.txt

次に、コマンドテキストとパラメーターを組み合わせた効果を明確に確認できました。私の場合、mysqldを再起動した後、単体テストを実行してから、querys.txtファイルを開きました。

HTH!

于 2011-02-10T20:21:50.653 に答える
0

.NETアプリケーションからのログ記録を自分で管理する場合は、SQLインジェクションを回避するために、パラメーターを指定してMySqlCommandクラスを引き続き使用することをお勧めします。ただし、CommandTextをログに記録するときは、Parametersコレクションをループして、名前/タイプ/値でそれぞれをログに記録します。

于 2011-02-12T17:13:58.237 に答える