【问题标题】:Modifying connection string with variables使用变量修改连接字符串
【发布时间】:2014-10-08 00:22:15
【问题描述】:

所以我的目标是拥有一个“设置表单”,它允许用户编辑连接字符串(通过更改数据库名称/服务器位置。

这样做的原因是,当可能没有任何 C# 经验(前端 GUI)的人很快更改服务器位置时,它需要能够更改。

我在 app.config 中创建了连接字符串,但找不到在 conn 字符串中分配可以更改的变量的方法?我使用项目属性创建了一些应用程序范围的设置。这是我的 app.config

<connectionStrings>
    <add name="xxxx"
        connectionString="Data Source=ServerIP;Initial Catalog=DBName;Persist Security Info=True;User ID=user;Password=password"
        providerName="System.Data.SqlClient" />
</connectionStrings>
<applicationSettings>
    <xxx.Properties.Settings>
        <setting name="ServerIP" serializeAs="String">
            <value />
        </setting>
        <setting name="DBName" serializeAs="String">
            <value />
        </setting>
    </xxx.Properties.Settings>
</applicationSettings>

【问题讨论】:

标签: c# connection-string appsettings


【解决方案1】:

试试SqlConnectionStringBuilder 类。

using System.Data;
using System.Data.SqlClient;

class Program
{
static void Main()
{
    // Create a new SqlConnectionStringBuilder and
    // initialize it with a few name/value pairs.
    SqlConnectionStringBuilder builder =
        new SqlConnectionStringBuilder(GetConnectionString());

    // The input connection string used the
    // Server key, but the new connection string uses
    // the well-known Data Source key instead.
    Console.WriteLine(builder.ConnectionString);

    // Pass the SqlConnectionStringBuilder an existing
    // connection string, and you can retrieve and
    // modify any of the elements.
    builder.ConnectionString = "server=(local);user id=ab;" +
        "password= a!Pass113;initial catalog=AdventureWorks";

    // Now that the connection string has been parsed,
    // you can work with individual items.
    Console.WriteLine(builder.Password);
    builder.Password = "new@1Password";
    builder.AsynchronousProcessing = true;

    // You can refer to connection keys using strings,
    // as well. When you use this technique (the default
    // Item property in Visual Basic, or the indexer in C#),
    // you can specify any synonym for the connection string key
    // name.
    builder["Server"] = ".";
    builder["Connect Timeout"] = 1000;
    builder["Trusted_Connection"] = true;
    Console.WriteLine(builder.ConnectionString);

    Console.WriteLine("Press Enter to finish.");
    Console.ReadLine();
}

private static string GetConnectionString()
{
    // To avoid storing the connection string in your code,
    // you can retrieve it from a configuration file.
    return "Server=(local);Integrated Security=SSPI;" +
        "Initial Catalog=AdventureWorks";
}

}

【讨论】:

    【解决方案2】:

    实现此目的的一种方法是对配置文件中连接字符串的这些部分使用占位符({0}{1}),如下所示:

    Data Source={0};Initial Catalog={1};Persist Security Info=True;User ID=user;Password=password
    

    然后当您在代码中读取连接字符串时,通过string.Format 填写它们,如下例所示。 (注意:这假设您已添加对 System.Configuration.dll 的引用,并且您已将应用程序设置检索到两个变量中,serverIPdbName。)

    using System.Configuration;
    
    ...
    
    string connectionString = string.Format(
        ConfigurationManager.ConnectionStrings["xxxx"].ConnectionString,
        serverIP,
        dbName);
    

    【讨论】:

    • 好的,非常感谢,我试一试。所以基本上如果我想要更多变量,我只需按照创建变量的顺序添加更多占位符 {3} 和 {4} 等?
    • 可以,但不要跳过{2}。 :-)
    • 快点:你知道是否有办法使用带有 SqLConnection 类型的 string.format 吗?当我使用它打开连接时:即 SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["AlexDatabaseConnection"].ConnectionString, AlexDBServerIP);连接.打开();它不承认只是在之后添加变量。谢谢
    • 从上面设置connectionString后,你应该可以这样做了:SqlConnection connection = new SqlConnection(connectionString); connection.Open();
    • 嗨,Troy,“string connectionString = string.Format(ConfigurationManager.ConnectionStrings["xxxx"].ConnectionString, serverIP, dbName);"放置?在 Program.cs 中?谢谢。
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    相关资源
    最近更新 更多