将多个表传递给具有多个表值参数问题的存储过程

时间:2010-12-01 11:02:11

标签: c# tsql sql-server-2008 table-valued-parameters

我正在尝试将DataTables传递给一个接受多个表值参数的存储过程。问题是,似乎所有参数都传递给第一个,所以我得到这样的错误:

  

尝试传递表值   带有13列的参数   相应的用户定义表类型   需要17列。

这是我的代码..

存储过程标题:

CREATE PROCEDURE TestProc
@Parm1 Temp1TableType READONLY,
@Parm2 Temp2TableType READONLY,
@Parm3 Temp3TableType READONLY,
@Parm4 Temp4TableType READONLY,
@Parm5 Temp5TableType READONLY

@ Parm1有17列,@ Parm2 13列,@ Parm3 3列,@ Parm4 11列,@ Parm5有8列。

C#代码(我使用Microsoft.ApplicationBlocks)

DataTable dtTable1 = dsSource.Tables[0];
DataTable dtTable2 = dsSource.Tables[1];
DataTable dtTable3 = dsSource.Tables[2];
DataTable dtTable4 = dsSource.Tables[3];
DataTable dtTable5 = dsSource.Tables[4];

SqlParameter param1 = new SqlParameter("@Parm1", dtTable1);
SqlParameter param2 = new SqlParameter("@Parm2", dtTable2);
SqlParameter param3 = new SqlParameter("@Parm3", dtTable3);
SqlParameter param4 = new SqlParameter("@Parm4", dtTable4);
SqlParameter param5 = new SqlParameter("@Parm5", dtTable5);

param1.SqlDbType = SqlDbType.Structured;
param2.SqlDbType = SqlDbType.Structured;
param3.SqlDbType = SqlDbType.Structured;
param4.SqlDbType = SqlDbType.Structured;
param5.SqlDbType = SqlDbType.Structured;

SqlParameter[] parms = new SqlParameter[5];
parms[0] = param1;
parms[1] = param2;
parms[2] = param3;
parms[3] = param4;
parms[4] = param5;

returnVal = SqlHelper.ExecuteScalar(CfgKeys.ConnString, CommandType.StoredProcedure, "TestProc", parms);

今天我尝试使用SqlClient而不是Microsoft.ApplicationBlocks,但我仍然遇到了同样的错误。

SqlConnection conn = new System.Data.SqlClient.SqlConnection(CfgKeys.ConnString);
conn.Open();
using (conn) {
   SqlCommand cmdTestDataToServer= new SqlCommand("TestProc", conn);
   cmdTestDataToServer.CommandType = CommandType.StoredProcedure;

   SqlParameter param1 = new SqlParameter("@Parm1", dtTable1);
   SqlParameter param2 = new SqlParameter("@Parm2", dtTable2);
   SqlParameter param3 = new SqlParameter("@Parm3", dtTable3);
   SqlParameter param4 = new SqlParameter("@Parm4", dtTable4);
   SqlParameter param5 = new SqlParameter("@Parm5", dtTable5);

   param1.SqlDbType = SqlDbType.Structured;
   param2.SqlDbType = SqlDbType.Structured;
   param3.SqlDbType = SqlDbType.Structured;
   param4.SqlDbType = SqlDbType.Structured;
   param5.SqlDbType = SqlDbType.Structured;

   cmdTestDataToServer.Parameters.Add(param1);
   cmdTestDataToServer.Parameters.Add(param2);
   cmdTestDataToServer.Parameters.Add(param3);
   cmdTestDataToServer.Parameters.Add(param4);
   cmdTestDataToServer.Parameters.Add(param5);

   returnVal = cmdTestDataToServer.ExecuteScalar();
}

conn.Close();

当我运行它时,似乎所有参数都传递给@Param1,因此我之前提到的错误。当我在TSQL中手动运行该过程时它会起作用,因此错误在我的代码上。谁能发现我哪里出错?

TIA!

1 个答案:

答案 0 :(得分:1)

发现问题..忘了提到DataTable数据是通过Web服务发送的,所以它使用了DataSet方法GetXml。问题是GetXml方法不包含NULL列,因此缺少列。

谢谢你们!