我在使用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
答案 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而不是将参数值连接到查询的末尾。它更安全,更易于维护。
不是在类级别创建单个Connect
和Command
实例,而是在多个位置重用它们,尝试在每个方法中创建新实例,并在您执行时将其丢弃。 #39;重新完成。您不太可能打开数据库连接,或遇到其他问题(例如在重用命令时忘记清除参数集合)。
答案 2 :(得分:0)
将括号括在位置附近,它是一个保留字。
Command.CommandText =
"select JobTitle from [Position] where Department ='"+cmbDepartment.Text + "'";