2016-06-21 15 views
-4

私は複数の人で自分のAccessデータベースに接続しています。同時に2人の人が同時に検索している場合は、エラーが発生します。だから私はそれを修正するためにこれをやったが、それは多くのエラーを削減したが、私はまだ時々それを得る。より良い方法がありますか?私はかなりこのようなキャッチを使用してはならないと確信しています。このアクセスコードを修正するにはどうすればいいですか

public partial class Form2 : Form 
{ 
    private OleDbConnection connection = new OleDbConnection(); 
    public Form2() 
    { 
     InitializeComponent(); 
     connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=S:\Documents\2015\Db12.accdb"; 
     System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(); 
     conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=S:\Documents\2015\Db12.accdb"; 
    } 
    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 
     if (m.Msg == WM_NCHITTEST) 
      m.Result = (IntPtr)(HT_CAPTION); 
    } 

    private const int WM_NCHITTEST = 0x84; 
    private const int HT_CLIENT = 0x1; 
    private const int HT_CAPTION = 0x2; 

    private void lRead(string query, ListBox lbox) 
    { 
     OleDbCommand command = new OleDbCommand(); 
     command.Connection = connection; 
     command.CommandText = query; 
     OleDbDataReader reader = command.ExecuteReader(); 
     try 
     { 
      while (reader.Read()) 
      { 
       lbox.Items.Add(reader["UAS"].ToString()); 
      } 
     } 
     catch (Exception ex) 
     { MessageBox.Show("error LREAD" + ex); } 
     finally 
     { 
      if (reader != null) 
      { reader.Dispose(); } 
     } 
    } 


    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 

     try 
     { 
      connection.Open(); 
      listBox1.Items.Clear(); 
      lRead($"select * from Table1 where UAS Like '%{textBox1.Text}%'", listBox1); 
      lRead($"select * from Table1 where Customer Like '%{textBox1.Text}%'", listBox1); 
      lRead($"select * from Table1 where Description Like '%{textBox1.Text}%'", listBox1); 
      lRead($"select * from Table1 where Detail Like '%{textBox1.Text}%'", listBox1); 
      //select * from SomeTable Where SomeColumn Like '* PARMA *' dont use * use % 
      connection.Close(); 
     } 
     catch 
     { 
      System.Threading.Thread.Sleep(500); 
      try 
      { 
       connection.Open(); 
       listBox1.Items.Clear(); 
       lRead($"select * from Table1 where UAS Like '%{textBox1.Text}%'", listBox1); 
       lRead($"select * from Table1 where Customer Like '%{textBox1.Text}%'", listBox1); 
       lRead($"select * from Table1 where Description Like '%{textBox1.Text}%'", listBox1); 
       lRead($"select * from Table1 where Detail Like '%{textBox1.Text}%'", listBox1); 
       //select * from SomeTable Where SomeColumn Like '* PARMA *' dont use * use % 
       connection.Close(); 
      } 
      catch 
      { 
       System.Threading.Thread.Sleep(500); 
       try 
       { 
        connection.Open(); 
        listBox1.Items.Clear(); 
        lRead($"select * from Table1 where UAS Like '%{textBox1.Text}%'", listBox1); 
        lRead($"select * from Table1 where Customer Like '%{textBox1.Text}%'", listBox1); 
        lRead($"select * from Table1 where Description Like '%{textBox1.Text}%'", listBox1); 
        lRead($"select * from Table1 where Detail Like '%{textBox1.Text}%'", listBox1); 
        //select * from SomeTable Where SomeColumn Like '* PARMA *' dont use * use % 
        connection.Close(); 
       } 
       catch 
       { 

        MessageBox.Show("Error too many People Searching "); 
       } 

      } 

     } 
+0

エラーと、それを引き起こしている行を教えてください。 – LarsTech

+0

それはエラーではありません。デバッグする必要はありません。あまりにも多くの人がアクセスすると、私は接続をより良く処理する必要があります。 – AllianceMaterials

+1

"エラーではありません。"確かに問題が発生したときに何かが起こり、それを共有することができます。 – Brad

答えて

2

これらの行は何も役に立ちません。新しいOleDbConnection()を割り当てて、スコープの外に出させます。接続は限られたリソースなので、使用しないでください。

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(); 
     conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=S:\Documents\2015\Db12.accdb"; 

private OleDbConnection connection = new OleDbConnection(); 
connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=S:\Documents\2015\Db12.accdb"; 

は、実際にデータベースにアクセスする方法に移動されなければなりません。接続は限られたリソースなので、IDisposableを実装します。 IDisposableを実装するものは、using statementを使用して、関連するリソースができるだけ早く解放されるようにする必要があります。あなたはここでそれをやっていないので、同時実行性を制限しているかもしれません。代わりに、フォームの存続期間中は接続を保持しますが、ガベージコレクタがフォームをクリーンアップするのに時間がかかります。

textBox1_TextChangedでは、同じコードを何度も繰り返します。それはエラーが起こりやすい(ある場所でコードを変更しても、他の場所でコードを変更するのを忘れた場合)このようなリトライロジックが必要な場合は、ループを使用してください。また、私は、エラーを取得した複数のユーザーがすべて同じ時間の間スリープしてから再試行することがないように、睡眠時間をややランダム化することをお勧めします。接続割り当てをこのメソッドにも移動して、可能な限り最短時間接続を保持します。

これまでのコメントも役に立ちます。私はここでそのアドバイスを繰り返さない。

+0

これは素晴らしいスタートであり、すべてのもののアドバイスは参考になる以上のものであり、これを試してみていただきありがとうございます。 – AllianceMaterials

関連する問題