Implement HOW TO: فئة مساعد لاستخدام SqlParameter مع قائمة من القيم في جملة IN

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية. إذا ما وجدت أحد الأخطاء وترغب في المساعدة في هذا المجهود، الرجاء اتمام الاستطلاع الموجود أسفل هذه المقالة

اضغط هنا لرابط المقالة باللغة الانجليزية555167
Author:
William Ryan MVP
COMMUNITY SOLUTIONS CONTENT DISCLAIMER
MICROSOFT CORPORATION AND/OR ITS RESPECTIVE SUPPLIERS MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY, RELIABILITY, OR ACCURACY OF THE INFORMATION AND RELATED GRAPHICS CONTAINED HEREIN. ALL SUCH INFORMATION AND RELATED GRAPHICS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT AND/OR ITS RESPECTIVE SUPPLIERS HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH REGARD TO THIS INFORMATION AND RELATED GRAPHICS, INCLUDING ALL IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, WORKMANLIKE EFFORT, TITLE AND NON-INFRINGEMENT. YOU SPECIFICALLY AGREE THAT IN NO EVENT SHALL MICROSOFT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, PUNITIVE, INCIDENTAL, SPECIAL, CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF USE, DATA OR PROFITS, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE USE OF OR INABILITY TO USE THE INFORMATION AND RELATED GRAPHICS CONTAINED HEREIN, WHETHER BASED ON CONTRACT, TORT, NEGLIGENCE, STRICT LIABILITY OR OTHERWISE, EVEN IF MICROSOFT OR ANY OF ITS SUPPLIERS HAS BEEN ADVISED OF THE POSSIBILITY OF DAMAGES.
الأعراض
تحاول تمرير في قيم متعددة مفصولة بفواصل محدد, إلى عبارة SQL أو إجراء مخزن التي ستستخدمها القائمة في عبارة IN. و التي يتم تمريرها في هذه القائمة كما واحدة .
السبب
يحدث هذا بسبب وهي ميزة في الواقع  تجعل معلمات beneficial لاستخدام في أول المقام-وهي الهروب القيم إدراجها في لهم وتمرير عليها في كنوع حرفي واحد. لذا إذا عيّنت @ SomeValue 1,2,3,4,5 = and المستخدمة في SELECT * FROM [TableName] WHERE هل التي لا تطابق [ColumnName] IN @ SomeValue أو القيم الموجودة في [ColumnName] التي كانت تساوي 1,2,3,4 أو 5. تتطلب بدلاً من التي تتطابق فقط مع القيم التي تم تماماً " 1,2,3,4,5 ". لذلك إذا كان لدينا الإجراء:
<CODE>
عبارة CREATE PROCEDURE up_ProcedureHelper
     @ VARCHAR AS المميزة (50)--أو طول مهما سوف تحتاج
AS
SELECT * FROM [TableName]
WHERE IN [FieldName] (@ Tokens)
</CODE>
سوف تفشل هذا الرمز:
<CODE>
سلسلة cs = ConfigurationSettings.AppSettings("ConnectString"));
using(SqlConnection cn = new SqlConnection(cs)){
      cmd SqlCommand = SqlCommand جديدة (" up_ProcedureHelper ", ConnectionName);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("@Token", "1,2,3,4,5);
      cn.Open () ؛ reality //In Connection.Open و ExecuteReader تكون يجب تغليف في Try / Catch / Finally
      dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);    
      Debug.Assert (dr.HasRows, " We يجب أن لديك صفوف ولكن عدم ") ؛ //Fails لأن ColumnName ويتم لن يتم الاحتفاظ " 1,2,3,4,5 " لحقل عدد صحيح

}
الحل
تغيير إجراء مخزن الخاص بك Accommodate Methodology جديدة
  إحدى الطرق سهلة لحل هذه المشكلة هي لإنشاء جدول مؤقتة باستخدام ميزة الجدول المؤقت Sql Server 2000 's. سوف نستخدم حلقة بسيطة لتحليل خلال المتغير نحن تم تمريره والتي هي مفصولة محدد معطى. إننا عند كل التمرير خلال الحلقة, سوف إدراج كل متغير في الجدول المؤقت. وأخيراً، نحن ستستخدمها فرعي بحيث تتطابق مع القيم في الجملة :
<CODE>
عبارة CREATE PROCEDURE up_ProcedureHelper
     @ VARCHAR AS المميزة (50)--أو طول مهما سوف تحتاج
AS
@ VARCHAR(50) AS Temp DECLARE
عبارة CREATE TABLE HOLDER(TokenValues VARCHAR(50)) #
WHILE LEN(@Tokens) > 0
    BEGIN
       IF CHARINDEX(',', @Tokens) = 0
          BEGIN
             SET @TEMP @Tokens =  
             SET @Tokens = ''
             INSERT INTO VALUES(@Temp) #Holder (TokenValues)
          END
       ELSE
          BEGIN
             SET @Temp = LEFT (@Tokens, CHARINDEX(',', @Tokens)-1)     
             INSERT INTO VALUES(@Temp) #Holder (TokenValues)
             SET @Tokens = السهم (@Tokens, LEN(@Tokens)-LEN(@Temp)-1)
       END
    END
SELECT * FROM [TableName]
WHERE IN [FieldName] (TokenValues SELECT FROM #Holder)
</CODE>
 
بفرض أن المعلمة " 1,2,3,4,5 " ، ذلك، سوف لدينا جدول Temp يسمى #Holder مع الصفوف 5 و القيم 1,2,3,4 & 5 على التوالي. هذا الجدول سوف موجود طالما كان اتصال التي تم إنشاؤها من ضمن غير مباشر. وفور نحن إغلاقه ستتم إزالة الجدول تلقائياً. في الحالات عادية وهو القصوى imperative أن تتذكر لإغلاق الاتصال . التي لا تريد أخذ أي فرص هنا و أتمنى أن أن يحصل على مغلقاً، الاتصال استخدام ذلك حظر في الإجراءات أو استدعاء  أسلوب من هناك. إذا كنت تستخدم , يمكنك لف حظر الاتصال باستخدام العبارة بالتزامن مع الاتصال  حظر ثم تأكد من أن هو  وكذلك  من (يطبق هذا نفس المبدأ مع كافة أنواع اتصال أخرى).
<CODE>
سلسلة cs = ConfigurationSettings.AppSettings("ConnectString"));
using(SqlConnection cn = new SqlConnection(cs)){
      cmd SqlCommand = SqlCommand جديدة (" up_ProcedureHelper ", ConnectionName);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("@Token", "1,2,3,4,5");
      cn.Open () ؛ reality //In Connection.Open و ExecuteReader تكون يجب تغليف في Try / Catch / Finally
      dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);    
      Debug.Assert(dr.HasRows, "We should have Rows but Don't") //Now نجاح التوكيد-; و نحن على الصفوف 5.
}
</CODE>
معلومات أخرى
 المعلمات الإجراء المخزن في SQL Server
مناقشة جيد من  ثم عندما هو حل جيد
مناقشة جيدة حول سبب إلى  الاستعلامات
كيفية تحويل الحيوي عبارات SQL إلى برمجياً  الاستعلامات

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 555167 - آخر مراجعة: 07/24/2004 23:15:00 - المراجعة: 1.0

Microsoft ADO.NET 1.1, Microsoft ADO.NET 1.0

  • kbpubtypecca kbpubmvp kbhowto KB555167 KbMtar kbmt
تعليقات