2

MySQL Web サイトの .net 用の mysql コネクタを使用して、C# から MySQL (バージョン 5.5.27) へのクエリを実行しようとしています。

私が開発している .dll の最終的な目標は、読み取った行を追跡することです。

データベースの読み取りに使用するクエリは次のとおりです。

string strSQL = "SELECT date,ask,bid,volume FROM gbpjpy where `read` = 0";

日付を読むために、私は持っています:

DateTime dateTime = mysqlReader.GetDateTime(0);

それはうまくいきます。

テーブルには 5 つの列があり、最後の列は「読み取り」と呼ばれます。選択クエリと解析が完了した直後に、次のクエリを実行します。

string sqlFormattedDate = dateTime.ToString("yyyy/MM/dd HH:mm:ss");
string query = "UPDATE gbpjpy SET `read` = 1 WHERE `date` = " + sqlFormattedDate;

ただし、ログを確認すると、次のエラーがあります。

SQL 構文にエラーがあります。1 行目の '01:20:08' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

読み込まれた最初の日付は 2012/08/30 01:20:08 です (これが MySQL テーブルに表示される方法であり、01:20:08 を取得する場所です)。

私は var sqlFormattedDate を試し、ToString オーバーロードを yyyy-MM-dd (スラッシュではなくダッシュを使用) に変更し、dateTime.ToString() をすべて無駄にしました。

MySQL が文字列全体を取得しないのはなぜですか?

4

3 に答える 3

5

基本的に、クエリに直接値を含めることは避けるべきです。

間違いなく、値を引用符で囲むことができます...しかし、そうすべきではありません。代わりに、パラメータ化された SQL を使用して、値をパラメータに入れる必要があります。そうすれば、エラーが発生しやすい文字列変換を回避し、(文字列パラメーターに対する) SQL インジェクション攻撃を回避し、コードをデータから分離できます。

(これがいかに微妙に壊れているかの例として、現在のコードは「現在のカルチャ」の日付と時刻の区切り文字を使用/します:CultureInfo.InvariantCultureまったく変換を行います。)

使用しているタイプ (例: ) のParametersプロパティのドキュメントを探してください。うまくいけば例が得られます。パラメーター化された SQL のドキュメントには、チュートリアルのセクションさえあるかもしれません。たとえば、このページはあなたが求めているものかもしれません。CommandMySqlCommand.Parameters

于 2012-08-30T10:49:44.903 に答える
0

日付の値全体を引用符で囲む必要があると思います。実際にクエリを連結すると、次のようになります

UPDATE gbpjpy SET `read` = 1 WHERE `date` = yyyy/MM/dd HH:mm:ss

その等号は、最初のスペースまでの値しか取りません。

代わりに、次のようになります

UPDATE gbpjpy SET `read` = 1 WHERE `date` = 'yyyy/MM/dd HH:mm:ss'

これがこの場合の特定の理由ですが、このようにクエリを連結すると、 SQL インジェクションが実際に発生する可能性があります。原則として、それを行うべきではありません。パラメータ化されたクエリを使用できます。おそらく、それを行うために使用している .NET コネクタの API があります。

于 2012-08-30T10:50:38.260 に答える