【问题标题】:Passing datetimepicker value to WHERE LIKE clause in C#将 datetimepicker 值传递给 C# 中的 WHERE LIKE 子句
【发布时间】:2017-07-21 18:01:44
【问题描述】:

我有这个查询字符串说明如下。

SqlComm.CommandText = "SELECT * FROM MyDataTable WHERE (DataDate LIKE @SDataDate)";

SqlComm.Parameters.AddWithValue("@SDataDate", dtpSrcDataDate.Value.ToString());

SqlComm.CommandText = "SELECT * FROM MyDataTable WHERE DataDate LIKE" + 
dtpSrcDataDate.Value;

以上两个语句不起作用。

当我尝试第一个语句时,datagridview 显示一个空的。

当我尝试第二条语句时,出现错误消息:

在预期条件的上下文中指定的非布尔类型表达式,靠近“LIKE7”

我无法解决这个问题。

请帮忙。

【问题讨论】:

  • 将 LIKE 运算符应用于 DateTime 列是什么意思?
  • 是的,如果您使用日期值,LIKE 也可能是 = 在这里。否则,您将需要一个范围。您在第二个语句的末尾缺少一个空格,因此当您将值直接连接到 LIKE 时,将永远无法正确执行。贴一些示例数据和表结构,你会得到更好的响应。

标签: c# sql ado.net


【解决方案1】:

您正在使用LIKE statement on a DateTime column,这没有多大意义,但是,无论如何,您使用 AddWithValue 将字符串作为值传递给预期的 DateTime

SqlComm.CommandText = "SELECT * FROM MyDataTable WHERE DataDate = @SDataDate";
SqlComm.Parameters.AddWithValue("@SDataDate",dtpSrcDataDate.Value);

第二个语句是另一个问题,因为 LIKE 和值之间没有空格,但是 DateTimePicker.Value 再次通过连接自动转换为字符串,然后该字符串不能用于搜索日期时间列

换句话说,始终使用与您正在搜索的列类型匹配的正确数据类型的参数。 Better also avoid completely AddWithValue 并使用

SqlComm.Parameters.Add("@SDataDate", SqlDbType.Date).Value = dtpSrcDataDate.Value;

但是,以这种方式搜索会带来另一个问题。如果您的数据库列还包含 Time 部分,那么您不能仅使用 = 运算符进行搜索,因为您将永远找不到匹配项。

例如,DateTimePicker.Value 为“23/07/2017 00:00:00”,而搜索记录为“23/01/2017 09:35:00”

在这种情况下,您需要两个参数。一个代表搜索到的最小值,另一个代表搜索到的最大值

因此,如果您搜索特定日期的所有记录,您需要这样的代码

SqlComm.CommandText = @"SELECT * FROM MyDataTable WHERE 
                        DataDate >= @minDate AND 
                        DataDate <= @maxDate";

// Example dtpSrcDataDate.Value = 23/07/2017 00:00:00
SqlComm.Parameters.AddWithValue("@minDate",dtpSrcDataDate.Value);
// add one day to get 24/07/2017 00:00:00 so you can search the whole 23th day
SqlComm.Parameters.AddWithValue("@maxDate",dtpSrcDataDate.Value.AddDays(1));

【讨论】:

  • 我正在使用 Visual Studio 2013。因此,如果我使用 SqlComm.Parameters.Add(),则此 Add 将被贬低。这样我就可以与AddWithValue() 合作。我也尝试了您的解决方案,但无法获得预期的结果。而不是我得到一个空的datagridview。
  • 即使我尝试了以下语句,也无法得到结果。 DateTime dtsrcDataDate = dtpSrcDataDate.Value.Date; SqlComm.CommandText = "SELECT * FROM MyDataTable WHERE DataDate = @SDataDate"; SqlComm.Parameters.AddWithValue("@SDataDate", SqlDbType.Date).Value = dtsrcDataDate;
  • 不推荐使用的 Add 是接收 Name 和 Value 作为参数的那个,而不是接收 Name 和 SqlDbType 的那个。由于 Value=0 导致的潜在错误,它已被弃用。使用SqlDbType添加是向参数集合中添加参数的正确方法
  • 空网格可能是由于您存储日期时间值而时间部分不为零。您要检索什么样的价值?你能发布一个例子吗?如果要检索的值中有时间组件并且您只有日期部分,那么您需要按范围查询:IE >= minvalue AND
  • 嗨史蒂夫,非常感谢您的帮助!现在问题解决了。我很高兴有你的帮助我可以解决这个问题。我再次表示感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
相关资源
最近更新 更多