5

私は、Access データベースを OleDb 経由でレコードの追加、削除、編集などのさまざまな機能に接続する、比較的単純な C# プロジェクトに取り組んでいます。これで、データベース検索を実装しようとするまで、すべてがうまくいきました。

次の行 (検索ボックス コード内) では、デバッグ中に例外がスローされますが、実際に null 値が何であるかがわかりません。

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();
}
4

2 に答える 2

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

于 2012-11-19T12:07:59.547 に答える
1

あなたの場合、コメントに従って複数のnull参照がコードで発生し、次の行でエラーが発生しましたReturnedResults = DBDataSet.Tables ["Movies"]。Select( "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 + "%'");

}
于 2012-11-19T12:15:36.547 に答える