为生产构建 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();
}
}
我正在做一个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();
}
}