簡體   English   中英

使用OleDbDataReader執行查詢,獲取OleDbException(0x80004005)

[英]Executing query using OleDbDataReader, getting OleDbException (0x80004005)

我在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中選擇某些內容后,將發生錯誤。 使用嘗試/捕獲,我收到此錯誤消息:

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

您可以將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上進行設置。

我相信“位置”實際上可能是保留字。 將其括在方括號中:

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

FWIW,您可能需要研究其他一些設計問題:

  • 對查詢進行參數化,而不是在查詢結束時合並參數值。 它更安全,更易於維護。

  • 與其在類級別創建單個Connect and Command實例,而不是在多個位置重用它們,不如嘗試在每個方法內創建新實例,並在完成后將其處置。 您不太可能保持數據庫連接打開或遇到其他問題(例如在重用命令時忘記清除參數集合)。

將方括號放在位置,這是保留字。

Access中保留的作品

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM