दिलचस्प पोस्ट
FileInputStream का उपयोग करते समय आप आदर्श बफर आकार का निर्धारण कैसे करते हैं? MySQL में एईएस_एनसीआरसीपीटी और एईएस_डेसीआरपीपीटी का उपयोग कैसे करें बैश स्क्रिप्ट से ओएस खोजें कैसे पता चलेगा कि दो इमोजी एक इमोजी के रूप में प्रदर्शित किए जाएंगे? मुझे एंड्रॉइड अकाउंट मैनेजर का क्या उपयोग करना चाहिए? वसंत बूट एक्ट्यूएटर आवेदन उबंटू वीपीएस पर शुरू नहीं होगा सी # लिनक-टू-एससीएल – डेटा कॉन्टेक्स्ट का निपटान IDisposable का उपयोग करना चाहिए 120 मिलियन रिकॉर्ड अपडेट करने का सबसे तेज़ तरीका एंड्रॉइड: चेकबॉक्स आकार बदलने के लिए कैसे? एक बैश चर में कई लाइन आउटपुट कैप्चर करना Javascript console.log कैप्चर कर रहा है? सामान्य सभी नियंत्रण विधि आईफोन के लिए फोनगैप: बाहरी URL लोड करने में समस्या चार * और चार के बीच का अंतर PHP में इंट के लिए अधिकतम आकार क्या है?

कैसे .net कोड से संग्रहित प्रक्रिया के लिए तालिका मान पैरामीटर को पारित करने के लिए

मेरे पास एक एमएस एसक्यूएल सर्वर 2005 डाटाबेस है कुछ प्रक्रियाओं में मेरे पास तालिका पैरामीटर हैं जो मैं एक संग्रहीत प्रक्रिया को एक नर्वचर (अल्पविराम से अलग) के रूप में पास करता हूं और आंतरिक मूल्यों में आंतरिक रूप से विभाजित होता है I मैं इसे इस तरह से SQL आदेश पैरामीटर सूची में जोड़ें:

cmd.Parameters.Add("@Logins", SqlDbType.NVarchar).Value = "jim18,jenny1975,cosmo"; 

मुझे डेटाबेस को SQL Server 2008 में माइग्रेट करना होगा। मुझे पता है कि तालिका मान पैरामीटर हैं, और मुझे पता है कि उन्हें किस तरह से संग्रहीत कार्यविधियों में उपयोग करना है लेकिन मुझे नहीं पता कि एक एसक्यूएल कमांड में पैरामीटर सूची को कैसे पास किया जाए। क्या कोई Parameters.Add सही सिंटैक्स जानता है। Parameters.Add process? या इस पैरामीटर को पास करने का एक और तरीका है?

वेब के समाधान से एकत्रित समाधान "कैसे .net कोड से संग्रहित प्रक्रिया के लिए तालिका मान पैरामीटर को पारित करने के लिए"

DataTable , DbDataReader , या IEnumerable<SqlDataRecord> ऑब्जेक्ट्स को MSDN आलेख प्रति तालिका-मानद पैरामीटर को पॉप्युलेट करने के लिए उपयोग किया जा सकता है तालिका- DataTable SQL Server 2008 (ADO.NET) में पैरामीटर

निम्न उदाहरण DataTable या एक IEnumerable<SqlDataRecord> का उपयोग करके दिखाता है:

एसक्यूएल कोड :

 CREATE TABLE dbo.PageView ( PageViewID BIGINT NOT NULL CONSTRAINT pkPageView PRIMARY KEY CLUSTERED, PageViewCount BIGINT NOT NULL ); CREATE TYPE dbo.PageViewTableType AS TABLE ( PageViewID BIGINT NOT NULL ); CREATE PROCEDURE dbo.procMergePageView @Display dbo.PageViewTableType READONLY AS BEGIN MERGE INTO dbo.PageView AS T USING @Display AS S ON T.PageViewID = S.PageViewID WHEN MATCHED THEN UPDATE SET T.PageViewCount = T.PageViewCount + 1 WHEN NOT MATCHED THEN INSERT VALUES(S.PageViewID, 1); END 

सी # कोड :

 private static void ExecuteProcedure(bool useDataTable, string connectionString, IEnumerable<long> ids) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); using (SqlCommand command = connection.CreateCommand()) { command.CommandText = "dbo.procMergePageView"; command.CommandType = CommandType.StoredProcedure; SqlParameter parameter; if (useDataTable) { parameter = command.Parameters .AddWithValue("@Display", CreateDataTable(ids)); } else { parameter = command.Parameters .AddWithValue("@Display", CreateSqlDataRecords(ids)); } parameter.SqlDbType = SqlDbType.Structured; parameter.TypeName = "dbo.PageViewTableType"; command.ExecuteNonQuery(); } } } private static DataTable CreateDataTable(IEnumerable<long> ids) { DataTable table = new DataTable(); table.Columns.Add("ID", typeof(long)); foreach (long id in ids) { table.Rows.Add(id); } return table; } private static IEnumerable<SqlDataRecord> CreateSqlDataRecords(IEnumerable<long> ids) { SqlMetaData[] metaData = new SqlMetaData[1]; metaData[0] = new SqlMetaData("ID", SqlDbType.BigInt); SqlDataRecord record = new SqlDataRecord(metaData); foreach (long id in ids) { record.SetInt64(0, id); yield return record; } } 

इसके अलावा रयान के जवाब के लिए आपको DataColumn कॉलम की Ordinal प्रॉपर्टी सेट करने की भी आवश्यकता होगी यदि आप एक स्तंभ table-valued parameter साथ काम कर रहे हैं जिसमें कई कॉलम हैं जिनके क्रमफलक्रम वर्णमाला क्रम में नहीं हैं

एक उदाहरण के रूप में, यदि आपके पास निम्न तालिका मान है जिसे SQL में पैरामीटर के रूप में उपयोग किया जाता है:

 CREATE TYPE NodeFilter AS TABLE ( ID int not null Code nvarchar(10) not null, ); 

आपको सी # में अपने कॉलमों को ऑर्डर करने की आवश्यकता होगी:

 table.Columns["ID"].SetOrdinal(0); // this also bumps Code to ordinal of 1 // if you have more than 2 cols then you would need to set more ordinals 

यदि आप ऐसा करने में विफल होते हैं तो आपको पार्स त्रुटि मिल जाएगी, nvarchar को int को परिवर्तित करने में विफल रहे।

सामान्य

  public static DataTable ToTableValuedParameter<T, TProperty>(this IEnumerable<T> list, Func<T, TProperty> selector) { var tbl = new DataTable(); tbl.Columns.Add("Id", typeof(T)); foreach (var item in list) { tbl.Rows.Add(selector.Invoke(item)); } return tbl; } 

इसके साथ काम करने का साफ तरीका आपकी तालिका मानते हुए "dbo.tvp_Int" नामक पूर्णांकियों की एक सूची है (अपने स्वयं के टेबल प्रकार के लिए अनुकूलित करें)

यह एक्सटेंशन विधि बनाएं …

 public static void AddWithValue_Tvp_Int(this SqlParameterCollection paramCollection, string parameterName, List<int> data) { if(paramCollection != null) { var p = paramCollection.Add(parameterName, SqlDbType.Structured); p.TypeName = "dbo.tvp_Int"; DataTable _dt = new DataTable() {Columns = {"Value"}}; data.ForEach(value => _dt.Rows.Add(value)); p.Value = _dt; } } 

अब आप कहीं भी एक पंक्ति में एक पैरामीटर मूल्यवान पैरामीटर जोड़ सकते हैं:

 cmd.Parameters.AddWithValueFor_Tvp_Int("@IDValues", listOfIds);