【问题标题】:System.Data.SqlClient.SqlException: 'Operand type clash: datetime2 is incompatible with decimalSystem.Data.SqlClient.SqlException:'操作数类型冲突:datetime2 与十进制不兼容
【发布时间】:2020-04-27 22:45:53
【问题描述】:

我有一个需要结构化参数的存储过程。我正在尝试从我的 C# 代码中调用存储过程,但出现以下错误。

System.Data.SqlClient.SqlException: '操作数类型冲突:datetime2 是 与十进制不兼容 表值参数的数据 “@TableType”不符合参数的表类型。 SQL 服务器错误为:200,状态:7'

以下是我在数据库中可用的存储过程。

CREATE PROCEDURE dbo.spProcessData
    @TableType AS dbo.TblTypeHourlyData READONLY
AS
BEGIN
    SET NOCOUNT ON;


END

这是我的表格类型脚本。

CREATE TYPE dbo.TblTypeHourlyData AS TABLE 
(
    Name NVARCHAR(50),
    RecordDate DATETIME,
    Amount  DECIMAL(18,2)
)
GO

我通过传递所需的参数(数据表)来调用 SP。但是,它会在 var executeNonQuery = command.ExecuteNonQuery(); 行中返回错误。

        List<HourlyData> data = .................
        using (var connection = CreateConnection())
        {
            using (var command = connection.CreateCommand())
            {
                command.CommandText = "dbo.spProcessData";
                command.CommandType = CommandType.StoredProcedure;

                DataTable paramDT = new DataTable();
                using (var reader = ObjectReader.Create(data))
                {
                    paramDT.Load(reader);
                }

                var param1 = new SqlParameter("@TableType", SqlDbType.Structured)
                {
                    TypeName = "dbo.TblTypeHourlyData",
                    Value = paramDT
                };

                command.Parameters.Add(param1);
                connection.Open();
                var executeNonQuery = command.ExecuteNonQuery(); // ERROR
                connection.Close();

                var value = executeNonQuery > 0;
                return value;
            }
        }

对于“数据”变量,我已经有了一个数据集。 HourlyData 类的结构与表类型相同。

public class HourlyData
{
        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public DateTime? RecordDate{ get; set; }

        [DataMember]
        public decimal? Amount{ get; set; }
}

【问题讨论】:

  • 我不确定,但是您检查了 paramDT 的列顺序吗?它是否与您的 TblTypeHourlyData 订单匹配?阅读错误消息,我认为它试图将日期放在小数位或相反的位置。
  • 您发送的RecordDate 数据是什么?那是空的还是什么?
  • @SelimYıldız 是的,在某些情况下它可以为空。示例记录:2020 年 1 月 7 日上午 7:22:15
  • 两种情况下是否出现相同的错误(发送 null 或 1/7/2020 7:22:15 AM )?
  • 是的。它为每个场景返回此错误。同样的错误!!

标签: c# sql-server tsql stored-procedures ado.net


【解决方案1】:

根据here 的信息,您需要添加一个属性,以便ObjectReader.Create(data) 产生的列顺序与 TVP 中的预期相同。

如果属性未在源类中定义,则使用字母顺序

【讨论】:

  • 当我用 [Ordinal(0)]、[Ordinal(1)] 等定义属性时,它起作用了!!!你是救生员。
猜你喜欢
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 2015-10-21
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多