使用数据目录时为什么在bin / debug文件夹外找不到db

时间:2013-11-15 13:31:04

标签: c# winforms visual-studio-2010 visual-studio ms-access

我正在学习数据目录,我发现并了解到很多人似乎也在问类似问题,例如:herehereherehere。有一件事困扰着我。那一旦应用程序部署了,用户可以更改数据库的位置吗?例如,我正在测试我的应用程序,数据库存储在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();
   }

如果有人能在这里指导我,请提前致谢。

1 个答案:

答案 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();
   }
相关问题