2010-07-25 12 views
5

वहाँ किसी भी तरह से है कि कैसे करना है? यह काम नहीं करता है:सी # SqlCommand - स्तंभ नाम लिए पैरामीटर का उपयोग नहीं कर सकते, कैसे हल करने के लिए?

SqlCommand command = new SqlCommand("SELECT @slot FROM Users WHERE [email protected]; "); 
prikaz.Parameters.AddWithValue("name", name); 
prikaz.Parameters.AddWithValue("slot", slot); 

एकमात्र चीज जिसे मैं सोच सकता हूं वह एसपी का उपयोग करना और स्तंभ के लिए चर सेट करना और सेट करना है। मुझे थोड़ा सा लगता है।

+0

ध्यान रखें कि आपकी 'Users' तालिका denormalized जाता है, इसलिए आपकी समस्या के समाधान में डिजाइन को पांचवें सामान्य रूप में हल करना शामिल होगा। – onedaywhen

उत्तर

4

आप नियमित रूप से एसक्यूएल में ऐसा नहीं कर सकते - अगर आप विन्यास स्तंभ नाम (या तालिका नाम, उस बात के लिए) होना चाहिए, आप गतिशील एसक्यूएल का उपयोग करना चाहिए - वहाँ इस लक्ष्य को हासिल करने के लिए कोई दूसरा रास्ता नहीं है।

string sqlCommandStatement = 
    string.Format("SELECT {0} FROM dbo.Users WHERE [email protected]", "slot"); 

और उसके बाद SQL सर्वर में sp_executesql संग्रहीत proc का उपयोग कि SQL आदेश पर अमल करने (और आवश्यकतानुसार अन्य पैरामीटर निर्दिष्ट करें)।

डायनामिक एसक्यूएल के पास इसके पेशेवर और विपक्ष हैं - एसक्यूएल सर्वर एमवीपी एरलैंड सोमरस्क द्वारा लिखित The Curse and Blessings of Dynamic SQL पर अंतिम लेख पढ़ें।

+1

उदाहरण कोड आप ऊपर देने के गतिशील एसक्यूएल प्रदर्शित नहीं करता है, यह सिर्फ String.Format समारोह के उपयोग को दर्शाता है। जैसा कि लिखा है यह भ्रमित है। – Yellowfog

+0

@Yellowfog: अब इस स्ट्रिंग को ले जाएं जिसे प्रारूपित किया गया है और इसे "sp_executesql" पर कॉल में उपयोग करें और आपके पास आपका डायनामिक एसक्यूएल है ..... –

+0

ठीक है, आपके पास आपका एसक्यूएल है, लेकिन यह विशेष रूप से 'गतिशील' नहीं है, मेरा है बिंदु। जैसा कि मैं इसे समझता हूं, यह एसक्यूएल को संदर्भित करता है जो कि चीजों के डेटाबेस पक्ष पर बनाया गया है, न कि वेबसर्वर पक्ष। या क्या मैं इस तरह से शब्द लेने में असामान्य हूं? – Yellowfog

7

के रूप में उल्लेख किया गया है, तो आप मौलिक क्वेरी parameterise नहीं कर सकते, तो आप क्वेरी रनटाइम पर ही निर्माण करना होगा। आप सफेद सूची इस के इनपुट, इंजेक्शन हमले से बचने चाहिए, लेकिन मौलिक:

// TODO: verify that "slot" is an approved/expected value 
SqlCommand command = new SqlCommand("SELECT [" + slot + 
      "] FROM Users WHERE [email protected]; ") 
prikaz.Parameters.AddWithValue("name", name); 

आदि इस तरह @name अभी भी parameterised है

संबंधित मुद्दे