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

C# 为什么在使用数据目录时在bin/debug文件夹外找不到db,c#,winforms,visual-studio-2010,visual-studio,ms-access,C#,Winforms,Visual Studio 2010,Visual Studio,Ms Access,我正在学习数据目录,我发现并学到了很多人似乎会问类似的问题,例如:,和。有一件事困扰着我。也就是说,一旦部署了应用程序,用户是否可以更改数据库的位置?例如,我正在测试我的应用程序,数据库存储在bin/Debug文件夹中。我将数据库文件移动到临时文件夹中,使其位于C:\a\database1.mdb中。当我运行应用程序时,我收到一个错误 Could not find file 'C:\...\bin\Debug\database1.mdb'. 1) 为什么我必须将db文件放在bin/Debug文

我正在学习数据目录,我发现并学到了很多人似乎会问类似的问题,例如:,和。有一件事困扰着我。也就是说,一旦部署了应用程序,用户是否可以更改数据库的位置?例如,我正在测试我的应用程序,数据库存储在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");
<connectionStrings>
    <add name="Project1.Properties.Settings.Project1ConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database1.mdb" providerName="System.Data.OleDb"/>
</connectionStrings>
我有App.config文件,它看起来像这样

myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source= |DataDirectory|\database1.mdb");
<connectionStrings>
    <add name="Project1.Properties.Settings.Project1ConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\database1.mdb" providerName="System.Data.OleDb"/>
</connectionStrings>

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

Q1:为什么我必须将db文件放在bin/Debug文件夹中

回答:

不,您不必将DB文件放在调试/发布文件夹中。
| DataDirectory |
是一个替换字符串,因此您可以单独配置数据库文件的位置

按照以下步骤配置数据库路径:

AppDomain.CurrentDomain.SetData("DataDirectory", @"C:\yourrequiredfolder\DB\");
因此,上面的步骤是为DB文件配置文件夹。 所以现在
| DataDirectory |
引用=>
C:\yourrequiredfolder\DB\

Q2:当我使用数据目录(相对路径)而不是硬代码时,如何克服应用程序读取和访问C:\A\database1.mdb中文件的问题

Ansewer:

如果您使用上述步骤设置DB文件的路径,问题将得到解决,但请确保如果您在客户端pc上部署DB文件,您应保持相同的路径,否则您可以使用上述步骤进行更改

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();
   }

Q1:为什么我必须将db文件放在bin/Debug文件夹中

回答:

不,您不必将DB文件放在调试/发布文件夹中。
| DataDirectory |
是一个替换字符串,因此您可以单独配置数据库文件的位置

按照以下步骤配置数据库路径:

AppDomain.CurrentDomain.SetData("DataDirectory", @"C:\yourrequiredfolder\DB\");
因此,上面的步骤是为DB文件配置文件夹。 所以现在
| DataDirectory |
引用=>
C:\yourrequiredfolder\DB\

Q2:当我使用数据目录(相对路径)而不是硬代码时,如何克服应用程序读取和访问C:\A\database1.mdb中文件的问题

Ansewer:

如果您使用上述步骤设置DB文件的路径,问题将得到解决,但请确保如果您在客户端pc上部署DB文件,您应保持相同的路径,否则您可以使用上述步骤进行更改

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();
   }

非常感谢您的回复,非常有用。从你的回答看来,我必须修改路径目录并重新安装应用程序?然后我有另一个问题:-使用DataDirectory与硬编码连接字符串(如myCon.ConnectionString=@“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C\:…database1.mdb”)有什么区别或意义?如果您在应用程序中硬编码的内容仅限于应用程序域,但如果您使用theSetData()进行设置方法,则它是全局的,因此任何使用| DataDirectory |的应用程序都引用相同的路径。@bucketblast:如果您有任何疑问,请告诉我。我已将OleDbConnection指定给myCon;那么,如何将myCon与AppDomain.CurrentDomain一起分配呢。谢谢Sudhakar我的意思是我尝试过currentDomain.SetData(myCon+“DataDirectory”@“C:\A\database1.mdb”);这将导致对象引用未设置为对象实例的错误。我对此不确定,但看看它,非常感谢您的回复,非常有用。从你的回答看来,我必须修改路径目录并重新安装应用程序?然后我有另一个问题:-使用DataDirectory与硬编码连接字符串(如myCon.ConnectionString=@“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C\:…database1.mdb”)有什么区别或意义?如果您在应用程序中硬编码的内容仅限于应用程序域,但如果您使用theSetData()进行设置方法,则它是全局的,因此任何使用| DataDirectory |的应用程序都引用相同的路径。@bucketblast:如果您有任何疑问,请告诉我。我已将OleDbConnection指定给myCon;那么,如何将myCon与AppDomain.CurrentDomain一起分配呢。谢谢Sudhakar我的意思是我尝试过currentDomain.SetData(myCon+“DataDirectory”@“C:\A\database1.mdb”);这是对象引用未设置为i的错误