为什么在将DateTime参数传递给存储过程时引发SQL异常

本文关键字:SQL 异常 存储过程 DateTime 参数传递 为什么 | 更新日期: 2023-09-27 18:19:49

这是存储过程的签名:

ALTER PROCEDURE [set_info]
    @idFile_id int,
    @p_timestamp datetime
...

在我的C#代码中,这里是参数的声明:

           command.Parameters.Add(new SqlParameter("@p_time_stamp", SqlDbType.DateTime));
           command.Parameters["@p_time_stamp"].Value = report.TimeStamp;

SQL异常引发消息:"将数据类型nvarchar转换为datetime时出错。"

命令参数的SqlValue为:"23jan12"

所以我认为这是因为SqlValue日期中有字母字符。

1°/如何解决这个问题

2°/我不知道为什么传递相同的参数类型对某些类型不安全,对某些其他类型不安全

编辑:

report.TimeStamp不是String,而是DateTime类型的变量

编辑2:

我终于发现了一个人为错误:(问题不在于这个参数是否正确工作…很抱歉耽误了你的时间…

为什么在将DateTime参数传递给存储过程时引发SQL异常

代码中的参数名称与存储过程不匹配。它可能试图将一个空白字符串或类似的东西转换为DateTime,因为不会向预期的@p_timestamp变量传递任何值;正如您在代码中指定的@p_time_stamp

以下更改反映了存储过程中预期的参数名称:

command.Parameters.Add(new SqlParameter("@p_timestamp", SqlDbType.DateTime));
command.Parameters["@p_timestamp"].Value = report.TimeStamp;

假设您的报告。TimeStamp是一个字符串,为什么不简单地从中创建一个DateTime对象并将其传递给存储过程呢?

DateTime dt = MyDateFormatParse(report.TimeStamp);
command.Parameters["@p_time_stamp"].Value =  dt;

请使用DateTime参数值而不是字符串。