Windows窗体程序找不到mdb文件(C:\ windows\system32\qbcdb.mdb)

use*_*411 10 c#

最近我遇到了我正在创建抛出异常的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>
Run Code Online (Sandbox Code Playgroud)

插入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
Run Code Online (Sandbox Code Playgroud)

从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
Run Code Online (Sandbox Code Playgroud)

在visual studio中,它运行正常,但是当我使用高级安装程序为它构建msi时,当我尝试从数据库插入/选择时,我收到该错误消息.

如果这些信息不够,我很抱歉,我不知道提供什么来帮助解释我的情况.

谢谢!

Chr*_*her 0

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

存储此类数据的“正确”位置是特殊文件夹之一。用户特定的或 Windows 范围的。ApplicationData 和 CommonApplicationData 应该是最好的地方。

请注意,如果超过一个用户运行该程序(runas、切换用户)并且句柄没有快速释放,那么跨用户位置将会给您带来问题。通常,如果目标是跨用户文件夹,则应假定目标不可写/只能在短时间内可写。