C# 将存储过程中的数据类型nvarchar从代码转换为datetime时出错

C# 将存储过程中的数据类型nvarchar从代码转换为datetime时出错,c#,sql,.net,sql-server,oledb,C#,Sql,.net,Sql Server,Oledb,从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; 我

从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转换为datetime时出错

我注意到这是在我从SQLConnection切换到OLEDBConnection之后开始发生的。我还没有证实这一点。我不得不转换,以遵守我之前编写的应用程序的其余部分

更新:
当我在文本框中输入9/30/2018的值时,它将作为:{9/30/2018 12:00:00 am}传递到存储过程中在使用OleDb时,转换为上面的日期时间代码后,应始终记住,参数不是按照名称传递的,而是按照添加到参数集合中的确切顺序传递的

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

您需要更改参数集合中的插入顺序,或切换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);

另一件事是,在使用OleDb时,请看这篇文章。我们应该始终记住,参数不是按照名称传递的,而是按照添加到参数集合中的确切顺序传递的

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

您需要更改参数集合中的插入顺序,或切换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);

另一件事是看这篇文章,我想说Min Date在C语言的SQL中不起作用,因为Min C Datetime和SQL支持的Datetime是不同的

使用:

System.Data.SqlTypes.SqlDateTime.MinValue.Value
而是C Datetime提供的最小值。
这应该行得通

我想说,Min Date在C的SQL中不起作用,因为Min C Datetime和SQL支持的Datetime是不同的

使用:

System.Data.SqlTypes.SqlDateTime.MinValue.Value
而是C Datetime提供的最小值。

这应该可以使用

使用SQL Server Profiler查看应用程序如何发送@invdt invDate的数据类型是什么?它是如何居住的?发生错误时,它填充了什么?它填充了DateTime.MinValue{1/1/0001 12;00:00 AM}OLEDB没有问题。毕竟,这是连接SQL Server最常见的方式。错误是明确的,有人试图混合字符串和日期。invDate是字符串或InventoryDate是nvarchart问题可能是ird.RIS是datetime字段,错误在此处。ird.RIS=COALESCE@repRIS,ird.ris使用SQL Server Profiler查看应用程序如何发送@invdt invDate的数据类型是什么?它是如何居住的?发生错误时,它填充了什么?它填充了DateTime.MinValue{1/1/0001 12;00:00 AM}OLEDB没有问题。毕竟,这是连接SQL Server最常见的方式。错误是明确的,有人试图混合字符串和日期。invDate是字符串或InventoryDate是nvarchart问题可能是ird.RIS是datetime字段,错误在此处。ird.RIS=COALESCE@repRIS,ird.RISi不知道订单很重要!非常感谢。我现在要验证SP的其余部分,但我想这就是它!再次感谢你!如果使用探查器,您可以看到您的参数以其他顺序传递。如果是其他问题,你可以看到你的应用程序到底发送了什么代码。我不知道顺序是重要的!非常感谢。我现在要验证SP的其余部分,但我想这就是它!再次感谢你!如果使用探查器,您可以看到您的参数以其他顺序传递。如果是其他问题,你可以看到你的应用程序到底发送了什么代码。你假设datetime是用来代替例如datetime2的。不过,在这种情况下,OP根本没有使用MinValue。我不是什么都不假设,请看存储过程。最小日期值在他在评论中说的任何地方都没有使用。您假设datetime是用来代替例如datetime2的。不过在这种情况下,OP根本没有使用MinValue。我不是什么都不假设,请看存储过程。他在评论中说的任何地方都没有使用最小日期值。