所以我在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。但是,我可能已经被认为是因为如果输入错误的日期和时间,我会被抛出异常。谢谢! :)
答案 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") +"'"