我正在学习数据目录,我发现并了解到很多人似乎也在问类似问题,例如:here,here,here和here。有一件事困扰着我。那一旦应用程序部署了,用户可以更改数据库的位置吗?例如,我正在测试我的应用程序,数据库存储在bin / Debug文件夹中。我将数据库文件移动到临时文件夹,因此它在C:\ A \ database1.mdb中。当我运行应用程序时,我收到了错误...
Could not find file 'C:\...\bin\Debug\database1.mdb'.
1)为什么我必须将db文件放在bin / Debug文件夹中?
2)如何解决应用程序在C:\ A \ database1.mdb中读取和访问文件的问题 当我使用数据目录(相对路径)而不是硬代码?
如上所述
3)一旦部署了应用程序,用户就可以在那里更改位置 数据库?
.cs文件和.config用于构建操作我选择了编译,而复制到输出目录我选择了复制
我有一个看起来像这样的连接字符串......
myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source= |DataDirectory|\database1.mdb");
我有App.config文件,它看起来像这样......
<connectionStrings>
<add name="Project1.Properties.Settings.Project1ConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database1.mdb" providerName="System.Data.OleDb"/>
</connectionStrings>
例如
public MainForm()
{
InitializeComponent();
this.WindowState = FormWindowState.Maximized;
myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database1.mdb");
}
OleDbConnection myCon;
OleDbCommand cmd;
private void btnInsert_Click(object sender, EventArgs e)
{
myCon.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = myCon;
OleDbCommand cmdCheck = new OleDbCommand();
cmdCheck.Connection = myCon;
cmdCheck.CommandText = "SELECT COUNT(*) FROM Details WHERE ID = ?";
cmdCheck.Parameters.AddWithValue("@ID", txtID.Text);
if (Convert.ToInt32(cmdCheck.ExecuteScalar()) == 0)
{
cmd.CommandText = (@"INSERT INTO Details (ID, FirstName)
VALUES(@ID, @FirstName)")
cmd.Parameters.AddWithValue("@ID", txtID.Text);
cmd.Parameters.AddWithValue("@FirstName", txtFirstName.Text);
cmd.ExecuteNonQuery();
}
myCon.Close();
}
如果有人能在这里指导我,请提前致谢。
答案 0 :(得分:4)
Q1:为什么我必须将db文件放在bin / Debug文件夹中?
答案:
否您不必将数据库文件放入调试/发布文件夹中。
|DataDirectory|
是替换字符串,因此您可以单独配置数据库文件的位置
按照以下步骤配置数据库路径:
AppDomain.CurrentDomain.SetData("DataDirectory", @"C:\yourrequiredfolder\DB\");
所以上面的步骤是为DB文件配置文件夹。
所以现在|DataDirectory|
指的是=&gt; C:\yourrequiredfolder\DB\
Q2:当我使用数据目录(相对路径)而不是硬代码时,如何解决应用程序在C:\ A \ database1.mdb中读取和访问文件的问题?< / p>
Ansewer:
如果您使用上述步骤设置数据库文件的路径,则问题将得到解决,但请确保如果您在客户端PC上部署它,则应保持相同的路径,否则您可以使用上述步骤进行更改。
Q3:一旦部署了应用程序,用户是否可以更改数据库的位置?
实际上没有,因为它已在您的代码中修复。但如果您愿意,可以按照以下步骤进行:
步骤1:提供UI以询问他获取最新的数据库路径。
String strUserDBPath=getUserNewDBPath();//get the new path of DB file from user.
步骤2:从代码中更改|DataDiretory|
的当前路径,如下所示:
AppDomain.CurrentDomain.SetData("DataDirectory", strUserDBPath);
如果您还有其他需要,请告诉我。
示例代码:
public MainForm()
{
InitializeComponent();
this.WindowState = FormWindowState.Maximized;
AppDomain.CurrentDomain.SetData("DataDirectory", @"C:\A\");
myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database1.mdb");
}
OleDbConnection myCon;
OleDbCommand cmd;
private void btnInsert_Click(object sender, EventArgs e)
{
myCon.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = myCon;
OleDbCommand cmdCheck = new OleDbCommand();
cmdCheck.Connection = myCon;
cmdCheck.CommandText = "SELECT COUNT(*) FROM Details WHERE ID = ?";
cmdCheck.Parameters.AddWithValue("@ID", txtID.Text);
if (Convert.ToInt32(cmdCheck.ExecuteScalar()) == 0)
{
cmd.CommandText = (@"INSERT INTO Details (ID, FirstName)
VALUES(@ID, @FirstName)")
cmd.Parameters.AddWithValue("@ID", txtID.Text);
cmd.Parameters.AddWithValue("@FirstName", txtFirstName.Text);
cmd.ExecuteNonQuery();
}
myCon.Close();
}