【问题标题】:Allow User Input To Determine SQL Server Connection String允许用户输入以确定 SQL Server 连接字符串
【发布时间】:2013-03-20 06:14:36
【问题描述】:

由于我正在开发的应用程序需要访问多个服务器,我希望允许用户从下拉列表中选择他们希望访问的“站点”,并相应地更新连接字符串。

我有两个想法(伪代码);

IF (drop-down value = Site2)
{string connectionString = "Server=server2; Database=db......"}

ELSE IF(drop-down value = Site3.....

或者;

string @server = drop-down value;

string connectionString = "Server=@server; Database=db......"
"pass connection variable??"

以下哪种方法最好?还是有更有效的替代方案?

我不确定如何将变量传递给连接字符串(选项 2)。

【问题讨论】:

    标签: c# sql sql-server winforms


    【解决方案1】:

    如果您需要“超级动态”,那么 Davio 有正确的选择。

    如果您需要“我有 N 个数据库,可能会不时更改”,那么我建议:

    以下是典型的Dot Net 2.0及以上配置。

    <connectionStrings>
    <add name="EastCoastConnectionString" connectionString="server=server01;database=myDb;uid=myUser;password=myPass;" />
    <add name="WestCoastConnectionString" connectionString="server=server02;database=myDb;uid=myUser;password=myPass;" />
    </connectionStrings>
    

    然后创建一个自定义配置部分,将“友好名称”映射到连接字符串。

    找到这个代码: How to include simple collections in ConfigurationSection

      <TransformationToDirectoryMappingsSection>
        <TransformationToDirectoryMappings>
          <add FriendlyName="NY Giants" PickupFolder="EastCoastConnectionString" />
          <add FriendlyName="NE Patriots" PickupFolder="EastCoastConnectionString" />
          <add FriendlyName="Carolina Panthers" PickupFolder="EastCoastConnectionString" />
    
          <add FriendlyName="San Francisco 49ers" PickupFolder="WestCoastConnectionString" / >
          <add FriendlyName="Seattle Seahawks" PickupFolder="WestCoastConnectionString" />
          <add FriendlyName="Arizona Cardinals" PickupFolder="WestCoastConnectionString" />
        </TransformationToDirectoryMappings>
      </TransformationToDirectoryMappingsSection>
    </configuration >
    

    然后用所有“FriendlyName”填充一个下拉框......然后您可以将其映射回连接字符串。

    现在,您可以使用连接字符串的名称填充下拉列表......但我不喜欢这个想法......我更喜欢“友好名称”而不是“实际名称”映射。


    至少,在您的配置文件中设置连接字符串.....,并用以下内容填充您的下拉列表:

    http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.connectionstrings.aspx

      ConnectionStringSettingsCollection connections = ConfigurationManager.ConnectionStrings;
    
        foreach (ConnectionStringSettings connection in connections)
        {
          string name = connection.Name;
    
        }
    

    【讨论】:

      【解决方案2】:

      除了使用 SqlConnectionStringBuilder 之外,我还将显示名称和连接字符串包装在表单中的嵌套类中。 像这样(在表单/用户控件中):

          private void PopulateComboBox(ComboBox comboBox)
          {
              var items = new[]
                  {
                      new ConnectionListItem {DisplayName = "Site 1", ConnectionString = new SqlConnectionStringBuilder("Server=...")},
                      new ConnectionListItem {DisplayName = "Site 2", ConnectionString = new SqlConnectionStringBuilder("Server=...")},
                  };
      
              comboBox.Items.AddRange(items);
      
          }
      
          class ConnectionListItem
          {
              public string DisplayName { get; set; }
              public SqlConnectionStringBuilder ConnectionString { get; set; }
      
              public override string ToString()
              {
                  return DisplayName;
              }
          }
      

      【讨论】:

        【解决方案3】:
            string ConnectionString;
            switch (comboBox1.SelectedIndex)
            {
                case 0:
                    ConnectionString = "Data Source=server1;Initial Catalog=database1;User ID=user1;Password=password1";
                    break;
                case 1:
                    ConnectionString = "Data Source=server2;Initial Catalog=database2;User ID=user1;Password=password2";
                    break;
                case 3:
                    ConnectionString = "Data Source=server3;Initial Catalog=database3;User ID=user1;Password=password3";
                    break;
            }
            SqlConnection Con = new SqlConnection(ConnectionString);
            Con.Open();
        

        【讨论】:

        • 那么你从哪里得到它们呢?用户输入?
        • @granadaCoder 值是从下拉列表中选择的 - 我不希望用户输入他们选择的服务器。
        • 老兄,请不要对连接字符串进行硬编码,即使唯一的区别是服务器名............继承你代码的人会恨你。跨度>
        • 所以您从未在 QA 环境中测试您的代码?直接投入生产?代码构建后如何处理不同的环境?......哇。
        • 不,这不会直接投入生产,谁说过这样做?安顿下来。
        【解决方案4】:

        看看SqlConnectionStringBuilder class。

        例如

        var builder = new SqlConnectionStringBuilder();
        builder.DataSource = /* your server here */;
        builder.InitialCatalog = "db";
        /* etc.... */
        var connString = builder.ConnectionString;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-25
          • 1970-01-01
          • 2011-05-31
          • 1970-01-01
          • 1970-01-01
          • 2011-02-22
          • 1970-01-01
          • 2017-05-11
          相关资源
          最近更新 更多