如何在c#中编写SQL查询来查找DateTime
本文关键字:查询 SQL 查找 DateTime | 更新日期: 2023-09-27 17:59:58
因此,我在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。然而,我可能会有这样的想法,因为如果我输入了错误的日期和时间,就会出现异常。谢谢!:)
您应该永远不要将参数连接到SQL字符串中。
-
它使您容易受到SQL注入攻击。
-
它会产生性能问题,因为每个唯一的值都会创建一个新的SQL查询,该查询具有不同的哈希,这会破坏查询引擎的执行计划缓存机制。
-
对于日期值,y/m/d、d/m/y或m/d/y字符串格式的顺序可能会有所不同,具体取决于当前区域性设置、操作系统全球化设置和数据库服务器的全球化设置。如果它们不是所有都同步,那么你可能会出现随机的奇怪情况,比如把1月3日误认为3月1日。
相反,您应该始终参数化您的查询查询获取值的占位符,然后使用单独的参数添加值。我不打算在这里给你举一个例子,因为你自己搜索这个需要很少的时间,而且在S.O.上已经有数百条关于这个的帖子了
您不需要指定数据类型DateTime
,只需像一样使用列名编写查询即可
sqlQuery = "SELECT CustomerID, CustomerName, Telephone, DateAndTime, Status, Description from Calls WHERE columnname = '" + item +"'";
一般来说,最好添加sql参数,但采用字符串格式:
" ... WHERE DateAndTime = '" + item.ToString("yyyyMMdd") +"'"
yyyyMMdd应该在所有区域性中都可以安全使用。以上是假设,您必须搜索一个日期,不包括时间。大多数时间只在上搜索大于或小于。另外,如果日期字段本身包含时间,并且您只想搜索日期:
".... WHERE cast(DateAndTime as date) = '" + item.ToString("yyyyMMdd") +"'"