2012-11-19 28 views
4

我正在研究一個相對直接的C#項目,該項目通過OleDb將Access數據庫連接到各種功能(如添加,刪除和編輯記錄)。現在,在嘗試實施數據庫搜索之前,一切工作都很順利。在搜索數據庫表的條目時出現NullReferenceException錯誤

以下行(在搜索框代碼中)在調試期間拋出異常,但我不確定實際上是什麼導致它中斷的空值。

ReturnedResults = DBDataSet.Tables["Movies"].Select("Title like '%" + Search + "%'"); 

所以我們的目標是在數據庫中通過「電影」表搜索和查找基於用戶的輸入(存儲在「搜索」字符串)電影。

搜索框的代碼可以在下面找到,數據庫初始化和連接在底部。

private void SearchTextBox_Changed(object sender, EventArgs e) 
{ 
    string SearchString = SearchTextBox.Text.ToString(); 
    int Results = 0; 
    DataRow[] ReturnedResults; 

    ReturnedResults = DataSet.Tables["Movies"].Select("Title like '%" + SearchString + "%'"); 
    Results = ReturnedResults.Length; 

    if (Results > 0) 
{ 
    SearchResultsBox.Items.Clear(); 
    for (int i = 0; i <= Results; i++) 
    { 
     DataRow Row; 
     Row = ReturnedResults[i]; 
     SearchResultsBox.Items.Add(Row["Title"].ToString()); 
    } 
} 
    else 
{ 
    SearchResultsBox.Items.Clear(); 
    MessageBox.Show("Error! No items found."); 
} 
} 

對於這裏有些情況下是主數據庫初始化/連接和形式加載事件:

public partial class BaseForm : Form 
{ 
    System.Data.OleDb.OleDbConnection Connection; 

    DataSet DataSet; 

    System.Data.OleDb.OleDbDataAdapter DataAdapter; 

    int MaxRows = 0; 
    int CurrentRow = 0; 

public BaseForm() 
{ 
    InitializeComponent(); 
} 

private void BaseForm_Load(object sender, EventArgs e) 
{ 
    Connection = new System.Data.OleDb.OleDbConnection(); 
    Connection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;DataSource=Movies.accdb"; 
    Connection.Open(); 

    DataSet = new DataSet(); 

    string sq1 = "SELECT * From Movies"; 
    DataAdapter = new System.Data.OleDb.OleDbDataAdapter(sq1, DBConnection); 
    DataAdapter.Fill(DBDataSet); 

    MaxRows = DataSet.Tables[0].Rows.Count; 
    DisplayRecord(); 
} 

回答

2

多的東西可以在你的聲明無效。 DBDataSet可以爲空,或表Movies不存在。您可以在該行之前添加以下檢查。

if(DBDataSet != null && 
    DBDataSet.Tables.Count > 0 && 
    DBDataSet.Tables["Movies"] != null) 
{ 
    ReturnedResults = DBDataSet.Tables["Movies"].Select("Title like '%" + Search + "%'"); 
    //.... rest of your code 

你也可以嘗試訪問對Tables[0]記錄,而不是表Movies

編輯:

你的下一個問題,在註釋中,你的循環執行,直到長度。它應該是這樣的:

for (int i = 0; i < Results; i++) // Less than (<) not less than equal to 
    { 
     DataRow Row; 
     Row = ReturnedResults[i]; 
     SearchResultsBox.Items.Add(Row["Title"].ToString()); 
    } 

您需要修改的條件,並記住該指數從0開始,並出現在你的代碼按你會得到行至Result - 1

+0

設定[0]解決了空的異常,但提出的另一問題表之前,所以更好的方式噸檢查。我從行中收到'Index超出數組範圍':Row = ReturnedResults [i]; – user1835615

+0

嗯只是注意一件事。在您的for循環中檢查修改條件爲'我<結果' – Habib

+0

明白了!謝謝Habib。 – user1835615

0

在你的情況多空引用您的評論你在以下行中有錯誤 ReturnedResults = DBDataSet.Tables [「Movies」]。Select(「Title like'%」+ Search +「%'」);

在上述DBDataSet可以爲空或它的表(影)不具有行等。濾波器

if(DBDataSet != null && 
    DBDataSet.Tables.Count > 0 && 
    DBDataSet.Tables["Movies"] != null && DBDataset.Tables["Movies"].Rows.Count > 0) 
{ 

ReturnedResults = DBDataSet.Tables["Movies"].Select("Title like '%" + Search + "%'"); 

}