C# 连接字符串:从配置文件转换为代码中的

C# 连接字符串:从配置文件转换为代码中的,c#,entity-framework,connection-string,C#,Entity Framework,Connection String,我在从主应用程序和类库获取实体框架连接字符串时遇到一些问题。我的主应用程序(一个*.exe)和类库(一个我想与Excel一起使用的COM*.dll)都需要创建到SQL Server CE数据库或SQL Server数据库的连接 目前,我在配置文件中定义了两个“基本”连接字符串,一个用于SQL Server CE实现,另一个用于SQL Server实现。这对我的主应用程序来说很好,因为它从配置文件(SQL Server CE或SQL Server)中读取适当的“基本”连接字符串,我调整连接字符串值

我在从主应用程序和类库获取实体框架连接字符串时遇到一些问题。我的主应用程序(一个*.exe)和类库(一个我想与Excel一起使用的COM*.dll)都需要创建到SQL Server CE数据库或SQL Server数据库的连接

目前,我在配置文件中定义了两个“基本”连接字符串,一个用于SQL Server CE实现,另一个用于SQL Server实现。这对我的主应用程序来说很好,因为它从配置文件(SQL Server CE或SQL Server)中读取适当的“基本”连接字符串,我调整连接字符串值(例如,对于SQL Server CE,通过“data source=”或对于SQL Server,通过“database name”调整文件位置),这样就可以了。但是,这对于我的类库来说并不好用,因为配置文件取决于使用类库的应用程序。因此,我希望通过在代码中定义连接字符串而不是在配置文件中定义连接字符串,完全摆脱对配置文件的依赖

当前配置文件配置如下所示:

<add name="ConnectionCE" providerName="System.Data.SqlServerCe.4.0" connectionString="" />

<add name="ConnectionServer" providerName="System.Data.SqlClient" connectionString="" />
var context = new DbContext("name=ConnectionCE")
//Do things with the context above here, e.g. change the connection string value.
如何转换“ConnectionOnce”和“ConnectionServer”连接字符串,使我不必依赖配置文件,并且可以直接在C#代码中创建它们(使用正确的提供程序)

谢谢

DbContext(string)
构造函数接受名称或连接字符串

您只需在代码中构建连接字符串并将其传递给构造函数

您可以使用
System.Data.SqlClient.SqlConnectionStringBuilder
类为SQL Server构建连接字符串。我认为,对于SQL Server CE连接字符串,使用
string.Format()
很容易

SQL Server的代码如下所示:

var connStr = new SqlConnectionStringBuilder
{
    InitialCatalog = "YourDb",
    IntegratedSecurity = true,
    DataSource = @".\SQLServer",
};
var db = new DbContext(connStr.ConnectionString);
应为SQL Server CE指定提供程序,因此代码如下所示:

var conn = DbProviderFactories.GetFactory("System.Data.SqlServerCe.4.0").CreateConnection();
conn.ConnectionString = "DataSource = \"C:\\ExistingDBFile.db\"";
var db = new DbContext(conn, true);
DbContext(string)
构造函数接受名称或连接字符串

您只需在代码中构建连接字符串并将其传递给构造函数

您可以使用
System.Data.SqlClient.SqlConnectionStringBuilder
类为SQL Server构建连接字符串。我认为,对于SQL Server CE连接字符串,使用
string.Format()
很容易

SQL Server的代码如下所示:

var connStr = new SqlConnectionStringBuilder
{
    InitialCatalog = "YourDb",
    IntegratedSecurity = true,
    DataSource = @".\SQLServer",
};
var db = new DbContext(connStr.ConnectionString);
应为SQL Server CE指定提供程序,因此代码如下所示:

var conn = DbProviderFactories.GetFactory("System.Data.SqlServerCe.4.0").CreateConnection();
conn.ConnectionString = "DataSource = \"C:\\ExistingDBFile.db\"";
var db = new DbContext(conn, true);

加上1提到ConnectionStringBuilderSo有趣的是,通过设置var db=new DbContext(@“DataSource=”C:\ExistingDBFile.db),这在我的主应用程序中同样可以正常工作。但是,只要我从类库中调用完全相同的代码,我就会得到异常“System.InvalidOperationException-提供的SqlConnection没有指定初始目录或AttachDBFileName”。DbContext在外部类库中定义(与给出异常的主应用程序和类库分开),因此,如果它适用于主应用程序,那么它将适用于Excel类库?默认情况下使用My bad.SqlClient提供。您需要为SQL CE显式指定提供程序。希望这能解决此问题。我在回答中添加了详细信息。谢谢,这很好。不幸的是,我仍然必须将配置文件添加到Excel目录中,如下所示否则我会得到一个“provider不存在”异常“在配置文件中使用适当的提供程序并通过相关EntityFramework dll进行复制,我使所有内容都正常工作。我本想完全摆脱配置文件,但考虑到外部应用程序(Excel)使用库,我想这是不可能的。另外,1提到ConnectionStringBuilder,有趣的是,在我的主应用程序中,通过设置var db=new DbContext(@“DataSource=“C:\ExistingDBFile.db”),这同样可以很好地工作。但是,只要我从类库中调用完全相同的代码,我就会得到异常“System.InvalidOperationException-提供的SqlConnection没有指定初始目录或AttachDBFileName”。DbContext在外部类库中定义(与给出异常的主应用程序和类库分开),因此,如果它适用于主应用程序,那么它将适用于Excel类库?默认情况下使用My bad.SqlClient提供。您需要为SQL CE显式指定提供程序。希望这能解决此问题。我在回答中添加了详细信息。谢谢,这很好。不幸的是,我仍然必须将配置文件添加到Excel目录中,如下所示否则我会得到一个“provider不存在”异常“在配置文件中使用适当的提供程序并通过相关EntityFramework dll进行复制,我使所有内容都正常工作。我本想完全删除配置文件,但考虑到外部应用程序(Excel)使用了库,我想这是不可能的。