我正在创建一个 C# windows 窗体应用程序,工作可以概括为用户填写一些表单并将数据保存在 Access 数据库中。现在我面临的问题是我必须将其作为安装文件交付给某人。我在想的是,一旦在其他计算机上安装并执行的代码会因为 Access db 的连接字符串而出错,因为它与那台计算机不匹配。我知道如果分发项目,我可以将连接字符串放在 app.config 中,每个用户都可以根据他/她的机器更改它。但是当我给出一个安装文件时,如何解决这个问题。
问问题
6405 次
4 回答
3
假设您使用此连接字符串部署 app.config
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\yourFile.accdb;"
在 WinForms 应用程序中,|DataDirectory|
快捷方式代表您的应用程序工作文件夹,但您可以在运行时更改它指向使用此代码的位置。
// appdomain setup information
AppDomain currentDomain = AppDomain.CurrentDomain;
//Create or update a value pair for the appdomain
currentDomain.SetData("DataDirectory", "Your user choosen path");
它消除了对完整路径进行硬编码的需要,您已经发现,在安装过程中会导致几个问题需要解决。当然,您的设置应该在您的用户选择的路径中提供您的数据库。
于 2012-06-14T07:39:12.353 回答
0
我以前遇到过这个问题。我是这样解决的。
(1) 在您的 app.config 文件中,在连接字符串中放置一个占位符。连接字符串将包含访问数据库文件的文件路径。用特殊字符串替换路径。
<connectionStrings>
<!-- original connection string , change it to the below line -->
<!-- <add name="test" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\test\test.mdb "/> -->
<add name="test" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=##path##\test.mdb "/>
</connectionStrings>
(2)当您的应用程序启动时,使用 Directory.GetCurrentDirectory 获取应用程序路径。在创建连接之前,将 ##path## 替换为客户端计算机上的实际路径。
static void test()
{
string s = ConfigurationManager.ConnectionStrings["test"].ConnectionString;
s.Replace("##path##", Directory.GetCurrentDirectory());
OleDbConnection conn = new OleDbConnection(s);
}
于 2012-06-14T07:35:31.427 回答
0
ConnectionString
您可以在运行时构建SqlConnectionStringBuilder
// Create a new SqlConnectionStringBuilder and
// initialize it with a few name/value pairs.
SqlConnectionStringBuilder builder =
new SqlConnectionStringBuilder(GetConnectionString());
// The input connection string used the
// Server key, but the new connection string uses
// the well-known Data Source key instead.
Console.WriteLine(builder.ConnectionString);
// Pass the SqlConnectionStringBuilder an existing
// connection string, and you can retrieve and
// modify any of the elements.
builder.ConnectionString = "server=(local);user id=ab;" +
"password= a!Pass113;initial catalog=AdventureWorks";
// Now that the connection string has been parsed,
// you can work with individual items.
Console.WriteLine(builder.Password);
builder.Password = "new@1Password";
builder.AsynchronousProcessing = true;
// You can refer to connection keys using strings,
// as well. When you use this technique (the default
// Item property in Visual Basic, or the indexer in C#),
// you can specify any synonym for the connection string key
// name.
builder["Server"] = ".";
builder["Connect Timeout"] = 1000;
builder["Trusted_Connection"] = true;
Console.WriteLine(builder.ConnectionString);
Console.WriteLine("Press Enter to finish.");
Console.ReadLine();
编辑:您可以使用:在网络上查找 SQL Server
于 2012-06-14T07:32:05.037 回答
0
在部署应用程序以及 SQLLocalDB 的情况下,应将用户 (machine\user) 添加到您的数据库中以进行访问。
于 2018-04-25T17:02:37.530 回答