将datetimepicker值传递给C#中的WHERE LIKE子句

时间:2017-07-21 18:01:44

标签: c# sql ado.net

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

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'附近

我无法弄清楚这个问题。

请帮忙。

1 个答案:

答案 0 :(得分:3)

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

googleMap.addMarker(new MarkerOptions()
        .position(BROOKLYN_BRIDGE)
        .title("First Pit Stop")
        .icon(BitmapDescriptorFactory
        .defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));

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

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

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

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

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

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

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

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