为生产构建 Winforms 应用程序设置数据库访问连接字符串

Set connection string for database access for production build Winforms app

我正在做一个Winforms项目,我只是在设置程序安装的安装文件。

场景

我自己设置的连接字符串是这样的:

 SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=F:\Application\MyAppv1.0\MyApp\DB.mdf;Integrated Security=True");
 return con;

在这里,我使用个人位置的本地数据库。

问题

在客户端 PC 上安装时,还附加了数据库,因此安装的文件将在 C:\Program Files\Author\MyAppv1.0 上。当我使用相同的连接字符串时,应用程序显示异常。那么,我应该在安装程序创建期间更新该位置的连接字符串吗? (我正在使用 MSI)。

对于这种情况是否有任何通常遵循的方法?

我的目标是让已安装的应用程序使用数据库,该数据库也位于名为 DB.mdf 的相同安装位置并随安装一起提供。

提前谢谢大家。

Do not use AttachDbFilename, it has many issues. 相反,通常使用 CREATE DATABASE...FOR ATTACH.

附加数据库

在您的应用程序启动时,您可以使用 master 作为当前数据库连接到服务器,并检查您的数据库是否存在。如果不存在,您可以创建它。

private static void CheckDbExistence(string connectionString)
{
    const string query = @"
IF NOT EXISTS (SELECT 1
    FROM sys.databases
    WHERE name = 'MyDb')
BEGIN

    DECLARE @sql nvarchar(max) = N'
CREATE DATABASE MyDb ON
  (FILENAME = ' + QUOTENAME(@mdf, '''') + '),   
  (FILENAME = ' + QUOTENAME(@ldf, '''') + ')
  FOR ATTACH;
';

    EXEC (@sql);
END;
    ";
    var csb = new SqlConnectionStringBuilder(connectionString);
    csb.Initial Catalog = "master";
    using (var conn = new SqlConnection(csb.ConnectionString))
    using (var comm = new SqlCommand(query, conn))
    {
        comm.Parameters.Add("@mdf", SqlDbType.NVarChar, 255).Value = Path.Combine(Environment.CurrentDirectory, "MyDb.mdf");
        comm.Parameters.Add("@ldf", SqlDbType.NVarChar, 255).Value = Path.Combine(Environment.CurrentDirectory, "MyDb.ldf");
        conn.Open();
        comm.ExecuteNonQuery();
    }
}