13

के लिए टेबल-मान पैरामीटर में प्रकार 'वस्तु' के पैरामीटर पासिंग मैं एसक्यूएल सर्वर 2012 में एक मेज-मान पैरामीटर के रूप में परिभाषित किया गया है निम्नलिखित:sql_variant स्तंभ

var mdItems = new DataTable(); 
mdItems.Columns.Add("Id", typeof(int)); 
mdItems.Columns.Add("FieldName", typeof(string)); 
mdItems.Columns.Add("Value", typeof(object)); 
mdItems.Rows.Add(new object[] {2, "blah", "value"}); //'value' is usually a string 
SqlCommand sqlCommand = conn.CreateCommand(); 
sqlCommand.CommandText = "[WriteFieldValues]"; 
sqlCommand.CommandType = CommandType.StoredProcedure; 
sqlCommand.Parameters.AddWithValue("@FieldValues", mdItems); 
sqlCommand.ExecuteNonQuery(); 

मैं तो ExecuteNonQuery फोन पर एसक्यूएल सर्वर से निम्न त्रुटि हो:

कॉलम 'वैल्यू' का प्रकार समर्थित नहीं है। प्रकार 'वस्तु'

मैं someone जो एक ही समस्या 3 साल पहले का सामना करना पड़ा जब वह एक ज्ञात माइक्रोसॉफ्ट बग के रूप में पहचान की थी पाया जाता है। हालांकि, बग का लिंक टूटा हुआ है। क्या किसी को पता है कि बग की स्थिति या संभावित कार्यवाही पर अद्यतन जानकारी है या नहीं? जैसा कि यह खड़ा है, यह बग वास्तव में sql_variant फ़ील्ड के मान को मारता है।

+0

@ जोनसेगल मैंने सी # कॉलिंग कोड जोड़ा है। – Dan

+0

आपने 'sql_variant' क्यों चुना है? बस उत्सुक। – codingbiz

+0

@codingbiz फ़ील्ड को स्ट्रिंग, दिनांक और संख्यात्मक मानों को स्टोर करने की आवश्यकता है। मैं कोड में मैन्युअल रूपांतरण कर सकता था, लेकिन यही है कि sql_variant मेरे लिए क्या करना चाहिए। – Dan

उत्तर

1

उम्मीद है कि आपके पास "एक आकार सभी फिट बैठता है" डेटा मॉडल के लिए वास्तव में अच्छा उपयोग है। आम तौर पर, जब आप सेट आधारित रिलेशनल बीजगणित और सार्जबिलिटी की गलतफहमी के कारण स्केल करने का प्रयास करते हैं तो यह आपके चेहरे पर उड़ाता है। शायद आपने यह कुछ विचार दिया है। मैं इस मॉडल पर ईटीएल या रिपोर्ट विकसित करने से नफरत करता हूं।

ध्यान रखें, आप किसी डेटाबेस को डेटाबेस इंजन में डालने का प्रयास कर रहे हैं कि उसे अंतर्निहित संरचना का कोई ज्ञान नहीं है। वस्तु इतनी सामान्य है कि ऑब्जेक्ट के प्राप्तकर्ता को इसका अर्थ नहीं है कि इसका व्याख्या कैसे किया जाए। ऑब्जेक्ट में गुण हैं, लेकिन यदि आप स्पष्ट निर्देश हैं या आप उन्हें अनपॅक करने के लिए अंतर्निहित प्रकार की पहचान करने के लिए प्रतिबिंब का उपयोग करते हैं, तो आप केवल उन तक पहुंच पाएंगे। एकमात्र तरीका (जिसे मैं जानता हूं) किसी ऑब्जेक्ट को अंतर्निहित प्रकार में विश्वसनीय रूप से परिवर्तित करने के लिए, इसके बारे में कुछ भी जानने के बिना, प्रतिबिंब के उपयोग के माध्यम से है। शायद कुछ नेट गुरु मुझे अन्य तरीकों से भर देंगे।

जेनेरिक ऑब्जेक्ट प्रकार को इस तरह के sql_variant के रूप में संग्रहीत नहीं किया जा सकता है। यहां तक ​​कि sql_variant को कुछ हद तक दृढ़ता से टाइप किए गए मानों की आवश्यकता होती है। एसक्यूएल सर्वर डेटा प्रकार (और उसके बाद अंतर्निहित डेटा का मूल्य) क्या है, यह जानने और समझने के लिए प्रतिबिंब का उपयोग नहीं करेगा।

आप सिस्टम का उपयोग कर सकते हैं। रिफ्लेक्शन की गेट टाइप विधि और उसके बाद डालने से पहले एक केस स्टेटमेंट फेंक दें।

+0

यह टीवीपी और प्रो मेरे डेटा मॉडल की परिधि पर है और प्रदर्शन-महत्वपूर्ण या खोज-केंद्रित क्षेत्र में नहीं है। इस विशेष मामले में, मैं चाहता था कि SQL सर्वर मेरे लिए रोल रूपांतरण के बजाय मेरे लिए प्रकार रूपांतरण प्रबंधित करे। – Dan

0

दुर्भाग्यवश, मेरे पास अभी इसका उत्तर देने के लिए समय नहीं है, लेकिन मैं आपको सही रास्ते पर ले जा सकता हूं।

मैंने टीवी में उपयोग करने के बजाय अतीत में जो किया है, एक्सएमएल पैरामीटर का उपयोग करें, डेटासेट (या उस मामले के लिए किसी भी पीओसीओ) को एक्सएमएल के रूप में क्रमबद्ध करें, एक्सएमएल को प्रो में पास करें, फिर " टेम्पलेट टेबल, स्थानीय टेबल वर्र्स, "वर्क टेबल" इत्यादि में जो कुछ भी आवश्यक था, निकालने के लिए एक्सएमएल वैरिएबल के "नोड्स" प्रॉपर्टी (और अन्य सदस्य) ...

यह अस्पष्ट है, लेकिन यदि आप उस डेटासेट को क्रमबद्ध करते हैं, और निरीक्षण करते हैं एक्सएमएल जो बनाया गया है, और लाइनों पर एक्सएमएल डेटा प्रकारों पर पढ़ा गया है, तो आप शायद अपने कार्य को पूरा करने के तरीके को समझने में सक्षम होंगे।

यदि इससे मदद नहीं मिलती है, तो मैं कल एक वास्तविक समाधान को एक साथ रखने की कोशिश करूंगा, क्योंकि मैं इस सवाल पर आया क्योंकि मैं दिन के लिए जा रहा था।

चीयर्स !!