编辑:我在下面回答了我的问题,但还不能接受。
我正在使用C#和SQL2014。我知道这个问题无处不在,典型的答案是使用通用格式,但这不是我想要的。我有两个场景。一个工作,一个不工作,这就是我所关心的。两者都使用相同的存储过程(尽管在不同的数据库中)。如果我将存储过程编辑为命令并手动将参数设置为我在C#中设置的相同内容,则两者都有效。除了不同的数据库之外,两种情况都完全相同,所以这就是我正在做的事情。
cmd = new sqlcommand......
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 60;
cmd.Parameters.AddWithValue("@date", "3/16/2015");
cmd.Parameters.AddWithValue("@startTime", "12:00 AM");
cmd.Parameters.AddWithValue("@endTime", "1:00 AM");
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt); //Error
有趣的是,只有当@date设置为" 2015年3月16日"我已经尝试了大约6个其他日期,一切正常。话虽这么说,这个日期在其他数据库上工作正常。有没有人知道这可能是什么?在存储过程中,这些参数设置为SMALLDATETIME。如果需要,我可以尝试将一些存储过程放在这里。
以下是导致问题发生的存储过程的一部分:
@date SMALLDATETIME,
@startTime SMALLDATETIME,
@endTime SMALLDATETIME
--[DATE] is a smalldatetime column in the database
WHERE
[DATE] = @date --ERROR HAPPENS BECAUSE OF THIS
编辑:抱歉所有的困惑。经过更多调试后,看起来实际问题可能来自过程中的此语句:
SELECT
DATEDIFF(mi, '00:00:00', [START]) AS [START],
CASE WHEN [END] = '00:00:00' THEN 1440
ELSE DATEDIFF(mi, '00:00:00', [END]) END AS [END]
.
.
.
答案 0 :(得分:1)
这可能基于为数据库设置的内部日期格式。我建议您在所有代码中使用ISO标准格式,以便传入:
cmd.Parameters.AddWithValue("@date", "2015-03-16");
答案 1 :(得分:0)
字符串“3/16/2015”会破坏,除非您以某种方式将线程中的区域设置硬编码为美国英语。
您是否尝试过更具体的SQL参数? 抱歉VB语法,但我猜测C#等价......
Dim dt As Date = DateTime.ParseExact("3/16/2015", "M/d/yyyy", Globalization.CultureInfo.GetCultureInfo("us-en"))
cmd.Parameters.Add(New SqlClient.SqlParameter("@date", dt) With {.SqlDbType = SqlDbType.SmallDateTime})
答案 2 :(得分:0)
我的问题是在程序中使用此声明:
DATEDIFF(mi,'00:00:00',[END])
[END]列是一个nvarchar,它将24:00:00设置为午夜而不是00:00:00。
感谢所有帮我调试的人。