我正在处理一个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();
}
}