2012-12-28 6 views
9

मैं इस कोड का उपयोग कर रहा सी #सी # के माध्यम से गिराने SQL सर्वर डाटाबेस

Int32 result = 0; 

try 
{ 
     String Connectionstring = CCMMUtility.CreateConnectionString(false, txt_DbDataSource.Text, "master", "sa", "happytimes", 1000); 

     SqlConnection con = new SqlConnection(); 
     con.ConnectionString = Connectionstring; 

     String sqlCommandText = "DROP DATABASE [" + DbName + "]"; 
     if (con.State == ConnectionState.Closed) 
     { 
      con.Open(); 
      SqlConnection.ClearPool(con); 
      con.ChangeDatabase("master"); 
      SqlCommand sqlCommand = new SqlCommand(sqlCommandText, con); 
      sqlCommand.ExecuteNonQuery(); 
     } 
     else 
     { 
      con.ChangeDatabase("master"); 
      SqlCommand sqlCommand = new SqlCommand(sqlCommandText, con); 
      sqlCommand.ExecuteNonQuery(); 
     } 



     con.Close(); 
     con.Dispose(); 
     result = 1; 
    } 
    catch (Exception ex) 
    { 
     result = 0; 
    } 
    return result; 

के माध्यम से एक डेटाबेस को हटाने के लिए लेकिन मैं उपयोग

में

डाटाबेस वर्तमान में कोई त्रुटि मिलती है क्या कोई मदद कर सकता है?

+4

http://knownexception.blogspot.com/2010/05/mssql-cannot-drop-database-because-it.html –

+0

कौन सा लाइन एक अपवाद देता है? –

+0

http://stackoverflow.com/questions/5170429/deleting-database-from-c-sharp –

उत्तर

16

इस प्रयास करें:

String sqlCommandText = @" 
ALTER DATABASE " + DbName + @" SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
DROP DATABASE [" + DbName + "]"; 

इसके अलावा को यह सुनिश्चित कर लें कि आपके कनेक्शन स्ट्रिंग आप चूक 210 डेटाबेस, या आप जो भी छोड़ रहे हैं उसके अलावा कोई अन्य डेटाबेस!

एक तरफ के रूप में, आपको वास्तव में अपने प्रश्नों के आस-पास की सभी चीज़ों की आवश्यकता नहीं है। कनेक्शनस्टेट हमेशा Closed से शुरू होगा, इसलिए आपको इसकी जांच करने की आवश्यकता नहीं है। इसी तरह, using ब्लॉक में अपना कनेक्शन लपेटने से कनेक्शन को स्पष्ट रूप से बंद या निपटाने की आवश्यकता समाप्त हो जाती है। तुम सब वास्तव में क्या करने की जरूरत है:

String Connectionstring = CCMMUtility.CreateConnectionString(false, txt_DbDataSource.Text, "master", "sa", "happytimes", 1000); 

using(SqlConnection con = new SqlConnection(Connectionstring)) { 
    con.Open(); 
    String sqlCommandText = @" 
     ALTER DATABASE " + DbName + @" SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
     DROP DATABASE [" + DbName + "]"; 
    SqlCommand sqlCommand = new SqlCommand(sqlCommandText, con); 
    sqlCommand.ExecuteNonQuery(); 
} 
result = 1; 
+0

मुझे परिवर्तन कथन के 'डीबीएनएएम' के आसपास ब्रैकेट [] डालने की ज़रूरत है, मेरे डीबीएनएएम (GUID) में कुछ डैश थे। फिर यह एक आकर्षण की तरह काम करता है। –

+0

SqlCommand अपने मूल वर्ग से IDISposable कार्यान्वयन विरासत में मिला है और एक उपयोग ब्लॉक में संरक्षित किया जाना चाहिए। –

2

अलग-अलग डेटाबेस के लिए sqlconnection ऑब्जेक्ट बनाएं, जिसे आप हटाना चाहते हैं।

sqlCommandText = "DROP DATABASE [DBNAME]"; 
sqlCommand = new SqlCommand(sqlCommandText , sqlconnection); 
sqlCommand.ExecuteNonQuery(); 
+1

यही वह प्रश्न है जिसे मैंने प्रश्न में चिपकाया है। –

+1

अलग-अलग डेटाबेस के लिए sqlconnection ऑब्जेक्ट बनाएं, जिसे आप हटाना चाहते हैं। आप उसी डीबी के कनेक्शन का उपयोग कर डेटाबेस को हटा नहीं सकते हैं। – sreejithsdev

+0

मैंने con.ChangeDatabase ("मास्टर") का उपयोग कर डेटाबेस बदल दिया है; –

4

आपको SMO पर एक नज़र रखना चाहिए। ये आपको डेटाबेस से SQL सर्वर के सभी पहलुओं को प्रबंधित करने की अनुमति देता है, जिसमें डेटाबेस को हटाना शामिल है।

डेटाबेस ऑब्जेक्ट में डेटाबेस को हटाने के लिए Drop विधि है।

2

इस मामले में मैं सुझाव है कि आप डेटाबेस ऑफ़लाइन पहले लेते हैं ... कि सभी कनेक्शनों को बंद करने और आदि होगा ... यहाँ यह कैसे करना है पर एक लेख: http://blog.sqlauthority.com/2010/04/24/sql-server-t-sql-script-to-take-database-offline-take-database-online/

माइक्रोसॉफ्ट स्पष्ट रूप से कहा गया है कि पर A database can be dropped regardless of its state: offline, read-only, suspect, and so on.this MSDN article (DROP DATABASE (Transact-SQL))

2

कनेक्शन एक अनुमान पर पूलिंग, हालांकि सुनिश्चित करने के लिए SQL सर्वर की गतिविधि पर नजर रखने के लिए उपयोग करें।

पूलिंग कैश में जीवित डेटाबेस से कनेक्शन रखती है, फिर जब आप एक नया बनाते हैं, तो कैश में कोई होता है तो यह इसे एक नया चालू करने के बजाए वापस ले जाता है। वे एक डिफ़ॉल्ट समय के लिए चारों ओर लटकाते हैं, (2 मिनट मुझे लगता है) अगर वे उस समय फिर से उपयोग नहीं करते हैं, तो वे मारे गए।

तो पहले डेटाबेस के रूप में परिवर्तन डेटाबेस का उपयोग करने के बजाय सीधे मास्टर से जुड़ें, क्योंकि मुझे लगता है कि परिवर्तन डेटाबेस बस पूल में कनेक्शन स्वैप करेगा।

उपयोग में डेटाबेस के लिए एक चेक दिनचर्या जोड़ें (इसे करने के लिए मास्टर के कनेक्शन का उपयोग करें!)। आप किसी भी तरह से डेटाबेस को

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

फिर से मास्टर से कनेक्शन से निष्पादित करके मजबूर कर सकते हैं!

हालांकि डीबी का उपयोग करने वाले सभी लोग, अब आपको पसंद नहीं करेंगे ...

15

का तरीका यहां बताया इकाई की रूपरेखा संस्करण 6

System.Data.Entity.Database.Delete(connectionString); 
+0

क्या आप मुझसे मजाक कर रहे हैं! मैं इसे कहीं भी ऑनलाइन नहीं ढूंढ सका। सदमे में यह उच्च वोट नहीं दिया गया है। – goodies4uall

+0

यह मेरे लिए सबसे अच्छा जवाब है! –

1

का उपयोग कर बस कनेक्शन स्ट्रिंग में डीबी नाम का उपयोग नहीं करते यह करना है।

"Data Source=.\SQLEXPRESS;Integrated Security=True;" 
संबंधित मुद्दे