C# 更改连接字符串

C# 更改连接字符串,c#,winforms,deployment,connection-string,application-settings,C#,Winforms,Deployment,Connection String,Application Settings,当我将myProg.exe安装到客户端计算机时,我必须调整connectionString 因此,我打开了文件MyProg.exe.config,并修改了connectionString,但它不起作用 然后我找到了这个。现在的问题是,当我将access修改为public时,我无法编译/部署它 我的App.config <?xml version="1.0" encoding="utf-8"?> <configuration> <configSections

当我将myProg.exe安装到客户端计算机时,我必须调整connectionString

因此,我打开了文件MyProg.exe.config,并修改了connectionString,但它不起作用

然后我找到了这个。现在的问题是,当我将access修改为public时,我无法编译/部署它

我的App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>

    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="FrontEnd_Offline.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <system.windows.forms jitDebugging="true" />
  <connectionStrings>
    <add name="Soft8Exp_ClientConnStr" connectionString="Data Source=xxxxx;Initial Catalog=xxxxx;User ID=sa;Password=xxxxx" providerName="System.Data.SqlClient" />
    <add name="Soft8Exp_ClientEntities" connectionString="metadata=res://*/Domain.Entite_T.csdl|res://*/Domain.Entite_T.ssdl|res://*/Domain.Entite_T.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=xxxxx;initial catalog=xxxxx;user id=sa;password=xxxxx;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
    <add name="FrontEnd_Offline.Properties.Settings.Soft8Exp_ClientConnectionString" connectionString="Data Source=xxxxx;Initial Catalog=xxxxx;User ID=sa;Password=xxxxx" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <applicationSettings>
    <FrontEnd_Offline.Properties.Settings>
      <setting name="NO_ORDRE" serializeAs="String">
        <value />
      </setting>
    </FrontEnd_Offline.Properties.Settings>
  </applicationSettings>
</configuration>

你是说连接到数据库的字符串吗?如果是这样,应该在数据库连接类中更改它。 如果数据库也存储在本地,则本地设备上的connectionString应类似于正常路径。 像这样:

"C:\\Some_location\\database.extension"

扩展名取决于您使用的数据库类型,请将此字符串更改为数据库的位置。

开始时您没有说您正在使用ClickOnce。这里的情况不同:配置文件存储在用户的配置文件中。您不能更改文件后缀(仅通过应用程序更改用户设置)

要使用新的连接字符串更新ClickOnce程序,我建议如下:

  • 创建名为“SettingsUpgradeNeeded”的新用户设置,并在设置设计器中将其设置为
    true
  • 将以下代码添加到应用程序的启动代码(Program.cs或App.cs)

  • 发布新的更新

  • 另一种更改连接的方法是(如果只在代码中使用
    SqlConnection
    ,则更可取):

  • 停止使用
    ConnectionStrings
    部分
  • 为每个连接参数创建一个设置(例如:数据库服务器、数据库名称等)
  • 使用
    SqlConnectionStringBuilder
    从这些设置生成连接字符串
  • 编辑
    您希望用户能够更改连接参数:

  • 为需要连接到数据库的每个参数(例如:服务器、数据库、故障切换伙伴、用户名、身份验证方法等)创建用户设置
  • 创建一个对话框,您可以在其中配置这些值
  • 使用
    SqlConnectionStringBuilder
    从这些值创建连接字符串
  • 将该连接字符串用于所有数据库连接
  • 例如:

    SqlConnectionStringBuilder sb = new SqlConnectionStringBuilder();
    sb.DataSource = Properties.Settings.Default.DBServerName;
    sb.InitialCatalog = Properties.Settings.Default.DBDatabaseName;
    sb.IntegratedSecurity = Properties.Settings.Default.DBUseIntegratedSecurity;
    if (!sb.IntegratedSecurity)
    {
        sb.UserId = Properties.Settings.Default.DBUserName;
        sb.Password = Properties.Settings.Default.DBPassword;
    }
    
    
    using (SqlConnection conn = new SqlConnect(sb.ConnectionString))
    {
        ...
    }
    

    我将在Program.cs或
    App
    类中生成一个静态属性,该属性可以从
    SqlConnectionStringBuilder
    返回连接字符串,这是什么意思:“但它不工作”?你有错误吗?有什么问题吗?通常,当连接字符串存储在exe.config文件中时,会使用它。修改时,将使用修改后的连接字符串。我们一直在为Windows服务执行此操作。您尝试过吗?能否显示app.config中保存/设置连接字符串的相关部分?我怀疑您有问题。@ThorstenDittmar不工作,这意味着它没有读取Myprog.exe.config。因为我做了一个实验:在ClickOnce部署之前,我调整了connectionString客户端,它工作得很好。然后我用其他变量修改了Myprof.exe.config,使其不起作用,但它仍然起作用……这证明了Myprog.exe.config根本没有被读取。好的。无论是ClickOnce还是通过应用程序的正常安装,都无法更改配置文件的连接字符串部分。我建议您阅读a)有关.NET设置机制(特别是用户设置)的文档,b)我的答案。简而言之:为每个连接参数创建用户设置。创建一个对话框,用户可以在其中更改用户设置。使用
    SqlConnectionStringBuilder
    从用户设置创建连接字符串。请参阅我编辑的答案。
    if (Properties.Settings.Default.SettingsUpgradeNeeded)
    {
        Properties.Settings.Default.Upgrade();
        Properties.Settings.Default.SettingsUpgradeNeeded = false;
        Properties.Settings.Default.Save();
    }
    
    SqlConnectionStringBuilder sb = new SqlConnectionStringBuilder();
    sb.DataSource = Properties.Settings.Default.DBServerName;
    sb.InitialCatalog = Properties.Settings.Default.DBDatabaseName;
    sb.IntegratedSecurity = Properties.Settings.Default.DBUseIntegratedSecurity;
    if (!sb.IntegratedSecurity)
    {
        sb.UserId = Properties.Settings.Default.DBUserName;
        sb.Password = Properties.Settings.Default.DBPassword;
    }
    
    
    using (SqlConnection conn = new SqlConnect(sb.ConnectionString))
    {
        ...
    }