我正在开发一个相对简单的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();
}
答案 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 + "%'");
}