2011-10-03 8 views
11

में एसक्यूएल सर्वर कॉम्पैक्ट फ़ाइल बनाएं मैं सॉफ्टवेयर का एक साधारण टुकड़ा विकसित कर रहा हूं जो एंटीटी फ्रेमवर्क कोड पहले और एसक्यूएल सर्वर कॉम्पैक्ट का उपयोग करता है 4. फिलहाल यह सेटअप काम करता है। इकाई फ्रेमवर्क एसक्यूएल सर्वर कॉम्पैक्ट फ़ाइल बनाता है अगर यह अभी तक मौजूद नहीं है। डेटाबेस के लिए पथ को कनेक्शनस्ट्रिंग के भीतर से परिभाषित किया गया है जो app.config फ़ाइल के अंदर संग्रहीत है।एपडाटा फ़ोल्डर

<connectionStrings> 
    <add name="DataContext" 
     connectionString="Data source=Database.sdf;" 
     providerName="System.Data.SqlServerCe.4.0"/> 
</connectionStrings> 

हालांकि, मैं वर्तमान उपयोगकर्ता के अनुप्रयोग डेटा फ़ोल्डर के भीतर एक फ़ोल्डर में डेटाबेस रखना चाहते हैं: यह इस तरह का निर्माण है (C: \ Users \ उपयोगकर्ता \ AppData \ मेरी Win7 मशीन पर फ़ोल्डर रोमिंग) । मैंने कनेक्शनस्ट्रिंग के डेटा स्रोत को% APPDATA% \ Database.sdf जैसे कुछ सेट करने का प्रयास किया है, लेकिन यह काम नहीं करता है, मुझे "पथ में अवैध वर्ण" अपवाद मिलता है।

मैं कनेक्शनस्ट्रिंग विधि से चिपकना चाहता हूं, क्योंकि मैं अपने वास्तविक अनुप्रयोग के मुकाबले अपने यूनिट परीक्षणों के लिए एक अलग डेटाबेस का उपयोग करना चाहता हूं। इस तरह प्रोजेक्ट की जड़ में app.config फ़ाइल डालकर डेटाबेस को संशोधित करना आसान है।

क्या कोई मुझे सही दिशा में चला सकता है?

नीचे
+0

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

उत्तर

22

उपयोग:

AppDomain.CurrentDomain.SetData("DataDirectory", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)); 

<connectionStrings> 
    <add name="DataContext" 
     connectionString="Data source=|DataDirectory|Database.sdf;" 
     providerName="System.Data.SqlServerCe.4.0"/> 
</connectionStrings> 
+0

धन्यवाद, यह काम करता है। वास्तविक एप्लिकेशन एक डब्ल्यूपीएफ एप्लीकेशन है, और मैंने AppDomain लाइन को App.xaml.cs स्टार्टअप विधि में रखा है। –

+0

आपका स्वागत है। –

+4

आपको "डेटा डायरेक्टरी" (| डेटा डायरेक्टरी |) से पहले एक और पाइप जोड़ने की आवश्यकता है। बस सोचा कि यह किसी के कारण की मदद कर सकता है मैं थोड़ी देर के लिए इस पर अटक गया था! http://msdn.microsoft.com/en-us/library/cc716756(v=vs.100).aspx – Rachel

3
connectionString="Data source=Database.sdf;" 

यह आपके ऐप बताता है अपने ऐप्लिकेशन के वर्तमान कार्यशील निर्देशिका में Database.sdf देखने के लिए; जो कहीं भी हो सकता है और लिखने योग्य नहीं हो सकता है। आप आपके द्वारा निर्दिष्ट एक स्थान पर देखने की जरूरत है:

connectionString="Data source=|DataDirectory|Database.sdf;" 

ADO.NET कनेक्शन तार में पाइप पात्रों के लिए लग रहा है और उन्हें आवेदन के डोमेन में उस नाम की संपत्ति के मूल्य के लिए फैलता है। तो DataDirectory संपत्ति का मूल्य क्या है?

  • .MSI संस्थापक एप्लिकेशन स्थापना फ़ोल्डर के लिए सेट: यह जो कुछ भी आपके आवेदन तैनात द्वारा स्थापित किया जाना चाहिए था। यदि आप उपयोगकर्ता को इंस्टॉलेशन फ़ोल्डर चुनने की अनुमति देते हैं, तो वे डेटा डायरेक्टरी को भी चुनते हैं। यही कारण है कि आपको हमेशा |DataDirectory| का उपयोग करना चाहिए और कभी भी हार्ड-कोडेड पथ नहीं होना चाहिए।
  • क्लिकऑन आपके प्रोजेक्ट में एक विशेष डेटा फ़ोल्डर को परिभाषित करता है।
  • वेब ऐप्स App_Data फ़ोल्डर का उपयोग करते हैं।
  • विजुअल स्टूडियो डीबगर डीबग फ़ोल्डर का उपयोग करता है।

"प्रोजेक्ट निर्देशिका में प्रतिलिपि" संपत्ति के साथ आपकी प्रोजेक्ट में कोई भी विजुअल स्टूडियो फ़ाइलें डेटा डायरेक्टरी पर कॉपी की जाएंगी। ज्यादातर मामलों में डेटा डायरेक्टरी केवल पढ़ने-योग्य फ़ोल्डर होगा। यह ठीक है यदि आपका डेटा केवल पढ़ने के लिए है, लेकिन यदि आप इसे लिखना चाहते हैं तो आपको अपने डेटा को एक लिखने योग्य स्थान पर कॉपी करना होगा। शायद सबसे अच्छी जगह Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) है।

  • आप एक खाली नए डेटा फ़ाइल बना रहे हैं, बस अपने एपीआई मानक CREATE DATABASE या new SqlCeConnection() या जो कुछ भी उपयोग करें: ऐसा करने के कई तरीके हैं।
  • यदि आप पूर्व-जनसंख्या वाले बीज या स्टार्टर डेटाबेस से शुरू करना चाहते हैं, तो अपनी परियोजना में बीज डेटाबेस शामिल करें। अपने एप्लिकेशन स्टार्टअप में, जांचें कि डेटाबेस SpecialFolder.ApplicationData फ़ोल्डर में मौजूद है या नहीं, और यदि नहीं, तो उसे वहां कॉपी करें।

यदि आप स्थानीय डेटाबेस बनाने पर नमूना कोड के लिए वेब खोजते हैं तो आप बहुत बुरी सलाह में भाग लेंगे। निम्न कार्य न करें:

new SqlCeConnection(@"Data source=c:\users\me\myApp\Database.sdf;"); // Do NOT do this! 

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

using (var conn = new SqlCeConnection(@"Data source=|DataDirectory|Database.sdf;")) 
{ 
    conn.Open(); 
    // No No No! This throws an Access Exception for Standard users, 
    // and gets deleted when you repair the app! 
    var cmd = conn.CreateCommand("INSERT INTO Table (column1, column2) VALUES (@p1, @p2)"); 
    ... 
} 

DataDirectory में डेटा को संशोधित करने का प्रयास न करें। न केवल यह निर्देशिका उपयोगकर्ताओं द्वारा हमेशा संशोधित नहीं होती है, यह उपयोगकर्ता द्वारा इंस्टॉलर द्वारा स्वामित्व में नहीं है। एप्लिकेशन को मरम्मत या अनइंस्टॉल करने से सभी उपयोगकर्ता के डेटा हटा दिए जाएंगे; उपयोगकर्ताओं को यह पसंद नहीं है। इसके बजाए, स्थापित डेटा को उपयोगकर्ता द्वारा लिखित फ़ोल्डर में कॉपी करें और प्रतिलिपि में सभी परिवर्तन करें।

AppDomain.CurrentDomain.SetData("DataDirectory", 
    // Wrong, this overwrites where the user installed your app! 
    Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)); 

अपने कोड में DataDirectory का मूल्य न बदलें यह संस्थापक द्वारा निर्धारित है और यदि आप इसे बदल आप पता नहीं होगा जहां अपने डेटा स्थापित किया गया था। यदि आप एक खाली डेटाबेस बना रहे हैं, तो इसे अपने अंतिम स्थान पर खोलें। यदि आप एक प्रतिलिपि बनाने जा रहे हैं, तो स्थापित डेटाबेस खोलें, इसे उपयोगकर्ता के स्थान पर सहेजें, स्थापित डेटाबेस बंद करें, और प्रतिलिपि खोलें।

मैं डेटा को Environment.SpecialFolder.CommonApplicationData पर भी हतोत्साहित करता हूं। यह उपयोगकर्ताओं द्वारा लिखने योग्य नहीं हो सकता है, और जब तक कि बहुत ही अच्छे कारण नहीं हैं, सभी उपयोगकर्ताओं को अन्य उपयोगकर्ताओं के डेटा को बदलने की अनुमति दी जानी चाहिए, प्रत्येक उपयोगकर्ता का अपना डेटाबेस होना चाहिए।

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