【问题标题】:How to get the DataSource, UserID and Password from an Entity ConnectionString?如何从实体 ConnectionString 中获取数据源、用户 ID 和密码?
【发布时间】:2015-06-27 00:29:59
【问题描述】:

我们有一个与实体框架一起工作的 ASP.NET MVC Web 应用程序。到目前为止一切都很好,但现在我需要实现一个函数,允许将大量数据导入存档表。

我需要导入的数据是一个 SQL Server Compact 数据库文件,我可以通过 Web 应用程序上传和处理该文件。我的第一次尝试是读取行并为每一行创建新对象,我将其添加到该类型的列表中。然后我使用 EF 的 AddRange() 方法将行添加到数据库中。

由于内存和性能问题,即使导入文件很小,这种方法也不起作用。所以我用谷歌搜索了一下,决定使用 SQL 批量插入(从而绕过 EF),这被明确表示为最高效的方式。

在我的web.config 中,我有 EF 连接字符串,其中还包含访问数据库所需的数据。由于我需要使用SqlConnection,因此我确实需要一个有效的 SQLProvider ConnectionString。在这种情况下,EF 连接字符串不起作用,因为 SqlConnection 无法使用其他条目(导致“不支持的关键字:元数据”等错误)。

所以我想用SqlConnectionStringBuilder 构建一个新的SqlConnection 连接字符串。我只需要三个参数:UserID、Password 和 DataSource。所有这些都存在于 EF 连接字符串中。

如何从现有的 EF 连接中获取它们?我绝对不想要一些丑陋的解析/正则表达式,但我不知道如何获取这些值。

【问题讨论】:

  • 我知道这不是问题的一部分,但你为什么不在 web.config 中添加一个新的连接字符串,而不是尝试使用现有的来构建一个新的?
  • 你说得对,我可以简单地添加另一个连接字符串,但是由于所需的数据已经存在,我想使用现有的。

标签: c# sql-server entity-framework connection-string bulkinsert


【解决方案1】:

您可以尝试将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;
 }

【讨论】:

  • 备注:不需要打开SqlConnection获取DataSource。
【解决方案2】:

尽管这是一个老问题,但我还是发布了一个回复,希望其他人会觉得它有用。

对于不想打开连接只是为了获取数据源、用户凭据等属性的人来说,接受的答案可能并不好。

这就是我的做法:

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=&quot;data source=D-SQL203;initial catalog=Genus_AIS_TaskDev_SB4;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" 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();
}

如果您要在连接字符串中设置用户名和密码,您将能够如下检索它们:

string userID = sqlConnectionStringBuilder.UserID;
string password = sqlConnectionStringBuilder.Password;

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    相关资源
    最近更新 更多