0

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

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

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。

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

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
4

3 回答 3

0

您可以将 dataReader 设置为DataSource属性并设置查询的列以显示组合框的值和文本。样品:

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 上进行设置。

于 2014-10-20T16:22:22.150 回答
0

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

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

FWIW,您可能还需要研究其他一些设计问题:

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

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

于 2014-10-20T16:22:37.953 回答
0

在 position 周围加上括号,这是一个保留字。

访问中的保留作品

      Command.CommandText =
"select JobTitle from [Position] where Department ='"+cmbDepartment.Text + "'";
于 2014-10-20T16:22:45.247 回答