【问题标题】:Read/write Database Connection string in xml file using c# Windows Form使用 c# Windows 窗体在 xml 文件中读/写数据库连接字符串
【发布时间】:2014-05-25 14:21:03
【问题描述】:

我正在开发一个需要从 oracle 数据库服务器获取数据的 c# 应用程序。 在我的应用程序中,我不想制作硬编码连接字符串,因为有时我们必须将它与不同的数据库连接(出于测试目的,它具有相同的架构)。

为此,我有一个计划,我使用此表单创建一个 xml 文件和一个新表单(具有管理员权限),我在 xml 文件中更新/插入数据库凭据或使用 app。 config,但问题是我不知道如何以预定义的方式读取和写入 xml 文件(以与连接字符串相同的方式)。

您能帮我创建新的 xml 文件或有什么好的想法吗?

这段代码怎么样?

public static string ClientName, DbType, ConnectionString;
        static DB()
        {
            try
            {
                DataTable Dt = new DataTable("Settings");
                DataColumn Client = new DataColumn("Client", typeof(string));
                DataColumn DataBaseType = new DataColumn("DataBaseType", typeof(string));

                DataColumn ConString = new DataColumn("ConnectionString", typeof(string));
                Dt.Columns.Add(Client);
                Dt.Columns.Add(DataBaseType);
                Dt.Columns.Add(ConString);
                Dt.ReadXml(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\Settings.xml");
                DB.ClientName = Dt.Rows[0]["Client"].ToString();
                DB.DbType = Dt.Rows[0]["DataBaseType"].ToString();
                DB.Port = Dt.Rows[0]["Port"].ToString();
                DB.ConnectionString = Dt.Rows[0]["ConnectionString"].ToString();
            }
            catch(Exception ex)
             {
            // Exception message
             }

和xml文件代码是

<?xml version="1.0" standalone="yes"?>
<DocumentElement>
    <Settings>
        <Client>DSCL</Client>
        <DataBaseType>ORACLE</DataBaseType>

            <ConnectionString>providerName=system.data.oracleclient;User ID=****;password=****;Data Source=*****;Persist Security Info=True;Provider=OraOLEDB.Oracle;</ConnectionString>

  </Settings>
</DocumentElement>

【问题讨论】:

标签: c# xml configuration deserialization xml-deserialization


【解决方案1】:

创建该类

[Serializable()]
public class Car
{
    [System.Xml.Serialization.XmlElement("StockNumber")]
    public string StockNumber { get; set; }

    [System.Xml.Serialization.XmlElement("Make")]
    public string Make { get; set; }

    [System.Xml.Serialization.XmlElement("Model")]
    public string Model { get; set; }
}


[Serializable()]
[System.Xml.Serialization.XmlRoot("CarCollection")]
public class CarCollection
{
    [XmlArray("Cars")]
    [XmlArrayItem("Car", typeof(Car))]
    public Car[] Car { get; set; }
}

反序列化函数:

CarCollection cars = null;
string path = "cars.xml";

XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));

StreamReader reader = new StreamReader(path);
cars = (CarCollection)serializer.Deserialize(reader);
reader.Close();

还有稍微调整的 xml(我需要添加一个新元素来包装 ...Net 对反序列化数组很挑剔):

<?xml version="1.0" encoding="utf-8"?>
<CarCollection>
<Cars>
  <Car>
    <StockNumber>1020</StockNumber>
    <Make>Nissan</Make>
    <Model>Sentra</Model>
  </Car>
  <Car>
    <StockNumber>1010</StockNumber>
    <Make>Toyota</Make>
    <Model>Corolla</Model>
  </Car>
  <Car>
    <StockNumber>1111</StockNumber>
    <Make>Honda</Make>
    <Model>Accord</Model>
  </Car>
</Cars>
</CarCollection>

也来看看

Loading custom configuration files

http://www.codeproject.com/Articles/32490/Custom-Configuration-Sections-for-Lazy-Coders

【讨论】:

    【解决方案2】:

    为您的连接字符串使用应用配置:

    <?xml version="1.0" encoding="utf-8" ?>
     <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
     <connectionStrings>
        <add name="MyDatabase" connectionString="......"/>
     </connectionStrings>
    </configuration>
    

    在您的应用程序中添加对System.Configuration 的引用并通过以下方式获取连接字符串:

    string connectionString = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
    

    【讨论】:

      【解决方案3】:

      应用程序配置:

      <configuration>     
        <connectionStrings>
          <add name="connstring1"
              connectionString="DataSource=123.123.123.123;UserID=XXX;Password=XXX;" />
        </connectionStrings>     
      </configuration>
      

      C#代码:

      var appConfig = ConfigurationManager.OpenExeConfiguration("your.exe");
      string connectionstring = appConfig.ConnectionStrings.ConnectionStrings["connstring1"].ConnectionString;
      

      【讨论】:

        【解决方案4】:

        你正在尝试重新发明一个轮子。

        正如这里提到的,.config 文件用于应用程序配置。其中有专门的连接字符串部分,建议您使用它,因为它既标准又方便。

        这是你的配置:

        <configuration>
        ....
        <connectionStrings>
            <add name="OracleConnectionString" connectionString="providerName=system.data.oracleclient;User ID=****;password=****;Data Source=*****;Persist Security Info=True;Provider=OraOLEDB.Oracle;" providerName="System.Data.OracleClient" />
        </connectionStrings>
        </configuration>
        

        这里是修改它的代码sn-p:

        string user = "Me";
        string pwd = "qwerty";
        
        Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        ConnectionStringsSection section = (ConnectionStringsSection)cfg.GetSection("connectionStrings");
        
        var currentConnectionString = section.ConnectionStrings["OracleConnectionString"];
        currentConnectionString.ConnectionString = string.Format("providerName=system.data.oracleclient;User ID={0};password={1};Data Source=*****;Persist Security Info=True;Provider=OraOLEDB.Oracle;", user, pwd);
        
        cfg.Save();
        ConfigurationManager.RefreshSection("connectionStrings");
        

        注意事项: 1. 请注意,您将 .config 保存在 /bin 中,而不是在项目文件夹中,因此当您重新运行/重新部署应用程序时,更改将被丢弃。 2. 调试时您不会看到更改,因为 VS 创建 HOST 进程并将新的 .config 文件复制到 /bin。要查看更改,您应该在不调试的情况下运行。干杯。

        【讨论】:

          【解决方案5】:

          使用您的值创建一个数据表。做 Dt.WriteXml(文件名); 它将生成xml文件。以后维护这个xml。 使用 Dt.ReadXml(filename) 在应用程序中取回值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-19
            • 2016-07-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多