我正在创建一个C#windows窗体应用程序,工作可以概括为用户填写某些表单并将数据保存在Access数据库中。现在我面临的问题是我必须将此作为设置文件提供给某人。我想的是,一旦安装在其他计算机上并执行的代码将因为Access数据库的连接字符串而产生错误,因为它与该计算机不匹配。我知道如果分发项目我可以在app.config中放置连接字符串,并且每个用户都可以根据他/她的机器更改它。但正如我给出一个设置文件如何解决这个问题。
答案 0 :(得分: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");
它消除了对完整路径进行硬编码的需要,您已经发现,这会导致在安装过程中解决几个问题。当然,您的设置应该在用户选择的路径中提供数据库。
答案 1 :(得分: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();
修改:您可以使用此代码:Finding SQL Servers on the Network
答案 2 :(得分:0)
之前我遇到过这个问题。我以这种方式解决它 (1)在app.config文件中,在连接字符串中放置占位符。连接字符串将包含访问db文件的文件路径。用特殊字符串替换路径。
<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);
}
答案 3 :(得分:0)
如果部署应用程序以及SQLLocalDB,则应在数据库中添加用户(machine \ user)以进行访问。