我需要将datatable作为参数从C#代码传递到SQL Server中的存储过程参数。
这是我的C#代码:
objCmd = new SqlCommand("usp_UpdateQuantityInWorkOrders", objConn);
objCmd.CommandType = CommandType.StoredProcedure;
var multipleQuantitiesDataTable = ConvertListToDataTable(request.MultipleQuantitiesViewModel.MultipleQuantities);
objCmd.Parameters.AddWithValue("@multipleQuantities", multipleQuantitiesDataTable);
objCmd.Parameters.AddWithValue("@SelectedWorkOrdersType", request.SelectedWorkOrdersType);
objCmd.Parameters.AddWithValue("@OldProductCode", request.OldProduct.ProductCode);
objCmd.Parameters.AddWithValue("@NewProductCode", request.NewProduct.ProductCode);
SqlParameter parameter = new SqlParameter("@affectedRecords", SqlDbType.Int);
parameter.Direction = ParameterDirection.Output;
objCmd.Parameters.Add(parameter);
objConn.Open();
objCmd.ExecuteNonQuery();
objConn.Close();
int output = Convert.ToInt32(objCmd.Parameters["@affectedRecords"].Value);
这是multipleQuantitiesDataTable
的快照:
下面是我的SQL Server存储过程的代码:
create procedure usp_UpdateQuantityInWorkOrders
@multipleQuantities as MultipleQuantitiesType readonly,
@SelectedWorkOrdersType nvarchar(100) = null,
@OldProductCode as nvarchar(50),
@NewProductCode as nvarchar(50),
@affectedRecords integer output
as
begin try
--Commented the complete code for testing purposes
end try
begin catch
rollback transaction myTran
declare @Message varchar(MAX) = ERROR_MESSAGE()
declare @Severity int = ERROR_SEVERITY()
declare @State smallint = ERROR_STATE()
RAISERROR (@Message, @Severity, @State)
end catch
MultipleQuantitiesType
是ser-defined表格类型,定义如下:
CREATE TYPE dbo.MultipleQuantitiesType AS TABLE
(
OldProductCode [varchar(16) NULL,
OldProductId int NULL,
OldQuantity int NULL,
NewProductCode varchar(16) NULL,
NewProductId int NULL,
NewQuantity int NULL
)
我一运行这个程序,执行就被中止,并出现以下异常:
消息206,级别16,状态2,程序usp_UpdateQuantityInWorkOrders,第0行
操作数类型冲突:表与MultipleQuantitiesType不兼容
我在Google上搜索了这个问题,我用this article找到了将数据从.NET客户端传递到SQL Server存储过程的不同方法,但是没有一种方法对我有效。
浏览了this article和更多的文章,了解了列的顺序确实很重要。因此,我也试图相应地对齐列名,但没有运气。
有人能帮助我确定并解决此问题吗?
1条答案
按热度按时间0md85ypi1#
要解决这个问题,我们需要让
SqlCommand
对象知道我们正在将User Defined Table Type作为参数传递。在Visual studio中,调用
usp_UpdateQuantityInWorkOrders
存储过程时,添加SqlParameter
,如下所示。