ASP.NET:كيفية إنشاء اتصال من شبكة الإنترنت.التكوين سلسلة_أحرف_الاتصال?

StackOverflow https://stackoverflow.com/questions/1046042

سؤال

كيف يمكنك بناء دبكونيكشن على أساس اسم مزود?

عينة اسم مزودs

  • النظام.البيانات.SqlClient
  • النظام.البيانات.OleDb
  • النظام.البيانات.Odbc
  • FirebirdSql.البيانات.FirebirdClient

لدي سلاسل الاتصال المخزنة في ملقم IIS على ويب.ملف التكوين:

<connectionStrings>
  <add name="development"
        connectionString="Provider = IBMDA400; Data Source = MY_SYSTEM_NAME; User Id = myUsername; Password = myPassword;" 
        providerName="System.Data.OleDb" />
  <add name="live" 
        connectionString="usd=sa;pwd=password;server=deathstar;" 
        providerName="System.Data.Odbc" />
  <add name="testing" 
        connectionString="usd=sa;pwd=password;server=deathstar;" 
        providerName="System.Data.SqlClient" />
  <add name="offline"
        connectionString="Server=localhost;User=SYSDBA;Password=masterkey;Charser=NONE;Database=c:\data\mydb.fdb"
        providerName="FirebirdSql.Data.FirebirdClient"/>

يمكنك أن ترى أنهم جميعا استخدام مختلف مقدمي الخدمات.عندما يحين الوقت بالنسبة لي لإنشاء اتصال, يجب أن تعرف ما هو نوع من دبكونيكشن لإنشاء مثل:

  • SqlConnection
  • OleDbConnection
  • OdbcConnection
  • FbConnection

على connectionStrings يحتوي على إدخالات يكون providername, ولكن هذه ليست أسماء دبكونيكشن سليل الطبقات ، ولكن يبدو أن هناك مساحة

كيف يمكنني تشغيل بناء دبكونيكشن على أساس سلسلة يكون providername?


public DbConnection GetConnection(String connectionName)
{
    //Get the connectionString infomation
    ConnectionStringSettings cs = 
          ConfigurationManager.ConnectionStrings[connectionName];
    if (cs == null)
       throw new ConfigurationException("Invalid connection name \""+connectionName+"\");

    //Create a connection based on the provider
    DbConnection conn = new DbConnection();

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

المحلول

إذا كنت تذهب في هذا الطريق ، أعتقد أنك سوف ترغب في استخدام DbProviderFactories فئة للحصول على دببروفيديرفاكتوري التي يمكنك استخدامها لإنشاء اتصال.لقد جربت هذا الكود لكن أعتقد أنه سوف يعمل.فمن الممكن أن كنت قد تحتاج إلى البحث عن اسم مزود باستخدام GetFactoryClasses الأسلوب على DbProviderFactories الدرجة واستخدام InvariantName.

public DbConnection GetConnection(String connectionName)
{
   //Get the connection string info from web.config
   ConnectionStringSettings cs= 
         ConfigurationManager.ConnectionStrings[connectionName];

   //documented to return null if it couldn't be found
   if (cs == null)
      throw new ConfigurationErrorsException("Invalid connection name \""+connectionName+"\"");

   //Get the factory for the given provider (e.g. "System.Data.SqlClient")
   DbProviderFactory factory = 
         DbProviderFactories.GetFactory(cs.ProviderName);

   //Undefined behaviour if GetFactory couldn't find a provider.
   //Defensive test for null factory anyway
   if (factory == null)
      throw new Exception("Could not obtain factory for provider \""+cs.ProviderName+"\"");

   //Have the factory give us the right connection object      
   DbConnection conn = factory.CreateConnection();

   //Undefined behaviour if CreateConnection failed
   //Defensive test for null connection anyway
   if (conn == null)
      throw new Exception("Could not obtain connection from factory");

   //Knowing the connection string, open the connection
   conn.ConnectionString = cs.ConnectionString;
   conn.Open()

   return conn;
}

نصائح أخرى

تحقق من هذا Hanselman بلوق على إضافة مخصصة لبناء أنواع مختلفة من سلاسل اتصال الأسماء يبدو أنه قد يصلح ما تريد تحقيقه بطريقة مختلفة من استخدام موفر أنواع.

إذا يكون providername معين اسم الاتصال (ديف, اختبار, prod) لا يتغير أبدا لماذا لا تفعل تبديل على connectionName المعلمة على الأسلوب الخاص بك وتعيين يكون providername سبيل المثال بهذه الطريقة ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top