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



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

场景

我为自己设置的连接字符串如下:

SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)MSSQLLocalDB;AttachDbFilename=F:ApplicationMyAppv1.0MyAppDB.mdf;Integrated Security=True");
return con;

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

问题

在客户端的PC上安装时,数据库也会被连接,因此安装的文件将在C:Program FilesAuthorMyAppv1.0上。当我使用相同的连接字符串时,应用程序会显示一个异常。那么,我应该在创建安装程序的过程中更新该位置的连接字符串吗?(我正在使用MSI(。

对于这种情况,有什么常用的方法吗?

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

提前感谢各位。

不要使用AttachDbFilename,它有很多问题。相反,请使用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();
}
}

最新更新