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



最近我遇到了我正在创建的C#程序抛出异常Could not find file C:windowssystem32qbcdb.mdb的问题。这很奇怪,因为我以前从未在通过高级安装程序部署程序时遇到过这个问题。我没有改变任何东西,但由于某种原因,这个错误一直在发生(异常框的截图-https://i.stack.imgur.com/QaLUC.jpg)。

我不知道该在这个问题中包含什么来帮助解释我的问题,所以这是我的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>

插入数据库方法:

#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

从数据库方法中选择-

#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

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

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

谢谢!

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

存储此类数据的"适当"位置是在其中一个特殊文件夹中。用户特定的或Windows范围的。ApplicationData和CommonApplicationData应该是最好的位置。

请注意,如果有多个用户运行程序(runas、switch-user(,并且句柄没有迅速释放,那么跨用户的位置会让你陷入问题。通常,如果目标是跨用户文件夹,则应将其划分为不可写/仅在短时间内可写。

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

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

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

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

根据经验,不要将System32用作文件的转储场。Access数据库应位于程序文件、用户数据目录或文件共享上(如果有>1个人使用(

最新更新