Передача нескольких таблиц в хранимую процедуру с проблемой нескольких табличных параметров - PullRequest
1 голос
/ 01 декабря 2010

Я пытаюсь передать 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, поэтому ошибка в моем коде. Кто-нибудь может определить, где я ошибся?

ТИА!

1 Ответ

1 голос
/ 01 декабря 2010

Обнаружена проблема. Забыл упомянуть, что данные DataTable отправляются через веб-сервис, поэтому он использовал метод DataXet GetXml.Проблема заключалась в том, что метод GetXml не включает столбцы NULL, следовательно, отсутствующие столбцы.

Спасибо, ребята!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...