1

我在从C#到 的sql 查询时遇到问题Sql Server,不知道是什么原因造成的....

代码如下所示:

SqlCommand cmd = new SqlCommand(
    "SELECT tscoc_Name, 
            tscoc_Start, 
            tscoc_End 
            FROM 
            tbl_SchedulerOnCall 
            WHERE (
                tscoc_Start > @fd 
                AND 
                tscoc_End < @ld) 
                AND 
                tscoc_Start = @state", 
    con);
cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = 
    startDate.ToString("yyyy-MM-dd");
cmd.Parameters.AddWithValue("ld", SqlDbType.DateTime).Value = 
    startDate.AddDays(14).ToString("yyyy-MM-dd");

SQL查询是这样的:

exec sp_executesql 
N'SELECT tscoc_Name, 
         tscoc_Start, 
         tscoc_End 
FROM 
tbl_SchedulerOnCall 
WHERE (
    tscoc_Start > @fd 
    AND 
    tscoc_End < @ld) 
    AND 
    tscoc_Start = @state', 
N'@fd datetime, @ld datetime, @state nvarchar(2)', 
@fd = 'Oct  8 2012 12:00:00:000AM', 
@ld = 'Oct 22 2012 12:00:00:000AM', 
@state = N'SA'

错误是:

从字符串转换日期时间的语法错误。

有人知道发生了什么吗?

4

4 回答 4

4

在分配给 - 时,您正在将您的DateTime值(假设startDate 确实是 .NET 代码中的类型DateTime)转换为字符串SqlParameter- 为什么?这完全没用和毫无意义......它会导致日期/时间和语言以及区域设置的潜在问题 - 正如你所看到的......

只需使用:

cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = startDate;
cmd.Parameters.AddWithValue("ld", SqlDbType.DateTime).Value = startDate.AddDays(14);

然后你应该没事。

于 2012-10-10T07:07:47.017 回答
1

您无需将日期时间转换为字符串即可将其添加为参数值。只需添加原始 DateTime 对象本身,.NET SQL 代码将完成其余的工作。

于 2012-10-10T07:06:42.063 回答
0

使用DateTime.ParseExact. 当您在字符串中使用非标准格式的日期时,这很有用。

  string dateString = "Oct  8 2012 12:00:00:000AM";
  string format = "MMM dd yyyy hh:mm:ssFFFtt";
  CultureInfo provider = CultureInfo.InvariantCulture;
  DateTime result = DateTime.ParseExact(dateString, format, provider);

  cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = result;
于 2012-10-10T07:09:54.803 回答
0

你为什么AddWithValue?第二个参数是要传递的值,而不是数据类型。

做就是了:

SqlCommand cmd = new SqlCommand("SELECT tscoc_Name, tscoc_Start, tscoc_End FROM tbl_SchedulerOnCall WHERE (tscoc_Start > @fd AND tscoc_End < @ld) AND tscoc_Start = @state", con);
cmd.Parameters.AddWithValue("fd", startDate);
cmd.Parameters.AddWithValue("ld", startDate.AddDays(14));

将日期转换为字符串通常是创建错误的第一步(如此处)。

于 2012-10-10T07:20:26.093 回答