سؤال

هل من الممكن تعديل connectionstrings محددة في التطبيق.config/ويب.التكوين في وقت التشغيل?أريد أن استخدام مختلف configfiles اعتمادا على آلة التطبيق/الموقع يتم تشغيله على (فقط لأغراض التصحيح بالطبع.سنستخدم العادية ملفات التكوين عند نشرها).

أستطيع أن أكتب AppSettings ، ولكن ليس ConnectionStrings (AFAIK).أو يمكن أنا ؟

هل كانت مفيدة؟

المحلول

نعم انه من الممكن، ولكن AFAIK فقط عن طريق التأمل. التعليمة البرمجية التالية ينبغي أن تفعل ما تريد (اقرأ أدناه للحصول على الاستخدام):

public static string SetConnectionString(Type assemblyMember,
                                         Type settingsClass,
                                         string newConnectionString,
                                         string connectionStringKey)
{
  Type typSettings = Type.GetType(Assembly.CreateQualifiedName(assemblyMember.Assembly.FullName, settingsClass.FullName));

  if (typSettings == null)
  {
    return null;
  }

  PropertyInfo prpDefault = typSettings.GetProperty("Default", BindingFlags.Static | BindingFlags.Public);

  if (prpDefault == null)
  {
    return null;
  }

  object objSettings = prpDefault.GetValue(null, null);

  if (objSettings == null)
  {
    return null;
  }

  // the default property, this[], is actually named Item
  PropertyInfo prpItem = objSettings.GetType().GetProperty("Item", BindingFlags.Instance | BindingFlags.Public);

  if (prpItem == null)
  {
    return null;
  }

  object[] indexerName = { connectionStringKey };
  string oldConnectionString = (string)prpItem.GetValue(objSettings, indexerName);

  prpItem.SetValue(objSettings, newConnectionString, indexerName);

  return oldConnectionString;
}

وassemblyMember هو نوع الدعوة
settingsClass هو نوع من الدرجة الإعدادات
newConnectionString هي السلسلة الكاملة لوضع
connectionStringKey هو اسم سلسلة الاتصال التي قمت بتعريفها في إعدادات التطبيق الخاص بك

ويجب استدعاء هذا الأسلوب في أقرب وقت ممكن بعد بدء التطبيق، ويفضل في طريقة الرئيسية ().

نصائح أخرى

وحاولت ذلك مرة واحدة في مشروعي من أجل التصحيح الغرض ولكن لا يمكن أن نفعل ذلك، فإن المشكلة (اعتقد، تصحيح لي إذا كنت مخطئا) هي على التطبيق بدء يحصل على تحميل app.config في الذاكرة، وأية تغييرات app.config أثناء تشغيل التطبيق لا يحصل ينعكس.

لتجاوز هذه هنا هو ما فعلته، وتحديد كل connectionstrings في app.config ومن ثم استدعاء تلك التي تريد عند تشغيل البرنامج من هذا القبيل.

وعلى سبيل المثال لنفترض قمت بتعريفه connectionstrings الخاصة بك في app.config على النحو التالي.

<connectionStrings>
    <add name="YourNameSpace.Properties.Settings.ConnectionString_1"
        connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data  
        Source=|DataDirectory|\file.mdb"
        providerName="System.Data.OleDb"/>

    <add name="YourNameSpace.Properties.Settings.ConnectionString_2"
        connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data  
        Source=|DataDirectory|\file.mdb"
        providerName="System.Data.OleDb"/>

</connectionStrings>

وتحديد ما يصل كما تريد (تقوم بتصحيحه :-) الأيمن) ثم استدعاء هؤلاء إعدادات الاتصال في التعليمات البرمجية تفعل شيئا من هذا القبيل:

وYourNameSpace.Properties.Settings فو = YourNameSapce.Properties.Settings جديدة ()؛

وfoo.ConnectionString_1؛

وHTH

وأطيب التحيات

وnand

وP.S: هذا الرد غير محددة إلى C #

وأنت لا يمكن حقا تعديل ملف التكوين من عملية التشغيل.

وخيار واحد (مع إيجابيات وسلبيات) هو استخدام البيانات التكوين في machine.config أو الملف web.config الرئيسي (لل"الموقع"، يمكنك استخدام العقد "الموقع") - ليس خيارا التسرع في، على الرغم من .

وهناك طريقة أفضل للتعامل مع هذا هو لمبادلة ملف التكوين كجزء من الإنشاء الخاصة بك / عملية، مؤتمتة بشكل مثالي نشر. وبهذه الطريقة، كل شيء قائم بذاته، ويمكنك ان "كيكر" إلى خادم الفانيليا ويكون ذلك العمل.


وإعادة الخاص بك "في تطوير" نقطة. لقد وجدت أن أسهل طريقة للقيام بذلك هي لتوحيد التكوين، وقرص الآلات. على سبيل المثال، ونحن تشغيل خادم الويب المحلي على VM. بدلا من قانون ضد كل آلة، ونحن توحيد على "localserver" (إلى المرآة "مضيف")، وإضافة سجل DNS المحلي إلى كل جهاز أن المطور يمكن السيطرة عليها. لاحظ أن هذا يتطلب عناوين IP ثابتة (أو ربما حجز DHCP) لمنع ذلك تغيير مع مرور الوقت!

وقواعد البيانات كما سبق. يمكن الخوادم المحلية استخدام ".". يمكن تعيين الاسم المستعار للخدمة المناطق النائية على الجهاز، لذلك نقطة "devserver" على كل ما يريد المستخدم.

ومجرد التفكير ...

هل يمكن تشغيل xmlpoke في نانت النصي عند تثبيت الموقع.

E. g.

  1. نشر نانت مع الموقع.
  2. إنشاء الذهاب.بات يدعو نانت الذي يقوم بتثبيت الموقع و لا xmlpoke إلى تعديل شبكة الإنترنت.التكوين مع إعدادات استنادا إلى اسم الملقم أو المعلمة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top