1

textbox.text から取得した日付を使用してクエリを実行する DB テーブルに日付列があります。ユーザーは、カレンダーから dd/MM/yyyy の形式で日付を選択します。その日付を使用してクエリを実行したいと考えています。データベースにクエリを実行できるように日付をフォーマットするにはどうすればよいですか?

  Dim datefrom As String =txtDateFrom.Text
  Dim dateto As String =txtDateTo.Text

クエリは次のようになります。

  WHERE (tblClient.ClientID = " & ClientID & ") AND (tblBackupArchive.BackupDate BETWEEN '" + datefrom + "' AND '" + dateto + "')"

私はMS SQL Serverを使用しています。どんな助けでも大歓迎です。

ジョンジー

4

2 に答える 2

7

クエリを作成するために、そのような文字列連結を使用しないでください!!!

はい、私は大声で叫ぶつもりでした. 日付テキスト ボックスの 1 つに次のようなものが入力された場合、現在のコードで何が起こるか想像してみてください。

';DROP TABLE tblClient;--

代わりに、パラメーター化されたクエリを使用してください。これにより、日付の問題が修正され、SQL インジェクション攻撃から保護されます。次に例を示します。

Dim sql As String = " .... WHERE tblClient.ClientID= @ClientID AND tblBackupArchive.BackupDate >= @DateFrom AND tblBackupArchive.Backupdate < @DateTo"

Using cn As New SqlConnection("your connection string here"), _
      cmd As New SqlCommand(sql, cn)

    cmd.Parameters.Add("@ClientID", SqlDbType.Int).Value = ClientID
    cmd.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = DateTime.Parse(txtDateFrom.Text)
    cmd.Parameters.Add("@DateTo", SqlDbType.DateTime).Value = DateTime.Parse(txtDateTo.Text).AddDays(1)

    cn.Open()

    cmd.Execute___()

End Using

これは、SQL ステートメントを次のように実行したかのように考えることができます。

DECLARE @ClientID Int
DECLARE @DateFrom DateTime
DECLARE @DateTo DateTime

Set @ClientID = ImaginaryFunctionToGetQueryData('ClientID')
Set @DateFrom = ImaginaryFunctionToGetQueryData('DateFrom')
Set @DateTo   = ImaginaryFunctionToGetQueryData('DateTo')

SELECT ... 
FROM ... 
WHERE tblClient.ClientID= @ClientID 
    AND tblBackupArchive.BackupDate >= @DateFrom 
    AND tblBackupArchive.Backupdate < @DateTo

そのコードの "ImaginaryFunction" は、sp_executesql ストアド プロシージャを使用して実現されますが、ポイントは、SQL サーバーから見たクエリ文字列がデータをクエリ文字列に直接置き換えることは決してないということです。コードはコードであり、データはデータであり、2 つが一致することはありません。

于 2010-04-16T14:22:38.607 に答える
1

ジョエルの答えへの追加として....

式に文字列を使用することはまったく避けたいと思います。IE; テキストボックスを使用して日付を保存しないでください。適切なカレンダーまたは日時ピッカーを使用してください。

この方法では、これを行う必要はありません。

cmd.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = DateTime.Parse(txtDateFrom.Text)

ジョエルが示唆するように、代わりにあなたはただ行うことができます。

cmd.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = dtDateFrom.value

このようにして、実際に文字列から正しい形式を選択する DateTime.parse に依存しません。また、日付型のみを使用します。

于 2010-04-16T15:43:22.890 に答える