我遇到从C#
到Sql Server
的SQL查询问题,不确定导致它的原因....
代码如下所示:
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'
错误是:
从字符串转换datetime的语法错误。
任何人都知道发生了什么事?
答案 0 :(得分:4)
您正在将DateTime
值(假设startDate
确实在.NET代码中类型为DateTime
)转换为字符串,以便分配给{ {1}} - 为什么?这完全没用,毫无意义......它会导致日期/时间,语言和区域设置等潜在问题 - 正如您所看到的那样......
只需使用:
SqlParameter
然后你应该没事。
答案 1 :(得分:1)
您不需要将日期时间转换为字符串,以便将其添加为参数值。只需添加原始DateTime对象本身,.NET SQL代码将完成剩下的工作。
答案 2 :(得分: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;
答案 3 :(得分: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));
将日期转换为字符串通常是创建错误的第一步(如此处所示)。