使用OleDbDataReader执行查询,获取OleDbException(0x80004005)

时间:2014-10-20 16:17:03

标签: c# combobox oledbdatareader

我在使用DataReader从数据库中保存一些数据时遇到了一些问题..或者至少我认为这是它的工作原理。

我有一个ComboBox,在程序开始时,我使用以下数据填充其Items:

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

当用户从组合框中选择一个项目时,它可以正常运行并在程序开头填充ComboBox。

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

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

问题是,我和同学的代码完全相似,我的错误消息异乎寻常,我们无法调试。

从cmbDepartment中选择一些内容后发生错误。使用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

3 个答案:

答案 0 :(得分:0)

您可以将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上设置。

答案 1 :(得分:0)

我相信"位置"实际上可能是一个保留字。将其括在方括号中:

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

FWIW,您可能想要了解其他一些设计问题:

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

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

答案 2 :(得分:0)

将括号括在位置附近,它是一个保留字。

Reserved Works in Access

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