SQL Server存储过程中如何将C# datatable作为参数传递

h4cxqtbf  于 2023-01-20  发布在  SQL Server
关注(0)|答案(1)|浏览(414)

我需要将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和更多的文章,了解了列的顺序确实很重要。因此,我也试图相应地对齐列名,但没有运气。
有人能帮助我确定并解决此问题吗?

0md85ypi

0md85ypi1#

要解决这个问题,我们需要让SqlCommand对象知道我们正在将User Defined Table Type作为参数传递。
在Visual studio中,调用usp_UpdateQuantityInWorkOrders存储过程时,添加SqlParameter,如下所示。

SqlParameter prmMultipleQuantities = new SqlParameter();
prmMultipleQuantities.TypeName = "dbo.MultipleQuantitiesType";//UDTT name
prmMultipleQuantities.Value = dtblMultipleQuantities; //DataTable
prmMultipleQuantities.ParameterName = "@multipleQuantities";
objCmd.Parameters.Add(prmMultipleQuantities);

相关问题