2

これは単純なものであることを願っています。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;

すべての助けに感謝します!

4

4 に答える 4

10

答えは 1 つだけです。パラメータ化されたクエリを使用してください。

これにはさまざまな理由があります。

したがって、ステートメントを次のように記述します。

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)

Time が DB に保存されていない場合は、次のようにすることができます。

SELECT * FROM Jobs WHERE JobDate = @p_Date

検索引数の場所dtpJobDate.Value.Date

于 2009-09-09T21:26:52.620 に答える
1

dtpJobDate.Value を試してください。

于 2009-09-09T21:28:53.613 に答える
1

他の回答の 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") + " + "'";
于 2009-09-09T21:29:34.547 に答える
0

まず第一に、あなたの例では 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...
        }
    }
}
于 2009-09-09T21:26:59.730 に答える