2009-03-29 12 views
12

मेरा विंडोज फॉर्म एप्लिकेशन विजुअल स्टूडियो में डिज़ाइनर का उपयोग करके बनाए गए दृढ़ टाइप किए गए डेटासेट का उपयोग करता है। रनटाइम पर मैं या तो लाइव या टेस्ट डेटाबेस चुनने में सक्षम होना चाहता हूं।रनटाइम पर दृढ़ता से टाइप किए गए डेटासेट कनेक्शन स्ट्रिंग को सेट करने का सबसे अच्छा तरीका?

प्रोग्रामटाइम को रनटाइम पर डेटासेट के लिए कनेक्शन स्ट्रिंग सेट करने का सबसे अच्छा तरीका क्या है?

+0

वीएस -2010 के रूप में कनेक्शन की दृश्यता हो सकती है pecified (उदा। सार्वजनिक) और उत्पन्न डेटाटेबल एडाप्टर के लिए बेस क्लास निर्दिष्ट कर सकते हैं ... (यानी, यह पोस्ट ज्यादातर वीएस 2008 से संबंधित है और पूर्व समस्याएं :-) –

उत्तर

1

उनके लिए एक app.config दोनों में कनेक्शन कनेक्शन स्ट्रिंग्स और फिर आप कमांड लाइन/स्टार्ट अप स्विच के आधार पर स्विच कर सकते हैं। या यदि आप उपयोगकर्ता को लचीलापन देना चाहते हैं तो आप उन्हें एक विकल्प पृष्ठ दे सकते हैं जहां वे चुन सकते हैं कि कौन से कनेक्शन का उपयोग करना है।

string[] args = Environment.GetCommandLineArgs(); 
// The first (0 index) commandline argument is the exe path. 
if (args.Length > 1) 
{ 
    if (Array.IndexOf(args, "/live") != -1) 
    { 
     // connection string = 
     // ConfigurationSettings.AppSettings["LiveConString"]; 
    } 
} 
else 
{ 
    // connection string = 
    // ConfigurationSettings.AppSettings["TestConString"]; 
} 

तो अब आप को फोन करके अपने अनुप्रयोग शुरू:

नीचे एक स्टार्ट-अप स्विच पढ़ने के लिए कोड है

MyApp.exe /live 

MyApp.exe अकेले का उपयोग या किसी अन्य स्विच के साथ होगा आपको परीक्षण विन्यास प्राप्त करें।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन मेरा सवाल यह है कि आप कनेक्शन स्ट्रिंग कैसे सेट कर सकते हैं रनटाइम पर दृढ़ता से टाइप किए गए डेटासेट। – wethercotes

1

पुन: wethercotes टिप्पणी

जादूगर भंडार कनेक्शन स्ट्रिंग जब आप डाटासेट की स्थापना की है, लेकिन इसका मतलब यह नहीं है कि आप इसे गतिशील नहीं कर सकता। आप किस संस्करण का उपयोग कर रहे हैं इस पर निर्भर करता है, लेकिन सामान्य रूप से यदि आप अपने डेटासेट के अंतर्गत फ़ाइलों का विस्तार करते हैं तो आपको Designer.cs, या DataTableNameAdapter.xsd जैसी फ़ाइल मिल जाएगी। आप उन फ़ाइलों को खोल सकते हैं और _connection के लिए खोज सकते हैं। यह आमतौर पर एक निजी चर है और कक्षा में एक init समारोह में सेट है।

आप की तरह निम्नलिखित कोड जोड़कर गतिशील सेटिंग बना सकते हैं:

public string ConnectionString 
{ 
    get { return this._connection.ConnectionString; } 
    set 
    { 
     if (this._connection == null) 
     { 
      this._connection = new System.Data.SqlClient.SqlConnection(); 
     } 
     this._connection.ConnectionString = value; 
    } 
} 

ध्यान दें कि अगर आप डाटासेट पुनर्जीवित आप की संभावना कोड के इस भाग खो देंगे, और डाटासेट पुनर्रचना के बिना आप जोड़ना पड़े यह कई वस्तुओं के लिए।

+0

फिर से धन्यवाद गैरी। मैंने आपके कोड के साथ आंशिक कक्षा बनाई है जो डेटासेट को पुनर्जीवित होने पर खो जाने से रोकता है। दुर्भाग्य से यह प्रत्येक डेटा एडेप्टर के लिए किया जाना है, जिसमें मेरे दर्जनों हैं। – wethercotes

0

बेस्ट समाधान मैं अब तक पाया है:

से पहले किसी अन्य प्रोग्राम की स्थापना रनटाइम पर ग्राहक द्वारा निर्धारित के रूप में जो आपके preffered कनेक्शन स्ट्रिंग रखती है (। जैसे newConnectionString)

जोड़े तो TableAdapters में

this.myTableAdapter.Connection.ConnectionString = Properties.Settings.Default.newConnectionString; 
+0

नहीं, आप इसे इस तरह से नहीं कर सकते हैं। TableAdapters में कनेक्शन प्रॉपर्टी को आंतरिक के रूप में परिभाषित किया गया है। –

+0

मेरी परियोजना के लिए कोई समस्या नहीं है ... – yimbot

3

कनेक्शन संपत्ति के रूप में आंतरिक परिभाषित किया गया है: टेबल एडाप्टर का उपयोग करते।

internal global::System.Data.SqlClient.SqlConnection Connection 

तो मामले में अपने TypedDataset नहीं में अपने मुख्य खिड़कियों के रूप में ही विधानसभा रूपों अनुप्रयोग, आप पहुँच कनेक्शन संपत्ति के लिए सक्षम नहीं होगा है। यह समस्या तब हो सकती है जब आप अपने डेटासेट कोड को दोबारा दोहराएं और को एक अलग परियोजना में ले जाएं जो अपनी स्वतंत्रता असेंबली का उत्पादन करेगा।

इस समस्या को हल करने के लिए, आप नीचे बताए अनुसार कर सकते हैं।

अपने टेबल एडाप्टर के लिए आंशिक कक्षा बनाएं और डिफ़ॉल्ट सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर के बगल में एक और कन्स्ट्रक्टर जोड़ें। के रूप में MyTableAdapter

public partial class MyTableAdapter 
{ 
    public MyTableAdapter(SqlConnection connection) 
    { 
     thisSetConnection(connection); 
     this.ClearBeforeFill = true; 
    } 

    public void SetConnection(SqlConnection connection) 
    { 
     this._connection = connection; 
    } 
} 

आप TableAdapters आप अपनी परियोजना में है के रूप में कई के लिए यह करने के लिए की आवश्यकता होगी मान लिया जाये कि TableAdapter प्रकार। TableAdapter में कोई सामान्य बेस क्लास नहीं है लेकिन धन्यवाद कि उन्हें आंशिक कक्षाओं के रूप में घोषित किया गया है, इसलिए हम इसे ऊपर वर्णित तरीके से करने में सक्षम हैं।

अब रनटाइम पर, तो आप इस तरह अपने TableAdapter का एक उदाहरण बना सकते हैं ..

SqlConnection connection; 
//create the connection here at runtime.. 
MyTableAdapter adapter = new MyTableAdapter(connection); 

या आप डिफ़ॉल्ट parameterless सार्वजनिक निर्माता के साथ TableAdapter उदाहरण बनाने के बाद भी इसे बाद में आवंटित किया जा सकता है ..

SqlConnection connection; 
//create the connection here at runtime.. 
MyTableAdapter adapter = new MyTableAdapter(); 
adapter.(connection); 
0

डिजाइनर फ़ाइल को संपादित करना एक दर्द है।

मैं "उपयोगकर्ता ConnectionString 'कहा जाता है', जो दृश्य स्टूडियो एक आवेदन स्ट्रिंग बनाने बनाता है 'कनेक्शन STRING1 के तहत एक सेटिंग प्रविष्टि बनाया' जब आप एक दृढ़ता से लिखे गए डेटा सेट जोड़ें।

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

' के साथ 'ConnectionString1 IMHO यह एक कमी उन रनटाइम पर कनेक्शन तार को संशोधित करने की इजाजत दी है। (रेडमंड में कोई भी सुन रहा है?)

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