从存储过程中的字符串转换日期和/或时间时转换失败

时间:2015-03-19 14:15:01

标签: c# sql sql-server-2014 sqldataadapter

编辑:我在下面回答了我的问题,但还不能接受。

我正在使用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]  
 .
 .
 .

3 个答案:

答案 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。

感谢所有帮我调试的人。