تمرير جداول متعددة إلى الإجراء المخزنة مع مشكلة معلمات ذات قيمة متعددة

StackOverflow https://stackoverflow.com/questions/4323625

سؤال

أحاول تمرير DataTables إلى إجراء مخزن يقبل متعددة معلمات ذات قيمة الجدول. المشكلة هي ، يبدو أن جميع المعلمات يتم نقلها إلى الأول ، لذا أحصل على أخطاء مثل هذه:

محاولة تمرير معلمة ذات قيمة معلمة مع 13 عمود (عمود) حيث يتطلب نوع الجدول المعرفة من قبل المستخدم 17 عمودًا (أعمدة) 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 ، وبالتالي فإن الخطأ على الكود الخاص بي. هل يمكن لأي شخص أن يكتشف حيث أخطأت؟

تيا!

هل كانت مفيدة؟

المحلول

وجدت المشكلة .. نسيت أن أذكر أن بيانات DataBle يتم إرسالها من خلال خدمة ويب ، لذلك كانت تستخدم طريقة مجموعة البيانات getxml. كانت المشكلة أن طريقة getxml لا تتضمن أعمدة فارغة وبالتالي الأعمدة المفقودة.

شكرا يا رفاق!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top