2016-10-16 7 views
1

このコードを使用して、アプリケーションをテキストボックス内のテキストにフィルター処理しますが、これを拒否し、エラーメッセージがポップアップし続けます。コードは次のとおりです。Microsoft Accessデータベースの検索データをフィルター処理し、DataGridviewのフィルターを使用します。C#

using System.Windows.Forms; 
using System.Configuration; 
using System.Data.OleDb; 

namespace TestBarcode 
{ 
    public partial class StaffHome : Form 
    { 
     private OleDbConnection connection = new OleDbConnection(); 
     public StaffHome() 
     { 
      InitializeComponent(); 
      connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\Projects\POS\Database\MainDatabase_POS.accdb;Persist Security Info=False;"; 
     } 

     private void StaffHome_Load(object sender, EventArgs e) 
     { 

      try 
      { 
       connection.Open(); 
       OleDbCommand command = new OleDbCommand(); 
       command.Connection = connection; 
       string query = "select * from InventoryManagement"; 
       command.CommandText = query; 

       OleDbDataAdapter da = new OleDbDataAdapter(command); 
       DataTable dt = new DataTable(); 
       da.Fill(dt); 
       dataGridView1.DataSource = dt; 

       connection.Close(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error" + ex); 
      } 
     } 
     try 
     { 
      connection = new OleDbConnection(); 
      connection.Open(); 
      OleDbCommand command = new OleDbCommand("Select * from InventoryManagement where ID like '" + textBox1.Text + "%'", connection); 

      OleDbDataAdapter adp = new OleDbDataAdapter(command); 
      DataTable dt = new DataTable(); 
      adp.Fill(dt); 
      dataGridView1.DataSource = dt; 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show("Error" + ex); 
     } 

これを行う方法はありますか?もしそうなら、助けてください。ありがとう。

EDIT:ここにはエラーmsgの画像があります。 Error msg Box

+0

最初:上記のコードはコンパイル可能ではないようです。 (これらの2つの異なる方法はありますか?該当するコードを追加してください)。データテーブルInventoryManagementの列IDのタイプは何ですか?第三に、正確にエラーメッセージは何ですか?申し訳ありませんが、これらの重要な情報を追加しないと、あなたの質問は「あなたが何を求めているのか不明」というカテゴリに属します。 – Steve

+0

ありがとうございました。 まず、同じコードですが、テキストボックスにテキストを挿入するまではプログラムが正常に機能するためです。 第2に、 ID、BarcodeID、Price、Quantityなど、いくつかの列があります。 第3に、私は上記のテキストを編集し、私のエラーの画像を追加します。再度 これを指摘してくれてありがとう。 –

答えて

0

2番目のコマンドは、OleDbConnection変数でNEWを呼び出します。この結果、OleDbConnectionは再作成されますが、必要な接続文字列の初期化が失われます。

この場合、グローバルオブジェクトを使用して新しい接続を作成しないでください。 私は、接続のためのグローバルオブジェクトを使用して多くのことを嫌いしかし、だから

// This creates a new OleDbConnection without the connection string 
connection = new OleDbConnection(); 

この行を削除してください。接続では、例外の場合に正しく処理することが困難なアンマネージリソースが内部的に使用されます。ローカル接続を作成し、接続文字列のみをグローバルに保持することが常に望ましいです。このパターンは、接続を正しく破棄し、接続によって保持されるアンマネージリソースを解放するusingステートメントの導入を可能にします。

+0

それはうまく動作しますが、私は2つ以上の検索がある場合、それは私にエラーメッセージを与えるmsg: –

+0

ここにメッセージボックスのエラーです。 [link](http://i.imgur.com/vcZJxlo.png) –

+0

メッセージはクリアです。どこかで_connection.Open()_を呼び出そうとしていますが、前に_connection.Close()_を呼び出していません。これらのコマンドがすべて順番に実行され、最初に開かれ、最後にエラーが発生した場合に閉じる1つのtry/catchで閉じます。 – Steve

関連する問題