1

C# コードを使用して、日付値に関する mysql レコードのデータを検索する必要があります。C# で次のコードを使用していますが、レコードが見つかりません。私を助けてください。

私のC#コード:

Select distinct v.* from Ven v inner join Des d on v.venid=d.venid and cast( d.despdate as datetime) between  cast('" + dTime1.Value.ToString("dd-MMM-yyy") + "' as datetime) and cast('" + dTime2.Value.ToString("dd-MMM-yyy") + "'as datetime)

私のMysqlテーブルレコード:

ここに画像の説明を入力

4

3 に答える 3

2

最初から SQL クエリに値を直接含めようとすると、うまくいきません。パラメーター化された SQL を使用し、値を としてDateTime指定します。データベース テーブル日付/日時フィールドを使用していると仮定すると (そうあるべきです)、問題ありません。

次の 3 つの理由から、SQL に直接値を含めることは避ける必要があります。

  • 不適切な形式などを使用する可能性のある面倒な文字列変換が発生します。これが問題です。
  • SQL インジェクション攻撃を招いている
  • コードとデータが混在しているため、コードが読みにくくなり、データを確認しにくくなります

次のようなものが必要です。

string sql = @"Select distinct v.* from Ven v 
               inner join Des d on v.venid=d.venid 
               and cast(d.despdate as datetime) between @start and @end";
using (MySqlCommand command = new MySqlCommand(connection, sql))
{
    command.Parameters.AddWithValue("@start", startDateTime);
    command.Parameters.AddWithValue("@end", endDateTime);
    // Execute the command here
}

まだ適切なデータ型でない場合Des.despdate 、それを変更する必要があります...

于 2013-02-19T08:00:18.367 に答える
1

d.despdateDATE使用するように変換しますSTR_TO_DATE

SELECT  ...
FROM    ...
WHERE   STR_TO_DATE(d.despdate, '%d-%b-%Y') BETWEEN '2013-01-15' AND '2013-01-30'

パフォーマンスを向上させるために、MySQLCommandオブジェクトを使用してクエリをパラメーター化しました。元、

string connStr = "connection string here";
string query = @"SELECT ... 
                FROM... 
                WHERE STR_TO_DATE(d.despdate, '%d-%b-%Y') BETWEEN @date1 AND @date2"
using(MySqlConnection _conn = new MySqlConnection(connStr))
{
    using (MySqlCommand comm = new MySqlCommand())
    {
        comm.Connection = conn;
        comm.CommandText = query;
        comm.Parameters.AddWithValue("@date1", dTime1.Value);
        comm.Parameters.AddWithValue("@date2", dTime2.Value);
        try
        {
            conn.Open();
            comm.ExecuteNonQuery();
        }
        catch(MySqlException e)
        {
            // do something with
            // e.ToString()
        }
    }
}
于 2013-02-19T08:00:27.617 に答える
0

yyyy のはずです

 Select distinct v.* from Ven v inner join Des d on v.venid=d.venid and cast( d.despdate as datetime) between  cast('" + dTime1.Value.ToString("dd-MMM-yyyy") + "' as datetime) and cast('" + dTime2.Value.ToString("dd-MMM-yyyy") + "'as datetime)
于 2013-02-19T08:00:32.920 に答える