ASP.NET:如何从 web.config ConnectionString 创建连接?
如何根据提供者名称构建DbConnection?
示例提供程序名称s
- System.Data.SqlClient
- System.Data.OleDb
- System.Data.Odbc
- FirebirdSql.Data.FirebirdClient
我将连接字符串存储在 IIS 服务器的 web.config 文件中:
<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"/>
您可以看到他们都使用不同的提供商。 当我创建连接时,我必须知道要创建哪种类型的 DbConnection,例如:
- SqlConnection
- OleDbConnection
- OdbcConnection
- FbConnection
连接字符串条目包含 providerName,但这些不是DbConnection 后代类,但似乎是一个命名空间
我如何基于字符串 providerName 构造 DbConnection?
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();
}
How do you construct a DbConnection based on a provider name?
Sample provider names
- System.Data.SqlClient
- System.Data.OleDb
- System.Data.Odbc
- FirebirdSql.Data.FirebirdClient
i have connection strings stored in my IIS server's web.config file:
<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"/>
You can see they all use different providers. When it comes time for me to create a connection, i have to know what kind of DbConnection to create, e.g.:
- SqlConnection
- OleDbConnection
- OdbcConnection
- FbConnection
The connectionStrings entries contains a providerName, but these aren't the names of DbConnection descendant classes, but appear to be a namespace
How do i turn construct a DbConnection based on a string 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();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您选择这条路线,我想您会想要使用 DbProviderFactories 类来获取可用于构造连接的 DbProviderFactory。 我还没有尝试过这段代码,但我认为它会起作用。 您可能需要使用 DbProviderFactories 类上的 GetFactoryClasses 方法查找提供程序名称并使用 InvariantName。
If you go this route, I think you'll want to use the DbProviderFactories class to get a DbProviderFactory that you can use to construct the connection. I haven't tried this code out, but I think it will work. It's possible that you may need to look up the provider name using the GetFactoryClasses method on the DbProviderFactories class and use the InvariantName.
查看 此 Hanselman 博客,了解如何为不同的连接字符串名称添加自定义构建类型,看起来就像它可能适合您想要以与使用提供者类型不同的方式完成的任务。
Check out this Hanselman blog on adding custom build types for different connection strings names, it looks like it may fit what you want to accomplish in a different way than using the provider types.
如果特定连接名称(dev、test、prod)的providerName永远不会改变,为什么不能为您的方法切换connectionName参数并以这种方式设置providerName实例?
If the providerName for the particular connection name (dev, test, prod) never changes why cant you do a switch on the connectionName param for your method and set the providerName instance that way?