使用OleDbDataReader执行查询,得到OleDbException(0x80004005)

本文关键字:OleDbException 0x80004005 得到 OleDbDataReader 执行 查询 使用 | 更新日期: 2023-09-27 18:27:15

我在DataReader保存数据库中的一些数据时遇到了一些问题。。或者至少我认为这就是它的运作方式。

我有一个组合框,在程序开始时,我用来自的数据填充它的项目

Connect.Open();
Command.Connection = Connect;
Command.CommandText = "Select * from Department";
OleDbDataReader dr;
dr = Command.ExecuteReader();
if (dr.HasRows)
{
    while (dr.Read())
    {
        cmbDepartment.Items.Add(dr[0].ToString());
    }
}
Connect.Close();

当用户从组合框中选择一个项目时,它可以很好地在程序开始时填充组合框。

我希望根据用户在第一个组合框上选择的部门来填充下一个组合框的项目。

Connect.Open();
Command.CommandText = "select JobTitle from Position where Department ='"+cmbDepartment.Text + "'";
OleDbDataReader dr2;
dr2 = Command.ExecuteReader();
if (dr2.HasRows)
{
    while (dr2.Read())
    {
        cmbPosition.Items.Add(dr2[0]);
    }
}

问题是,我的代码与我的同学非常相似,而我的代码有一条异常长的错误消息,我们无法调试。

错误发生在我从cmb部门选择某些内容之后。使用try/catch,我得到了以下错误消息:

System.Data.OleDb.OleDbException (0x80004005): IErrorInfo.GetDescription failed with E_FAIL(0x80004005).
   at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
   at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.OleDb.OleDbCommand.ExecuteReader()
   at katapusan.Employee.cmbDepartment_TextChanged(Object sender, EventArgs e) in c:'Users'Matt'Documents'Visual Studio 2012'Projects'katapusan'katapusan'Employee.cs:line 423

使用OleDbDataReader执行查询,得到OleDbException(0x80004005)

您可以将dataReader设置到DataSource属性中,并设置查询的列以显示comboBox的值和文本。样品:

cmbDepartment.DataSource = Command.ExecuteReader()
cmbDepartment.DisplayMember = "Name";
cmbDepartment.ValueMember = "Id"; 

还可以更改sql查询以只获取所需的列,例如:

Command.CommandText = "Select Id, Name from Department";

在第二种情况下,只需确保列类型并使用Parameters

Command.CommandText = "select JobTitle from [Position] where Department = @Departament";
Command.Parameters.Add("@Departament", SqlDbType.VarChar).Value = cmbDepartment.Text;

在第二个ComboBox上应用的逻辑是相同的,选择需要的列并在DisplayMember和ValueMemeber上设置。

在位置周围放括号,这是一个保留字。

Access 中的保留作品

      Command.CommandText =
"select JobTitle from [Position] where Department ='"+cmbDepartment.Text + "'";

我相信"Position"实际上可能是一个保留字。用方括号括起来:

Command.CommandText =
    "select JobTitle from [Position] where Department ='"+cmbDepartment.Text + "'";

FWIW,你还有一些其他的设计问题,你可能想研究一下:

  • 参数化查询,而不是将参数值连接到查询的末尾。它更安全,更易于维护。

  • 不要在类级别创建单个ConnectCommand实例并在多个位置重用它们,而是尝试在每个方法中创建新实例,并在完成后处理它们。您不太可能打开数据库连接,或者遇到其他问题(比如在重用命令时忘记清除参数集合)。