6

मैं DacPackage ऑब्जेक्ट के आधार पर एक परिनियोजन स्क्रिप्ट बनाने के लिए Microsoft Data-Tier Application framework का उपयोग कर रहा हूं। मैं इस स्क्रिप्ट को निष्पादित करने के लिए Microsoft.SqlServer.Management.Smo.Server वर्ग का उपयोग करने केSQLCMD मोड में ServerConnection.ExecuteNonQuery

Unhandled Exception: Microsoft.SqlServer.Management.Common.ExecutionFailureException: 
    An exception occurred while executing a Transact-SQL statement or batch. ---> 
    System.Data.SqlClient.SqlException: Incorrect syntax near ':'. 

मैं जानता हूँ कि इस समस्या का जवाब है कि मैं जरूरत है कि के साथ बाहर का प्रयास कर रहा हूँ ...

SqlConnection deployConnection = new SqlConnection(connBuilder.ToString()); 
deployConnection.Open(); 
Server server = new Server(new ServerConnection(deployConnection)); 
server.ConnectionContext.ExecuteNonQuery(deployScript); 

बहरहाल, यह त्रुटियों ... SQLCMD मोड में होने के लिए, लेकिन मुझे नहीं पता कि कहा गया मोड में निष्पादित करने के लिए मेरे ServerConnection को कैसे बताना है।

मुझे लगता है कि मेरी समस्या शीर्षक के अनुसार जितनी विशिष्ट है उतनी विशिष्ट नहीं है। मुझे वास्तव में करने में सक्षम होने की आवश्यकता है, जो डेकपैक से उत्पन्न स्क्रिप्ट को नेट फ्रेमवर्क के माध्यम से निष्पादित करता है। क्या कोई मुझे इस बारे में सहायता कर सकता है?

उत्तर

9

एसक्यूएलसीएमडी मोड कमांड टी-एसक्यूएल कमांड नहीं हैं; वे केवल SQL सर्वर प्रबंधन स्टूडियो (एसएसएमएस)/विजुअल स्टूडियो (वीएस) और SQLCMD.EXE में काम करते हैं। एसक्यूएलसीएमडी-मोड मूल रूप से SQLCMD.EXE काम करता है और एसएसएमएस/वीएस में मैन्युअल रूप से सक्षम किया जा सकता है; यह उन अनुप्रयोगों का एक हिस्सा है और ऐसा कुछ नहीं जो प्रदाता के माध्यम से किया जा सकता है।

वे एप्लिकेशन SQLCMD-mod आदेशों की व्याख्या करते हैं और उन्हें SQL सर्वर से पास नहीं करते हैं। एसक्यूएलसीएमडी-मोड कमांड पहले पार्स किए गए/निष्पादित किए जाते हैं (इस प्रकार वे एसक्यूएल को प्रभावित करने में सक्षम हैं जो कि सबमिट किए जाने वाले हैं) और फिर एसक्यूएल का अंतिम संस्करण SQL सर्वर को सबमिट किया गया है।

इसलिए, SQL सर्वर डेटा टूल्स (एसएसडीटी)/विजुअल स्टूडियो द्वारा उत्पन्न तैनाती एसक्यूएल स्क्रिप्ट इन तीनों प्रोग्रामों में से किसी एक के माध्यम से चलाने की आवश्यकता है।

चूंकि आप एक .dacpac फ़ाइल पहले से ही है, माइक्रोसॉफ्ट उन है कि तुम बाहर की जाँच करनी चाहिए प्रकाशित करने के लिए कुछ तरीके प्रदान करता है:

तुम भी एक DacServices.GenerateDeployScript() के माध्यम से SQL स्क्रिप्ट प्रकाशित बना सकते हैं, लेकिन इस स्थिति के रूप में ऊपर के बाद से प्रकाशित/तैनात SQL स्क्रिप्ट, दृश्य स्टूडियो से उत्पन्न किया जाए या GenerateDeployScript() "{} प्रोजेक्ट प्रकाशित करें" कहा गया है परिवर्तन नहीं होगा, एक ही लिपि है। मतलब, यह :setvar और :on error exit के साथ-साथ SQLCMD मोड चर, जो बहुत ही कम से कम $(DatabaseName) जो निम्न पंक्ति में प्रयोग किया जाता है हो जाएगा के रूप में इस तरह के SQLCMD मोड बृहदान्त्र-आदेशों होगा:

USE [$(DatabaseName)]; 

जबकि यह true को CommentOutSetVarDeclarations की DacDeployOptions संपत्ति, जो अभी भी :setvar __IsSqlCmdEnabled "True" कि पता लगाने के लिए किया जाए या नहीं sqlcmd मोड सक्षम किया गया है प्रयोग किया जाता है के लिए एक लाइन के साथ ही :on error exit लाइन छोड़ देंगे सेट करके प्रारंभिक :setvar लाइनों बाहर टिप्पणी करने के लिए संभव है। बस इस विशेष :setvar रेखा से ऊपर एक टिप्पणी करते हुए कहा है:

/* 
Detect SQLCMD mode and disable script execution if SQLCMD mode is not supported. 
To re-enable the script after enabling SQLCMD mode, execute the following: 
SET NOEXEC OFF; 
*/ 

तो वे वास्तव में, चाहते हैं कि क्या डॉस के माध्यम से है कि इस स्क्रिप्ट केवल SQLCMD के माध्यम से चलाया जाता है -> SQLCMD.EXE या PowerShell -> आह्वान-sqlcmd।

तकनीकी रूप से, तैनाती स्क्रिप्ट सामग्री की एक स्ट्रिंग उत्पन्न करना संभव है (stream के बजाय) और उस स्ट्रिंग को ए द्वारा नियंत्रित करें) किसी भी कोलन-कमांड को हटाकर, और बी) जो भी "$ (डेटाबेस नाम)" को बदलकर डेटाबेस जिसे आप तैनात करने का इरादा रखते हैं। हालांकि, मैंने यह कोशिश नहीं की है, मैं इसकी सिफारिश नहीं कर रहा हूं, और मुझे यकीन नहीं है कि यह एसक्यूएल सर्वर डेटा टूल्स द्वारा तैनाती स्क्रिप्ट को उत्पन्न करने के सभी परिस्थितियों में काम करेगा। लेकिन यह विकल्प जैसा प्रतीत होता है।

इसके अलावा, मामूली रूप से संबंधित: आपको SQL स्क्रिप्ट चलाने के लिए एसएमओ की आवश्यकता नहीं है। एसएमओ टी-एसक्यूएल कमांड के माध्यम से सीधे ऑब्जेक्ट्स के माध्यम से एसक्यूएल सर्वर के साथ बातचीत करने का माध्यम है।

संपादित करें:
लिंक जहाँ दूसरों को इस की कोशिश की और पाया है कि यह काम नहीं किया:

संभावनाएं काम करने के लिए उत्पन्न प्रकाशित SQL स्क्रिप्ट प्राप्त करने के लिए प्रोग्रामेटिकल:

+0

तो वहाँ है * कोई * जिस तरह से प्रोग्राम के रूप में नेट ढांचे से उत्पन्न SQLCMD आलेख निष्पादित करने के - कि तुम क्या कह रहे हैं? –

+3

@DanForbes - बहुत ज्यादा, हाँ। उन 3 कार्यक्रमों के बाहर कुछ भी नहीं है कि वे कोलन-आदेश क्या हैं। लेकिन, इसका मतलब यह नहीं है कि आप "SQLCMD.EXE -S सर्वर" के लिए कमांड लाइन को कॉल करने के लिए सी # में एक प्रक्रिया शुरू नहीं कर सकते हैं और SQL स्क्रिप्ट में गुजरने के लिए स्क्रिप्ट नाम और उचित ध्वज की आपूर्ति करते हैं। –

+1

बहुत बहुत धन्यवाद, @srutzky! –

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