从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、空字符串或只有空白的字符串。

从ini读取SQL连接

好的,假设您有一个名为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规则那样避免穿越危险水域。