如何在c#中编写SQL查询以查找DateTime?

时间:2014-04-25 10:24:51

标签: c# mysql sql sql-server datetime

所以我在Windows窗体中创建了一个搜索功能,允许用户根据他们输入文本框的内容搜索记录。我有工作代码来查找基于每个过滤器的记录,但是DateTime一个。例如:

if (customerID_rb.Checked == true)
                {
                    sqlQuery = "SELECT CustomerID, CustomerName, Telephone, DateAndTime, Status, Description from Calls WHERE CustomerID = " + item;
                    //'item' is the text in the textbox
                    UsingCommand(conn, table, sqlQuery);
                    return table;
                }
private static void UsingCommand(SqlConnection conn, DataTable table, string sqlQuery)
    {
        using (SqlCommand cmd = new SqlCommand(sqlQuery, conn))
        {
            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                da.Fill(table);
        }

    }

这将显示包含用户在CustomerID列中输入文本的记录。

然而,我无法弄清楚如何对DateTime做同样的事情。我知道在SQL中你键入' WHERE' DateTime = ...'但无论我如何尝试重新编写查询字符串,我都无法让它工作。

我得到的错误是:' SqlException未处理:在预期条件的上下文中指定的非布尔类型的表达式,接近' DateAndTime'。

代码:

sqlQuery = "SELECT CustomerID, CustomerName, Telephone, DateAndTime, Status, Description from Calls WHERE DateTime DateAndTime  = '" + item +"'";

我已经尝试过使用和不使用DateTime以及多个不同的订单,如果有人可以帮助我,我将不胜感激!

由于

编辑:

好的......我搞砸了一下。我错误地认为你需要DateTime。但是,我可能已经被认为是因为如果输入错误的日期和时间,我会被抛出异常。谢谢! :)

3 个答案:

答案 0 :(得分:0)

你应该从不将参数连接成SQL字符串。

  • 让您容易受到SQL injection attacks的攻击。<​​/ p>

  • 它会产生性能问题,因为每个唯一值都会创建一个新的SQL查询,查询的哈希值不同,这会破坏查询引擎的执行计划缓存机制。

  • 对于日期值,y / m / d,d / m / y或m / d / y字符串格式的排序可能会有所不同,具体取决于当前的区域设置,操作系统全球化设置以及数据库服务器的全球化设置。如果他们并非所有同步,那么您可能会在1月3日误认为3月1日之后出现随机怪异。

相反,您应该 始终参数化您的查询! 查询获取值的占位符,然后使用单独的参数添加值。我不打算在这里给你一个例子,因为你需要花很少的时间自己搜索这个,而且这里已经有数百篇关于S.O的帖子了。

答案 1 :(得分:-1)

您不需要指定数据类型DateTime,只需编写带有列名的查询,如

sqlQuery = "SELECT CustomerID, CustomerName, Telephone, DateAndTime, Status, Description from Calls WHERE columnname = '" + item +"'";

答案 2 :(得分:-1)

一般来说,最好是添加sql参数,但是以字符串格式:

  " ...   WHERE DateAndTime = '" + item.ToString("yyyyMMdd") +"'"

yyyyMMdd在所有文化中都应该是安全的。 以上假设,您必须搜索日期,不包括时间。大多数时候只搜索大于或小于。 另外,如果日期字段本身包含时间,并且您只想搜索日期:

   "....   WHERE cast(DateAndTime as date)  = '" + item.ToString("yyyyMMdd") +"'"