我正在开发一个c#应用程序,我需要从oracle数据库服务器获取数据。在我的应用程序中,我不想创建一个硬编码的连接字符串,因为有时我们必须将它连接到不同的DB(为了测试目的,它具有相同的模式)。
为此,我有一个计划,我使用此表单创建一个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>
创建该类
[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
使用app config为您的connectionStrings:
<?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;
App.Config中:
<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;
你正试图重新发明一个轮子。
正如这里提到的那样,.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>
这是修改它的代码片段:
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。请注意,您正在/ bin中保存.config,而不是在项目文件夹中,因此当您重新运行/重新部署应用程序时,更改将被丢弃。 2.调试时,您不会看到更改,因为VS创建了HOST进程并将新的.config文件复制到/ bin。要查看更改,您应该在不调试的情况下运行。干杯。
使用您的值创建数据表。 do Dt.WriteXml(fileName);它将生成xml文件。将来维护这个xml。使用Dt.ReadXml(filename)在应用程序中获取值。