如何从实体连接字符串中获取数据源、用户 ID 和密码?
How to get the DataSource, UserID and Password from an Entity ConnectionString?
我们有一个 ASP.NET MVC 网络应用程序可以与 Entity Framework 配合使用。到目前为止一切都很好,但现在我需要实现一个允许将大量数据导入存档的功能 table.
我需要导入的数据是 SQL Server Compact 数据库文件,我可以通过 Web 应用程序上传和处理该文件。我的第一次尝试是读入行并为每一行创建新对象,我将其添加到该类型的列表中。然后我使用 EF 的 AddRange()
方法将行添加到数据库中。
由于内存和性能问题,此方法无效,即使导入文件很小。因此,我在谷歌上搜索了一下,决定采用 SQL 批量插入 (从而绕过 EF),这被明确表述为性能最高的方式。
在我的 web.config
中,我有 EF 连接字符串,其中还包含访问数据库所需的数据。因为我需要使用 SqlConnection
,所以我确实需要一个有效的 SQLProvider ConnectionString。 EF 连接字符串在这种情况下不起作用,因为 SqlConnection 无法使用其他条目(导致 "unsupported keyword: metadata" 等错误)。
所以我想用 SqlConnectionStringBuilder
构建一个新的 SqlConnection 连接字符串。我只需要三个参数:UserID、Password 和DataSource。所有这些都存在于 EF 连接字符串中。
如何从我现有的 EF 连接中获取它们?我绝对不想要一些丑陋的东西 parsing/regexing,但我不知道如何获得这些值。
您可以尝试将 EntityConnection
直接转换为 SqlConnection
。这也将使您能够访问所需的信息。
using (var ec = new EntityConnection(connstr.ConnectionString))
{
var sqlConn = ec.StoreConnection as SqlConnection;
sqlConn.Open();
var dataSource = sqlConn.DataSource;
var userId = sqlConn.Credential.UserId;
var password = sqlConn.Credential.Password;
}
尽管这是一个老问题,但我发布了一个回复,希望其他人可能会觉得它有用。
对于那些不想打开连接只是为了获取数据源、用户凭据等属性的人来说,接受的答案可能不太好
这就是我的处理方式:
Web.Config 文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="Genus_Connection_String" connectionString="metadata=res://*/GenusEFModel.csdl|res://*/GenusEFModel.ssdl|res://*/GenusEFModel.msl;provider=System.Data.SqlClient;provider connection string="data source=D-SQL203;initial catalog=Genus_AIS_TaskDev_SB4;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient"/>
</connectionStrings>
</configuration>
检索连接字符串的代码:
static void Main(string[] args)
{
ConnectionStringSettings genusSettings = ConfigurationManager.ConnectionStrings["Genus_Connection_String"];
if (genusSettings == null || string.IsNullOrEmpty(genusSettings.ConnectionString))
{
throw new Exception("Fatal error: Missing connection string 'Genus_Connection_String' in web.config file");
}
string genusConnectionString = genusSettings.ConnectionString;
EntityConnectionStringBuilder entityConnectionStringBuilder = new EntityConnectionStringBuilder(genusConnectionString);
SqlConnectionStringBuilder sqlConnectionStringBuilder = new SqlConnectionStringBuilder(entityConnectionStringBuilder.ProviderConnectionString);
string genusSqlServerName = sqlConnectionStringBuilder.DataSource;
string genusDatabaseName = sqlConnectionStringBuilder.InitialCatalog;
Console.WriteLine("genusSqlServerName = " + genusSqlServerName);
Console.WriteLine("genusDatabaseName = " + genusDatabaseName);
Console.ReadLine();
}
如果您要在连接字符串中设置用户 ID 和密码,您将能够按如下方式检索它们:
string userID = sqlConnectionStringBuilder.UserID;
string password = sqlConnectionStringBuilder.Password;
我们有一个 ASP.NET MVC 网络应用程序可以与 Entity Framework 配合使用。到目前为止一切都很好,但现在我需要实现一个允许将大量数据导入存档的功能 table.
我需要导入的数据是 SQL Server Compact 数据库文件,我可以通过 Web 应用程序上传和处理该文件。我的第一次尝试是读入行并为每一行创建新对象,我将其添加到该类型的列表中。然后我使用 EF 的 AddRange()
方法将行添加到数据库中。
由于内存和性能问题,此方法无效,即使导入文件很小。因此,我在谷歌上搜索了一下,决定采用 SQL 批量插入 (从而绕过 EF),这被明确表述为性能最高的方式。
在我的 web.config
中,我有 EF 连接字符串,其中还包含访问数据库所需的数据。因为我需要使用 SqlConnection
,所以我确实需要一个有效的 SQLProvider ConnectionString。 EF 连接字符串在这种情况下不起作用,因为 SqlConnection 无法使用其他条目(导致 "unsupported keyword: metadata" 等错误)。
所以我想用 SqlConnectionStringBuilder
构建一个新的 SqlConnection 连接字符串。我只需要三个参数:UserID、Password 和DataSource。所有这些都存在于 EF 连接字符串中。
如何从我现有的 EF 连接中获取它们?我绝对不想要一些丑陋的东西 parsing/regexing,但我不知道如何获得这些值。
您可以尝试将 EntityConnection
直接转换为 SqlConnection
。这也将使您能够访问所需的信息。
using (var ec = new EntityConnection(connstr.ConnectionString))
{
var sqlConn = ec.StoreConnection as SqlConnection;
sqlConn.Open();
var dataSource = sqlConn.DataSource;
var userId = sqlConn.Credential.UserId;
var password = sqlConn.Credential.Password;
}
尽管这是一个老问题,但我发布了一个回复,希望其他人可能会觉得它有用。
对于那些不想打开连接只是为了获取数据源、用户凭据等属性的人来说,接受的答案可能不太好
这就是我的处理方式:
Web.Config 文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="Genus_Connection_String" connectionString="metadata=res://*/GenusEFModel.csdl|res://*/GenusEFModel.ssdl|res://*/GenusEFModel.msl;provider=System.Data.SqlClient;provider connection string="data source=D-SQL203;initial catalog=Genus_AIS_TaskDev_SB4;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient"/>
</connectionStrings>
</configuration>
检索连接字符串的代码:
static void Main(string[] args)
{
ConnectionStringSettings genusSettings = ConfigurationManager.ConnectionStrings["Genus_Connection_String"];
if (genusSettings == null || string.IsNullOrEmpty(genusSettings.ConnectionString))
{
throw new Exception("Fatal error: Missing connection string 'Genus_Connection_String' in web.config file");
}
string genusConnectionString = genusSettings.ConnectionString;
EntityConnectionStringBuilder entityConnectionStringBuilder = new EntityConnectionStringBuilder(genusConnectionString);
SqlConnectionStringBuilder sqlConnectionStringBuilder = new SqlConnectionStringBuilder(entityConnectionStringBuilder.ProviderConnectionString);
string genusSqlServerName = sqlConnectionStringBuilder.DataSource;
string genusDatabaseName = sqlConnectionStringBuilder.InitialCatalog;
Console.WriteLine("genusSqlServerName = " + genusSqlServerName);
Console.WriteLine("genusDatabaseName = " + genusDatabaseName);
Console.ReadLine();
}
如果您要在连接字符串中设置用户 ID 和密码,您将能够按如下方式检索它们:
string userID = sqlConnectionStringBuilder.UserID;
string password = sqlConnectionStringBuilder.Password;