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
我有一个需要结构化参数的存储过程。我试图从我的 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