datetimepickerを使用したSQLステートメント
-
05-07-2019 - |
質問
これは単純なものであることが望まれます。 Windowsフォームで日時ピッカーを使用する場合、次のようにSQLステートメントを実行する必要があります。
string sql = "SELECT * FROM Jobs WHERE JobDate = '" + dtpJobDate.Text + "'";
残念ながら、JobDateフィールドはDateTime値として保存されているため、これは実際には結果を提供しません。保存されている時間に関係なく、この日付のすべてのレコードを検索できるようにしたいのですが、ヘルプが必要ですか?
新しいクエリ:
SqlDataAdapter da2 = new SqlDataAdapter();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate";
cmd.Parameters.Add ("@p_StartDate", SqlDbType.DateTime).Value = dtpJobDate.Value.Date;
cmd.Parameters.Add ("@p_EndDate", SqlDbType.DateTime).Value = dtpJobDate.Value.Date.AddDays(1);
cmd.Connection = conn;
da2.SelectCommand = cmd;
da2.Fill(dt);
dgvJobDiary.DataSource = dt;
すべてのヘルプに感謝します!
解決
1つの答え:パラメーター化されたクエリ。
これにはさまざまな理由があります:
- セキュリティ( SQLのリスクなし 注射
- トピックを開いている問題がなくなりました
- パフォーマンス。
したがって、次のようにステートメントを記述します。
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate = @p_Date"
cmd.Parameters.Add ("@p_Date", SqlDbType.DateTime).Value = dtpJobDate.Value;
時間を無視したい場合、最善の方法は、時間をDBに保存する場合、範囲検索を行うことです。 次のようなもの(SQLクエリのみ):
SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate
StartDateは dtpJobDate.Value.Date
になり、EndDateは dtpJobDate.Value.Date.AddDays(1)
時刻がDBに保存されていない場合、これを行うことができます:
SELECT * FROM Jobs WHERE JobDate = @p_Date
検索引数は dtpJobDate.Value.Date
他のヒント
dtpJobDate.Valueを試してください。
他の回答のSQLインジェクション以外に、次のようなものを使用できます。
dtpJobDate.Value.ToString("yyyyMMdd HH:mm:ss");
ただし、おそらく正確な時間に一致するものは見つからないため、クエリを次のように変更できます
string sql = "SELECT * FROM Jobs WHERE JobDate BETWEEN '" + dtpJobDateStart.Value.ToString("yyyyMMdd HH:mm:ss") + "' AND '" + + dtpJobDateEnd.Value.ToString("yyyyMMdd HH:mm:ss") + " + "'";
まず、この例ではSQLインジェクションのドアを開いたままにしています。
それ以外-質問に答えるには、JobDate列から時間を削除して一致を取得する必要があります。このようなものを試してください(比較のためにサンプルにSQLインジェクションコードが残っています)...
string sql = "SELECT * FROM Jobs WHERE CAST(CONVERT(CHAR(8), JobDate, 112) AS DATETIME) = '" + dtpJobDate.Text + "'";
クエリをパラメータ化する場合、次のようにすることができます...
using (var conn = new SqlConnection(myConnectionString))
using (var cmd = new SqlCommand("SELECT * FROM Jobs WHERE JobDate = @JobDate", conn))
{
cmd.Parameters.Add(new SqlParameter("@JobDate", dtpJobDate.Value));
conn.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// your code here to deal with the records...
}
}
}