C# استرداد كائن DBConnection الصحيح عن طريق سلسلة الاتصال
-
06-07-2019 - |
سؤال
لديّ سلسلة اتصال يتم تمريرها إلى وظيفة ، وأحتاج إلى إنشاء كائن قائم على DBConnection (أي SQLConnection ، OracleConnection ، OLEDBConnection وما إلى ذلك) استنادًا إلى هذه السلسلة.
هل هناك أي وظيفة في ثنائية المليئة بالقيام بذلك ، أو أي مكتبات طرف ثالثة للمساعدة. نحن لا نبني بالضرورة سلسلة الاتصال هذه ، لذلك لا يمكننا الاعتماد على تنسيق تتم كتابة السلسلة لتحديد نوعها ، وأود أن تفضل عدم الاضطرار إلى ترميز جميع المجموعات وتباديل سلاسل الاتصال المحتملة
المحلول
DbConnection GetConnection(string connStr)
{ string providerName = null;
var csb = new DbConnectionStringBuilder{ConnectionString=connStr};
if (csb.ContainsKey("provider"))
{ providerName = csb["provider"].ToString();
}
else
{ var css = ConfigurationManager
.ConnectionStrings
.Cast<ConnectionStringSettings>()
.FirstOrDefault(x=>x.ConnectionString==connStr);
if (css != null) providerName = css.ProviderName;
}
if (providerName != null)
{ var providerExists = DbProviderFactories
.GetFactoryClasses()
.Rows.Cast<DataRow>()
.Any(r=>r[2].Equals(providerName));
if (providerExists)
{ var factory = DbProviderFactories.GetFactory(providerName);
var dbConnection = factory.CreateConnection();
dbConnection.ConnectionString = connStr;
return dbConnection;
}
}
return null;
}
نصائح أخرى
إذا كنت تستخدم Framework 2.0 أو أعلى ، ويمكنك جعلهم يمرون في سلسلة ثانية مع فئة برنامج التشغيل ، يمكنك استخدام فئة DBProviderFactory لتحميل برنامج التشغيل لك.
DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(myDriverClass);
DbConnection dbConnection = dbProviderFactory.CreateConnection();
dbConnection.ConnectionString = myConnectionString;
إليك رابط MSDN لفئة المصنع:http://msdn.microsoft.com/en-us/library/wda6c36e.aspx
يجب أن تكون قادرًا على تحليل قسم المزود ونقله إلى dbproviderfactories.getFactory الذي سيعيد ODBCFActory أو OLEDBFACTORY أو SQLCLINTFACTORY ويسمح لك بعد ذلك بإجراء CreateConnection وما إلى ذلك.
لست متأكدًا من كيفية عمل هذا مع Oracle ما لم يقدم OracledBfactory.
تحتوي معظم سلاسل الاتصال (على الأقل في .NET 2.0) أيضًا على خاصية اسم ProviderName تتناسب معها. لذلك سيكون لسلسلة اتصال SQL اسم مزود مثل:
providerName="System.Data.SqlClient"
لذلك ستحتاج طريقتك إلى قبول كل من سلسلة الاتصال واسم المزود ، ثم يمكنك استخدام DBProviderFactory كما ذكر دامينج.