System.Data.SqlClient.SqlException: 'Тип операнда cla sh: datetime2 несовместим с десятичным - PullRequest
1 голос
/ 10 января 2020

У меня есть хранимая процедура, для которой требуется структурированный параметр. Я пытаюсь вызвать хранимую процедуру из моего C# кода и получаю следующую ошибку.

System.Data.SqlClient.SqlException: 'Тип операнда cla sh: 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

Я вызываю ИП, передавая необходимый параметр (таблица данных). Однако в строке 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 класс имеет ту же структуру, что и тип таблицы.

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

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

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

1 Ответ

1 голос
/ 10 января 2020

Согласно информации здесь вам нужно добавить атрибут, чтобы порядок столбцов, следующий из ObjectReader.Create(data), соответствовал ожидаемому в TVP.

Если атрибут не определен в исходном классе, тогда используется алфавитный порядок

...