2012-10-31 11 views
7

मैं वर्तमान में निम्न कोडमज़बूती से एसक्यूएल सर्वर 2008 पर एक डेटाबेस ड्रॉप सी # के माध्यम से

using Microsoft.SqlServer.Management.Smo; 

var server = new Server(Server); 
server.KillAllProcesses("Db"); 
server.KillDatabase("Db"); 

कभी कभी यह काम करता है के माध्यम से एक डेटाबेस ड्रॉप करने की कोशिश कर रहा हूँ, लेकिन दूसरों मैं निम्न अपवाद प्राप्त करें:

Microsoft.SqlServer.Management.Smo.FailedOperationException: सर्वर को होस्ट करें 'होस्ट 1' के लिए डेटाबेस विफल।
---> माइक्रोसॉफ्ट.SqlServer.Management.Common.ExecutionFailureException: एक ट्रांजैक्ट-एसक्यूएल कथन या बैच निष्पादित करते समय एक अपवाद हुआ।
---> System.Data.SqlClient.SqlException: राज्य में परिवर्तन या डेटाबेस 'डीबी' के विकल्प इस समय नहीं किए जा सकते हैं। डेटाबेस एकल-उपयोगकर्ता मोड में है, और उपयोगकर्ता वर्तमान में उससे जुड़ा हुआ है।

किसी भी विचार को कोड के माध्यम से डेटाबेस को विश्वसनीय रूप से कैसे छोड़ें?

+0

तुम कोशिश क्या ' बाद में डाटाबेस डीबी सेट मल्टी_यूसर; 'पहले? –

+5

व्यक्तिगत रूप से मैं इसके लिए एसएमओ का उपयोग नहीं करता, मुख्य रूप से क्योंकि मुझे नहीं पता कि उन 'किल ...()' फ़ंक्शन क्या करते हैं। मैं कहूंगा 'मास्टर मास्टर; रोलबैक तत्काल के साथ वैकल्पिक डाटाबेस डीबी सेट सिंगल_यूज़र; ड्रोप डाटाबेस डीबी; ' –

+0

डेटाबेस को डिफ़ॉल्ट रूप से सिंगलयूसर के रूप में सेट नहीं किया गया है, मुझे लगता है कि KillDatabase विधि पर एक असफल प्रयास इसे एकल उपयोगकर्ता में बदल रहा है और फिर इसे छोड़ रहा है। – Konstantinos

उत्तर

3

एसएमओ के माध्यम से डेटाबेस को विश्वसनीय रूप से हटाने के लिए यह server.KillDatabase("Db"); पर कॉल करने के लिए पर्याप्त है। MSDN बताता है कि KillDatabase सक्रिय कनेक्शन छोड़ देता है भले ही उनके उदाहरण थोड़ा भ्रामक हैं।

KillDatabase मुद्दे ALTER DATABASE [Db] SET SINGLE_USER WITH ROLLBACK IMMEDIATE और फिर DROP DATABASEKillAllProcesses सभी कनेक्शनों को सूचीबद्ध करता है और एक अलग बैच के रूप में प्रति प्रक्रिया एक प्रक्रिया को मारता है; मानते हैं कि KillAllProcesses एसिंक्रोनस है जब KillDatabase के बाद एक हत्या होती है तो डीबी को एकल-उपयोगकर्ता मोड में सेट किया जाता है।

1

मेरे मामले में मुझे जो त्रुटि मिल रही थी उसे सर्वर जोड़कर तय किया गया था। डेटाबेस। किल विधि से पहले रीफ्रेश करें। इसका कारण डेटाबेस था जिसे मैं ड्रॉप करने का प्रयास कर रहा था, सर्वर ऑब्जेक्ट को तत्काल करने के बाद बनाया गया था, दूसरे शब्दों में, मैं अस्थायी रूप से डेटाबेस बना रहा था, इससे डेटा निकाल रहा था और इसे छोड़ रहा था। डेटाबेस डेटाबेस (ऑब्जेक्ट) की सूची पर प्रदर्शित नहीं हो रहा था। रीफ्रेश जोड़ना चाल था ...

0

मैंने बिना पूलिंग के सर्वरकनेक्शन बनाकर ऐसी त्रुटि तय की। इस तरह:

var serverConnection = new ServerConnection(serverName) 
{ 
    ..., 
    NonPooledConnection = true 
}; 
server = new Server(serverConnection); 
server.KillAllProcesses(databaseName); 
1

मुझे मिल गया है त्रुटि ("ड्रॉप में विफल रहा है ...") MSDN का उपयोग करना:

dbServer.KillAllProcesses(db.Name); 
dbServer.KillDatabase(db.Name); 

काम के आसपास थी:

string sqlCommandText = @"USE master; 
ALTER DATABASE [" + db.Name + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
DROP DATABASE [" + db.Name + "]"; 
dbServer.ConnectionContext.ExecuteNonQuery(sqlCommandText); 
संबंधित मुद्दे