2012-02-15 10 views
13

के पास सिंटेक्स त्रुटि context.Database.ExecuteSqlCommand() का उपयोग कर मुझे डीबीकॉन्टेक्स्ट के माध्यम से एक SQL कथन भेजने में समस्या हो रही है।एसक्यूएलएक्सप्शन: 'जाओ'

मैं निष्पादित करने के लिए

CREATE TABLE Phones([Id] [uniqueidentifier] NOT NULL PRIMARY KEY, 
    [Number] [int],[PhoneTypeId] [int]) 
GO 
ALTER TABLE [dbo].[Phones] ADD CONSTRAINT [DF_Phones_Id] 
    DEFAULT (newid()) FOR [Id] 
GO 

यह त्रुटि स्ट्रिंग

Incorrect syntax near the keyword 'ALTER'. 
Incorrect syntax near 'GO'. 

हालांकि चल रहा है कि SSMS में सटीक बयान त्रुटियों के बिना चलाता है के साथ विफल कोशिश कर रहा हूँ? DbContext के माध्यम से डिफ़ॉल्ट बाधा के संबंध में हल करने के लिए मुझे आवश्यक कोई भी समस्या। मुझे बाधाओं का उपयोग करने वाले लोगों के साथ समस्याएं आ रही हैं और आईएसडीबी जेनरेटेड सेट को सही नहीं है। मुझे यकीन नहीं है कि यह कैसे लागू होगा हालांकि।

उत्तर

27

GO एसक्यूएल का हिस्सा नहीं है, इसलिए इसे ExecuteSqlCommand() के साथ निष्पादित नहीं किया जा सकता है। प्रबंधन स्टूडियो या कमांड लाइन उपकरण का उपयोग करते समय बैच को अलग करने के तरीके के रूप में सोचें। इसके बजाय, बस जाओ बयान हटाएं और आपको ठीक होना चाहिए। यदि आप त्रुटियों में भाग लेते हैं क्योंकि आपको अलग-अलग बैचों में अपने आदेश चलाने की आवश्यकता है, तो बस प्रत्येक बैच के लिए ExecuteSqlCommand() को कॉल करें जिसे आप चलाने के लिए चाहते हैं।

4

डेव मार्कल ने मुझे मार दिया। वास्तव में, आप बैच को अलग करने के लिए "जाओ" को any other string में बदल सकते हैं।

यहां एक वैकल्पिक कार्यान्वयन इकाई फ्रेमवर्क के बजाय एसएमओ का उपयोग करना है। ExecuteNonQuery नामक एक उपयोगी विधि है जो मुझे लगता है कि आपके जीवन को बहुत आसान बना देगा। Here एक अच्छा कार्यान्वयन उदाहरण है।

+0

यही कारण है एसएसएमएस के लिए सच है, हालांकि यदि आप एसएसएमएस में बैच सेपरेटर बदलते हैं तो उपरोक्त कोड अभी भी 'जाओ' पर चकित होगा। –

+0

एक नोट जो मैं जोड़ना चाहता हूं। अगर मुझे पसंद है, तो आप अक्सर अपने प्रश्नों से कुछ प्रकार का रिटर्न वैल्यू चाहते हैं कि आप एसएमओ के माध्यम से गुजर रहे हैं, इस बात से अवगत रहें कि ExecuteWithResults गो और एल्टर कथन में चलाए जाने पर अपवाद वापस कर देगा। मुझे थोड़ी देर पहले यह पता चला, और हमारे UI पर ExecuteNonQuery को केवल एक विकल्प डालने के लिए समाप्त हो गया जो स्क्रिप्ट रन टाइम पर चेक हो जाता है। – CodeWarrior

0

मुझे पता है, नेक्रोप्रोस्टिंग खराब प्रबंधक है, लेकिन हो सकता है कि यह पोस्ट किसी के समय को बचाए। के रूप में यह डेव पोस्ट में उल्लेख किया गया था, GO एसक्यूएल का हिस्सा नहीं है, इसलिए हम यह काम

  var text = System.IO.File.ReadAllText("initialization.sql"); 
      var parts = text.Split(new string[] { "GO" }, System.StringSplitOptions.None); 
      foreach (var part in parts) { context.Database.ExecuteSqlCommand(part); } 

      context.SaveChanges(); 

इस मामले में बनाने के लिए अपने आदेश splitted और समस्याओं के बिना निष्पादित किया जाएगा थोड़ा वैकल्पिक हल बना सकते हैं

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

  • कोई संबंधित समस्या नहीं^_^