System.Data.SqlClient.SqlException: '操作数类型冲突:datetime2 与十进制不兼容

System.Data.SqlClient.SqlException: 'Operand type clash: datetime2 is incompatible with decimal

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

System.Data.SqlClient.SqlException: 'Operand type clash: datetime2 is incompatible with decimal The data for table-valued parameter "@TableType" doesn't conform to the table type of the parameter. SQL Server error is: 200, state: 7'

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

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


END

这是我的 table 类型脚本。

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

我通过传递所需的参数(数据table)来调用SP。但是,它 returns 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;
            }
        }

对于"data"变量,我已经有了一个数据集。 HourlyData class 与 table 类型具有相同的结构。

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

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

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

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

If the attribute is not defined in the source class then alphabetical order is used