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

只有一个答案:使用参数化查询

这是出于不同的原因:

  • 安全性(没有SQL 注入风险
  • 不再是您要打开主题的那些问题
  • 表现。

因此,这样写你的陈述:

SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate = @p_Date"
cmd.Parameters.Add ("@p_Date", SqlDbType.DateTime).Value = dtpJobDate.Value;

如果你想忽略时间,那么我认为最好的办法是进行范围搜索,如果时间存储在数据库中,那就是。像这样的东西(只是 SQL 查询):

SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate

StartDate 将是dtpJobDate.Value.Date, EndDate 将是dtpJobDate.Value.Date.AddDays(1)

如果时间没有存储在数据库中,那么你可以这样做:

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 回答