2008-09-15 11 views
6

मैं एक सी # एप्लिकेशन लिख रहा हूं जो एफ़टीपी के माध्यम से संपीड़ित डेटाबेस बैकअप डाउनलोड करता है। एप्लिकेशन को तब बैकअप निकालने और इसे डिफ़ॉल्ट डेटाबेस स्थान पर पुनर्स्थापित करने की आवश्यकता होती है।सी # एसक्यूएल डिफ़ॉल्ट डेटा स्थान पर डेटाबेस पुनर्स्थापित करें

मैं नहीं जानता होगा जो SQL सर्वर के संस्करण मशीन जहां आवेदन रन पर स्थापित किया जाएगा। इसलिए, मुझे इंस्टेंस नाम (जो कॉन्फ़िगरेशन फ़ाइल में है) के आधार पर डिफ़ॉल्ट स्थान ढूंढना होगा।

उदाहरण मैंने पाया सब एक रजिस्ट्री कुंजी है कि वे पढ़ने के लिए किया था, लेकिन इस काम नहीं करेगा, क्योंकि यह मानता है कि एसक्यूएल उसमें केवल एक ही स्थापित किया गया है।

एक और उदाहरण मैंने पाया एक डेटाबेस बनाया है, पढ़ा है कि डेटाबेस की फाइल गुण, डेटाबेस को हटाने का एक बार यह किया गया था। यह बस बोझिल है।

Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile

समस्या यह है कि इस रिक्त स्ट्रिंग है, जो मदद नहीं करता है लौटा रहा है है:

मैं नेट ढांचे में जो कुछ काम करना चाहिए, यानी मिला।

मैं भी NT खाते है जिसके तहत एसक्यूएल सेवा चला रहा है, एक बार मैं इसे निकाला है, ताकि मैं बैकअप फ़ाइल पर कि उपयोगकर्ता के लिए पढ़ने के लिए पहुँच प्रदान कर सकते पता लगाने के लिए की जरूरत है।

उत्तर

7

मुझे क्या पता चला कि

Microsoft.SqlServer.Management.Smo.Server(ServerName).Settings.DefaultFile 

केवल रिटर्न में गैर-शून्य जब वहाँ कोई रास्ता स्पष्ट रूप से परिभाषित है। जैसे ही आप एक पथ निर्दिष्ट करते हैं जो डिफ़ॉल्ट नहीं है, तो यह फ़ंक्शन उस पथ को सही तरीके से देता है।

तो, एक सरल समाधान का यह समारोह एक स्ट्रिंग, या अशक्त रिटर्न जांच करने के लिए किया गया था। यह एक स्ट्रिंग देता है, तो उसके बाद उस का उपयोग करें, लेकिन अगर यह अशक्त है, का उपयोग

Microsoft.SqlServer.Management.Smo.Server(ServerName).Information.RootDirectory + "\\DATA\\" 
+0

मुझे लगता है कि यह आपके लिए काम करता है। मैंने इस आदेश को आजमाया है लेकिन यह काम नहीं करता है। मैं "MYCOMPUTERNAME से कनेक्ट नहीं हो सकता" के बारे में अपवाद फेंकता हूं। मुझे नहीं लगता कि यह फ़ायरवॉल समस्या है। शायद अनुमति गुंजाइश? सर्वरनाम एक स्ट्रिंग है, सही? बेहतर होगा (नया माइक्रोसॉफ्ट। SQL सर्वर। प्रबंधन .mo.Server (yourServerName))। Info.RootDirectory? –

+0

शानदार! कुछ दिनों के लिए इसके लिए खुदाई कर रहे थे। – StarPilot

1

एक विकल्प यह है कि एक सरल समाधान हो सकता है, अपने गंतव्य सर्वर पर एक नया डेटाबेस बनाने और उसके बाद कि आपके बैकअप के साथ डेटाबेस से अधिक बहाल करना है। आपका बैकअप सही जगह पर होगा और जब आप इसे पुनर्स्थापित करते हैं तो आपको बैकअप फ़ाइल "MOVING" के साथ झगड़ा नहीं करना पड़ेगा। एसक्यूएल उम्मीद करता है कि बैकअप को उसी भौतिक पथ पर बहाल किया जाए जिसे उनका बैक अप लिया गया था। यदि ऐसा नहीं है तो आपको RESTORE के दौरान MOVE विकल्प का उपयोग करना होगा। यह समाधान प्रक्रिया में डेटाबेस का नाम बदलना आसान बनाता है, उदाहरण के लिए, आप नाम पर एक तारीख को हल करना चाहते हैं।

+0

यह एक अच्छा विचार है, लेकिन मैं MDF और एलडीएफ फ़ाइलों के लिए डिफ़ॉल्ट नाम का उपयोग नहीं करना चाहते हैं। मैं चाहता हूं कि उनमें डेटस्टैम्प शामिल हो। ऐसा करने के लिए, जब मैं अस्थायी डेटाबेस बनाता हूं, तो मुझे फ़ाइल नाम निर्दिष्ट करना होगा, जो मुझे डिफ़ॉल्ट पथ की आवश्यकता के लिए वापस लाता है। – RichieACC

+0

एक चाल जो आपके लिए काम कर सकती है वह डेटाबेस को उस नाम से बनाना है जिसमें पूर्ण टाइमस्टैम्प शामिल है और उसके बाद डीबी का नाम बदलें जो भी हो। डीबी का नाम बदलना फाइलनामों को नहीं बदलता है।इस तरह फाइल सही नाम के साथ बनाई गई हैं। फ़ाइल नाम निर्दिष्ट करने के लिए –

+0

डैरल, आपको पूर्ण पथ निर्दिष्ट करने की आवश्यकता है। एसक्यूएल में सापेक्ष पथ की कोई अवधारणा नहीं प्रतीत होती है। – RichieACC

4

एक ही तरीका मास्टर डेटाबेस के समान स्थान का उपयोग करना होगा। आप निम्न SQL के साथ SQL सर्वर इंस्टेंस से पूछ सकते हैं:

select filename from master.dbo.sysdatabases where name = 'master' 

वह मास्टर डेटाबेस का पूरा पथ लौटाएगा। उस पथ के साथ, आप उस पथ के केवल निर्देशिका भाग को निकालने के लिए FileInfo ऑब्जेक्ट का उपयोग कर सकते हैं। इससे SQL सर्वर के उदाहरण के लिए रजिस्ट्री की जांच करने के अनुमानित कार्य से बचा जाता है जिसे आप कनेक्ट करने का प्रयास कर रहे हैं।

+0

यह आवश्यक रूप से डिफ़ॉल्ट पथ के समान परिणाम नहीं लौटाएगा। मास्टर डेटाबेस बनने के बाद डिफ़ॉल्ट पथ बदला जा सकता है, और मास्टर डेटाबेस को इसके साथ आगे बढ़ने की आवश्यकता नहीं है। – RichieACC

+0

उस स्थिति में, आपको रजिस्ट्री कुंजी HKEY_LOCAL_MACHINE \ सॉफ़्टवेयर \ Microsoft \ Microsoft SQL Server \ MSSQL.X को पढ़ने की आवश्यकता होगी, जहां एक्स आवृत्ति संख्या है और यह देखने के लिए जांचें कि क्या डिफ़ॉल्ट डेटा और डिफ़ॉल्ट लॉग परिभाषित किया गया है। –

+0

आप कैसे जानेंगे कि आप सही उदाहरण संख्या देख रहे हैं? मुझे बस काम करना है उदाहरण का नाम है। मेरे पास मेरे कोड के अलावा मशीन पर कोई पहुंच नहीं होगी जो उस पर चल रहा है। – RichieACC

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