【问题标题】:Windows Form program can not find mdb file (C:\windows\system32\qbcdb.mdb)Windows 窗体程序找不到 mdb 文件 (C:\windows\system32\qbcdb.mdb)
【发布时间】:2017-08-28 12:47:46
【问题描述】:

最近我遇到了我正在创建的 C# 程序抛出异常 Could not find file C:\windows\system32\qbcdb.mdb 的问题。这很奇怪,因为在通过 Advanced Installer 部署我的程序之前,我从未遇到过这个问题。我没有改变任何东西,但由于某种原因,这个错误一直在发生(异常框的屏幕截图 - http://imgur.com/1GLhwmg)。

我不知道在这个问题中包含什么来帮助解释我的问题,所以这是我的 App.config 文件(在可能与之相关的网站上阅读,但同样,我从来没有到目前为止的任何问题):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="QBC.Properties.Settings.qbcdbConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\qbcdb.mdb"
            providerName="System.Data.OleDb" />
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

插入db方法:

#region inserts the data into the database
private void InsertData()
{
   using (dbConn)
   {
      dbConn.Open();

            using (dbCmd = new OleDbCommand("INSERT INTO members (household_head, birthday, phone, email, address, status, spouse, spouse_birthday, spouse_phone, spouse_email, " +
              "anniversary, spouse_status, child1, child1_birthday, child1_email, " +
         "child2, child2_birthday, child2_email, child3, child3_birthday, child3_email, child4, child4_birthday, child4_email, child5, child5_birthday, child5_email," +
         "child6, child6_birthday, child6_email, child7, child7_birthday, child7_email) " +
         "VALUES (@txtBox_householdHead, @txtBox_householdHeadBirthday, @txtBox_householdHeadPhone, @txtBox_householdHeadEmail, @txtBox_householdHeadAddress, @txtBox_householdHeadStatus, " +
         "@txtBox_spouse, @txtBox_spouseBirthday, @txtBox_spousePhone, @txtBox_spouseEmail, @txtBox_Anniversary, @txtBox_spouseStatus, " +
         "@txtBox_child1, @txtBox_child1Birthday, @txtBox_child1Email, " +
         "@txtBox_child2, @txtBox_child2Birthday, @txtBox_child2Email, @txtBox_child3, @txtBox_child3Birthday, @txtBox_child3Email, @txtBox_child4, @txtBox_child4Birthday, @txtBox_child4Email, " +
         "@txtBox_child5, @txtBox_child5Birthday, @txtBox_child5Email, @txtBox_child6, @txtBox_child6Birthday, @txtBox_child6Email, @txtBox_child7, @txtBox_child7Birthday, @txtBox_child7Email)", dbConn))
            {
                try
                {
                    InsertDBParameters(ref dbCmd);

                    dbCmd.ExecuteNonQuery();
                }
                catch (OleDbException ex)
                {
                    MessageBox.Show(ex.ToString());
                    return;
                }
                finally
                {
                    dbConn.Close();
                }
            }


            MessageBox.Show("Record inserted.");

            ClearAll(this);
        }


}
#endregion


#region creates the db parameters
private void InsertDBParameters(ref OleDbCommand cmd)
{

    foreach (Control c in Controls)
    {
        if (c is TextBox)
        {
            listOfTextboxes.Add(new KeyValuePair<string, string>(((TextBox)c).Name, ((TextBox)c).Text));
            }
        }

        for (int i = 0; i < listOfTextboxes.Count; i++)
        {
            cmd.Parameters.AddWithValue(String.Format("@{0}", listOfTextboxes[i].Key.ToString()), listOfTextboxes[i].Value);
        }



 }
 #endregion

从 db 方法中选择 -

#region displays all members in the database
private void MenuViewMembers_Click(object sender, EventArgs e)
{
        // hide any controls left that may be left over from another option
        HideAllControls(this);



        qbcDataGridView.Font = new Font(qbcDataGridView.Font.FontFamily, 10);

        qbcDataGridView.Location = new Point(30, 100);

        qbcDataGridView.Size = new Size(1500, 500);


        dbConn.Open();

        DataTable dt = new DataTable();


        DbAdapter = new OleDbDataAdapter("select ID, household_head AS head, birthday, phone, email, address, status, spouse, spouse_birthday AS sbirthday, spouse_email AS semail, anniversary," +
            " spouse_status AS sstatus," +
            "child1, child1_birthday AS birthday1, child1_email AS email1, child2, child2_birthday AS birthday2, child3, child3_birthday AS birthday3, child3_email AS email3, " +
            "child4, child4_birthday AS birthday4, child4_email AS email4, child5, child5_birthday AS birthday5, child5_email AS email5," +
            "child6, child6_birthday AS birthday6, child6_email AS email6, child7, child7_birthday AS birthday7, child7_email AS email7 from members", dbConn);
        DbAdapter.Fill(dt);

        for (int i = dt.Columns.Count - 1; i >= 0; i--)
        {
            if (dt.AsEnumerable().All(row => row[i].ToString() == ""))
            {
                dt.Columns.RemoveAt(i);
            }
        }

        qbcDataGridView.DataSource = dt;


        qbcDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

        qbcDataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;

        qbcDataGridView.DefaultCellStyle.WrapMode = DataGridViewTriState.True;


        dbConn.Close();

        Controls.Add(qbcDataGridView);
}
#endregion

在 Visual Studio 中,它运行良好,但是当我使用高级安装程序为其构建 msi 时,当我尝试从数据库中插入/选择时收到该错误消息。

很抱歉,如果信息不足,我不知道该提供什么来帮助解释我的情况。

谢谢!

【问题讨论】:

  • 在您的情况下,DataDirectory 是什么?是哪条路?
  • qbcdb.mdb 属性下的完整路径是C:\Users\jimmy\OneDrive\documents\visual studio 2017\Projects\QBC\QBC\qbcdb.mdb
  • 您在 ConnectionString 中使用了DataDirectory 意味着更新的数据库位于项目的子文件夹 BIN\DEBUG 文件夹中。指向位于项目本身而不是 Bin/Debug 中的那个。 stackoverflow.com/a/31605045/2946329
  • 你还好吗?因为我看到问题 C:\windows\system32\qbcdb.mdb。似乎为您的应用更改了数据文件夹或类似的东西
  • 好吧,当我点击 Visual Studio 中的 qbcb,mdb 文件时,这就是它所说的 (imgur.com/G7fwP8X)

标签: c#


【解决方案1】:

首先,C:\windows\system32\ 不是存储运行时数据的正确位置。这种方法是无效的,因为 Windows 95 已经过时了,即使在那里它也只能起作用,因为 FAT 无法阻止这种情况。特别是,该文件夹通过Virtualsiation 等权限和进程受到保护。这可能只会在未来变得更糟。所以最好不要从它开始。

存储此类数据的“适当”位置是Special Folders 之一。用户特定的一种或 Windows 宽的一种。 ApplicationData 和 CommonApplicationData 应该是最好的地方。

请注意,如果一个以上的用户运行程序(runas、切换用户)并且没有快速释放句柄,那么跨用户位置会使您陷入问题。一般来说,如果目标是跨用户文件夹,则应假定目标不可写/只能短时间写入。

【讨论】:

    【解决方案2】:

    当我使用高级安装程序为其构建 msi 时,当我尝试从数据库中插入/选择时收到该错误消息。

    要解决此问题,您需要一个名为 Process Monitor 的工具。 Proces sMonitor 实时跟踪 HDD、注册表、事件和进程。

    快速启动跟踪,重现错误并在失败时快速停止跟踪。然后调查 ProcMon 的 (Filemon) 日志以查看应用程序在哪里寻找它无法找到的 AccessDB。它将是 ACCESS DENIEDPath Not Found

    从这里您可以确定文件的位置。我怀疑这将类似于用户对 C:\Windows\system32 的权限被拒绝。或者用户有一个 D:\ 驱动器操作系统而不是 C:\ 或类似的东西,你可以通过指定数据来修复目录正确。

    根据经验,不要将 System32 用作文件的垃圾场。 Access 数据库应位于 Program Files、用户数据目录或 FileShare 中(如果由 > 1 人使用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多