1

string s = @"select * from Bill_Detail where DateTimeofBilling='" + mcCalendar.SelectionStart.ToShortDateString()

所以我有这个代码。由于 toshortdatestring,mcCalendar 的值为 '8/20/2013'。我只需要从日期中获取所有行,mcCalendar。

所以它是

从 Bill_Detail 中选择 *,其中 DateTimeofBilling='8/20/2013'

Database 表上的 DateTimeofBilling 是 DateTime 数据类型。sqlserver 2008

为什么我不能使用此代码获得我期望获得的行?

4

4 回答 4

2

我的猜测ToShortDateString,出于文化原因,这实际上并没有返回您想要的值。正确的解决方法不是改变文本处理——而是使用参数化查询:

string sql = "select * from Bill_Detail where DateTimeofBilling=@QueryDate";
using (var command = new SqlCommand(sql, conn))
{
    command.Parameters.Add("@QueryDate", SqlDbType.Date).Value = 
        mcCalendar.SelectionStart.Date;
    // Execute the command
}

始终使用参数化查询,而不是构建包含值的 SQL 字符串:

  • 它避免了SQL注入攻击
  • 它避免了像这样的数据转换问题
  • 它有助于将您的代码(SQL)与数据分开,这样可以更轻松地查看正在发生的事情
于 2013-08-21T15:07:03.483 回答
0

发生这种情况是因为您已从 where 子句中删除了时间元素。

例如,如果您的值是:“8/20/2013 00:00:00”,那么它将需要一个完整的DateTime参数。

有几种方法可以解决它。

1) 使用以下 SQL:

string s = @"select * from Bill_Detail where DateTimeofBilling like '"
+ mcCalendar.SelectionStart.ToShortDateString() + "%'";

或者

2)删除“ToShortDateString”,以便您传递的参数是完整的日期和时间(mcCalendar.SelectionStart = 8/20/2013 00:00:00)

string s = @"select * from Bill_Detail where DateTimeofBilling = '"
    + mcCalendar.SelectionStart + "'";
于 2013-08-21T15:35:22.927 回答
0
string s = @"select * from Bill_Detail where DateTimeofBilling=CONVERT(date, '" + mcCalendar.SelectionStart.ToShortDateString() + "'); "

应该做你正在寻找的东西(你最后没有结束)。但是,是的,参数化查询是一种更好的方法。

查看以下代码是否返回结果。如果您的字段命名正确,您可能会专门寻找 '08/20/2013 12:00:00' 而没有进行转换。

select * from Bill_Detail where CONVERT(date, DateTimeofBilling)='08/20/2013';
于 2013-08-21T15:06:46.873 回答
0

如果您的服务器配置为英式日期 (dd/mm/yyyy) 而不是美式日期 (mm/dd/yyyy),那么这可能会导致您的问题。尝试将您的日期指定为“dd-mmm-yyyy”。

string queryDate = mcCalendar.SelectionStart.Date.ToString("dd-MMM-yyyy");
string s = "SELECT * FROM Bill_Detail WHERE DateTimeofBilling = '" + queryDate + "'";
于 2013-08-21T15:08:52.050 回答