从ini读取SQL连接
本文关键字:连接 SQL 读取 ini | 更新日期: 2023-09-27 18:24:50
我想从ini文件构建一个SQL Compact连接。
在我的ini文件中,连接路径如下:
DataBasePath=D:/Database/TrainingDatabase.sdf
我的代码如下:
public static SqlCeConnection conn = new SqlCeConnection(@"Data Source="+SQLPath);
我可以从ini文件中读取数据库路径,没有任何问题,但我无法打开连接,因为这个错误:
数据库不能为null、空字符串或只有空白的字符串。
好的,假设您有一个名为CONNECTION.TXT的文本文件,其中包含以下文本。
Data Source = ServerName
Initial Catalog = DatabaseName
Integrated Security = false
User Id = sa
Password = 123456
下面的代码将逐行读取您的文本文件
string serverName, databaseName, userId, password;
bool integratedSecurity;
int counter = 0;
string line;
// Read the file and display it line by line.
System.IO.StreamReader file = new System.IO.StreamReader("C:''CONNECTION.txt");
while ((line = file.ReadLine()) != null)
{
if (line.Contains("Data Source"))
serverName = line.Replace("Data Source = ", "");
else if (line.Contains("Initial Catalog"))
databaseName = line.Replace("Initial Catalog = ", "");
else if (line.Contains("Integrated Security"))
integratedSecurity = Convert.ToBoolean(line.Replace("Integrated Security = ", ""));
else if (line.Contains("User Id"))
userId = line.Replace("User Id = ", "");
else if (line.Contains("Password"))
password = line.Replace("Password = ", "");
Console.WriteLine(line);
counter++;
}
file.Close();
在不了解您的环境和所使用的技术(WinForms、ASP.NET、WPF??)的情况下,我只能显示一个试图突出显示问题的伪代码
这条线可能在类内
public class MyApp
{
public static SqlCeConnection conn = new SqlCeConnection(@"Data Source="+SQLPath);
......
}
这使得CCD_ 1变量成为类级全局静态变量,该变量在类首次使用之前的某个时间初始化(C#引用静态字段初始化器)
这意味着SQLPath
变量也应该是一个静态变量,否则它将无法被其他静态变量使用。
所以我们需要
public class MyApp
{
public static string SQLPath = MyApp.GetPathFromINIFile();
public static SqlCeConnection conn = new SqlCeConnection(@"Data Source="+SQLPath);
......
public static string GetPathFromINIFile()
{
// read and return the path from the INI key
....
return dbPath;
}
}
但这真的很弱。如果您出于任何原因将SQLPath
的初始化移动到conn
的初始化之后,您将得到初始错误,并开始从头开始。
我只能建议杀死这些静态全局变量(至少是SqlCeConnection),并仅在需要使用时为SqlCeConnection创建一个本地变量。
public class MyApp
{
public static string SQLPath = MyApp.GetPathFromINIFile();
public static string GetPathFromINIFile()
{
....
return dbPath;
}
public bool UpdateCustomerTable(Customer cs)
{
using(SqlCeConnection cnn = new SqlCeConnection(MyApp.SQLPath))
{
......
}
}
}
这样,您就不会在程序期间保持资源的活力,也不会像Static Field Initialization
规则那样避免穿越危险水域。