【问题标题】:Error converting data type nvarchar to datetime in a Stored Procedure from code在存储过程中从代码将数据类型 nvarchar 转换为日期时间时出错
【发布时间】:2019-01-24 14:59:57
【问题描述】:

从 C# 调用存储过程时出现以下错误。

参数在代码中定义为:

 if (repRIS.Length > 0)
    command.Parameters.AddWithValue("@repRIS", repRIS);
 else
    command.Parameters.AddWithValue("@repRIS", DBNull.Value);
  command.Parameters.Add("@invDt", OleDbType.Date).Value = invDate;

我已经注释掉了存储过程中的所有内容,现在只有以下内容:

ALTER PROCEDURE [dbo].[SearchDates]
    -- Add the parameters for the stored procedure here
     @invDt datetime,
     @repRIS varchar(10) ,

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

select this, that, and, the, other from myTableName ird
where
     ird.RIS = COALESCE(@repRIS, ird.RIS) 
     and ird.InventoryDate = @invDt
END

InventoryDate 是数据库中的 DateTime 类型。

当我从 SQL MS 运行 SP 时,它产生的结果没有问题,但是,当使用应用程序调用它时,我收到以下错误消息

将数据类型 nvarchar 转换为日期时间时出错

我注意到它在我从 SQLConnection 切换到 OLEDBConnection 后开始发生。我还没有确认这一点。 (我必须切换以符合我之前编写的应用程序的其余部分)

更新: 当我在文本框中输入 9/30/2018 的值时,它被传递到存储过程中:{9/30/2018 12:00:00 AM} 转换为日期时间后(上面的代码)

【问题讨论】:

  • 使用 SQL Server Profiler 查看您的应用程序如何发送@invDt
  • invDate 的数据类型是什么?它是如何填充的?发生错误时填充了什么内容?
  • 它填充了 DateTime.MinValue {1/1/0001 12;00:00 AM}
  • OLEDB 没有问题。毕竟,这是连接到 SQL Server 的最常见方式。错误是明确的,试图混合字符串和日期。 invDateStringInventoryDatenvarchar
  • 问题可能是 ird.RIS 是一个日期时间字段,错误就在这里。 ird.RIS = COALESCE(@repRIS, ird​​.RIS)

标签: c# sql .net sql-server oledb


【解决方案1】:

在使用 OleDb 时,应始终记住,参数不是根据名称传递,而是按照它们添加到参数集合的确切顺序传递。

在您的代码中,您首先添加@repRIS,这是传递给SP 的第一个参数。但是 SP 需要第一个参数的日期,而您会得到异常

需要更改Parameters集合中的插入顺序或切换SP中参数的声明顺序

command.Parameters.Add("@invDt", OleDbType.Date).Value = invDate;     
if (repRIS.Length > 0)
    command.Parameters.AddWithValue("@repRIS", repRIS);
else
    command.Parameters.AddWithValue("@repRIS", DBNull.Value);

还有一点可以看这篇文章Can we stop using AddWithValue already?

【讨论】:

  • 我不知道订单很重要!谢谢你!我现在要验证 SP 的其余部分,但我认为就是这样!再次感谢您!
  • 如果您使用 Profiler,您可以看到您的参数以其他顺序传递。如果是其他问题,您可以查看您的应用发送的确切代码
【解决方案2】:

我会说 Min Date 在 C# 中的 SQL 中不起作用,因为 min C# Datetime 和 SQL 支持的日期时间不同。

使用:

System.Data.SqlTypes.SqlDateTime.MinValue.Value

取而代之的是 C# Datetime 提供的 Min。 这应该工作

【讨论】:

  • 假设 datetime 被使用而不是datetime2。但在这种情况下,OP 根本没有使用 MinValue。
  • 我不是假设什么,请看存储过程。
  • 最小日期值不在任何地方使用
  • 他在 cmets 上这么说的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 2018-04-06
  • 2016-03-14
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
相关资源
最近更新 更多