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
पर भी हतोत्साहित करता हूं। यह उपयोगकर्ताओं द्वारा लिखने योग्य नहीं हो सकता है, और जब तक कि बहुत ही अच्छे कारण नहीं हैं, सभी उपयोगकर्ताओं को अन्य उपयोगकर्ताओं के डेटा को बदलने की अनुमति दी जानी चाहिए, प्रत्येक उपयोगकर्ता का अपना डेटाबेस होना चाहिए।
लेकिन इस तरह मुझे कोड में कनेक्शनस्ट्रिंग बनाना है। इससे डेटाबेस के स्थान को स्विच करना आसान नहीं होगा, जैसा कि अब मैं करता हूं। मेरे पास मेरी नियमित परियोजना और मेरी टेस्ट प्रोजेक्ट दोनों में एक अलग ऐप.कॉन्फिग फ़ाइल है, जो दोनों एक अलग डेटाबेस को इंगित करती हैं। –