1

以下は、私の C# Windows アプリケーションで使用されている MS sql-server ステートメントです。タイトルが示すように、テキスト ボックスの日付の間にあるすべての製品番号が選択されます。私は SQL にかなり慣れていないので、私の試みは残虐行為かもしれません。SQLはそう考えているようです。

string strSQL = "SELECT * FROM HISTORY ORDER BY productNumber WHERE (@strt_date >= '" + Convert.ToDateTime(KHDate1Box.Text) + "' and @end_date <= '" + Convert.ToDateTime(KHDate2Box.Text) + "')";

SQL エラー メッセージ:「キーワード 'WHERE' 付近の構文が正しくありません。」

4

4 に答える 4

4
string strSQL = "SELECT * FROM HISTORY ORDER BY productNumber WHERE (@strt_date >= '" + Convert.ToDateTime(KHDate1Box.Text) + "' and @end_date <= '" + Convert.ToDateTime(KHDate2Box.Text) + "')";

これは、WHERE 句が前に来る必要があるためです。 ORDER BY

string strSQL = "SELECT * FROM HISTORY WHERE (@strt_date >= '" + Convert.ToDateTime(KHDate1Box.Text) + "' and @end_date <= '" + Convert.ToDateTime(KHDate2Box.Text) + "' ORDER BY productNumber)"  ;
于 2012-10-04T21:02:27.593 に答える
3
"    SELECT * FROM HISTORY 
    WHERE (@strt_date >= '" + Convert.ToDateTime(KHDate1Box.Text) + "' and @end_date <= '" + Convert.ToDateTime(KHDate2Box.Text) + "')
    ORDER BY productNumber "

order by は where 句の後に続きます

于 2012-10-04T21:02:27.233 に答える
1

@strt_dateand @end_date(T-SQL 変数) を列名として使用していることに気付きました。また、句は句のにあるORDER BY必要があります。WHERE


余談ですが、この方法でクエリをコーディングしてはならない理由はさまざまです。非常に目を見張るようなセキュリティ問題に対する Google の「SQL インジェクション」。

代わりに、パラメーター化されたクエリを使用してください。これらはより安全で、値フィールドの無効な文字によって引き起こされる構文エラーが発生しにくくなっています。

http://www.csharp-station.com/Tutorial/AdoDotNet/lesson06

于 2012-10-04T21:04:45.313 に答える
1

日付のみの場合、特に検証した場合、SQL インジェクションの可能性はあまりありません。

日付を文字列として SQL Server に渡す必要がある場合は、明確な YYYYMMDD 形式にする必要があります。しかし、入力の検証も日付として追加します。

そのステートメントの前にこれを持ってください

CultureInfo provider = CultureInfo.InvariantCulture;

次に、それをに変更します

string strSQL = "SELECT * FROM HISTORY ORDER BY productNumber WHERE (@strt_date >= '" +
  DateTime.ParseExact(KHDate1Box.Text, "d", provider).ToString("yyyyMMdd")
  + "' and @end_date <= '" +
  DateTime.ParseExact(KHDate2Box.Text, "d", provider).ToString("yyyyMMdd") + "')";

日付の解析に失敗したことによるエラーをキャッチします。

参考:「d」を使用しましたが、標準の日時形式のリストは次のとおりです

于 2012-10-04T21:22:53.720 に答える