【问题标题】:Why I have an SQL Exception raised when I pass a DateTime parameter to my Stored proc?为什么当我将 DateTime 参数传递给我的存储过程时会引发 SQL 异常?
【发布时间】:2012-02-06 19:32:45
【问题描述】:

这是存储过程的签名:

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 转换为日期时间时出错。”

命令参数的SqlValue为:“23jan12”

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

1°/如何解决这个问题?

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

编辑:

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

编辑 2:

我终于找到了一个人为错误的错误:(问题不在于这个参数正常工作......很抱歉浪费了你的时间......

【问题讨论】:

  • 您的 report.timestamp 属性是什么数据类型?
  • 您的report.TimeStamp 也应该是DateTime 类型,而不是字符串。
  • 解析字符串到日期或尝试 23-Jan-12。
  • 存储过程也需要'@p_timestamp'而不是'@p_time_stamp'
  • 发布更多 SP - 如果参数确实是 DateTime,则从 VARCHAR 字段到 DateTime 会发生某种转换。您是在与某处的 VARCHAR 字段进行比较吗?

标签: c# stored-procedures parameter-passing


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    DateTime dt = MyDateFormatParse(report.TimeStamp);
    command.Parameters["@p_time_stamp"].Value =  dt;
    

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-12-18
        • 1970-01-01
        • 1970-01-01
        • 2012-01-03
        • 2013-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多