在数据库表中搜索条目时出现NullReferenceException错误

时间:2012-11-19 12:06:09

标签: c#

我正在开发一个相对简单的C#项目,它通过OleDb连接Access数据库,具有添加,删除和编辑记录等各种功能。现在,在尝试实现数据库搜索之前,一切都运行良好。

以下行(在搜索框代码中)会在调试期间抛出异常,但我不确定究竟是什么实际上是导致其中断的空值。

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 个答案:

答案 0 :(得分:2)

语句中的多个内容可以为null。 DBDataSet可以为null,或者表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循环正在执行,直到长度。应该是这样的:

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

答案 1 :(得分:1)

在您的情况下,您的代码中会出现多个空引用,根据您的注释,您在下一行中收到错误 ReturnedResults = DBDataSet.Tables [“Movies”]。选择(“Title like'%”+ Search +“%'”);

在上面DBDataSet可能为null或其表(Movies)没有行等。所以更好的方法是在过滤前检查

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 + "%'");

}