2013-03-01 22 views
7

私は、アクセスデータベースからデータを取得する方法を少し混乱させています。リスト内で最初にそれを集めて、あなたのリストからそれらのデータを取得するのは正しいのですか、それとも直接データベースに入れても大丈夫ですか?Accessデータベースからデータを取得する適切な方法

私のコードは完全に正常に動作しますが、これを行うには良い方法があるかどうかを知りたいのですか? :

private void button3_Click(object sender, EventArgs e) 
    { 
     OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\redgabanan\Desktop\Gabanan_Red_dbaseCon\Red_Database.accdb"); 
     connection.Open(); 
     OleDbDataReader reader = null; 
     OleDbCommand command = new OleDbCommand("SELECT * from Users WHERE LastName='"+textBox8.Text+"'", connection); 
     reader = command.ExecuteReader(); 
     listBox1.Items.Clear(); 

     while (reader.Read()) 
     { 

      listBox1.Items.Add(reader[1].ToString()+","+reader[2].ToString()); 
     } 

     connection.Close(); 

*データベースから直接レコードを取得してリストボックスに表示しています。

+0

処理されない例外については、 – kiran

答えて

15

ことの一つは、SQLインジェクションとパラメータ化クエリを使用するには、例えば次のとおりです。あなたは、一般的にSQLを使用するようにしたほうが良いでしょうが、あなたのやっは、完全に受け入れている何

OleDbCommand command = new OleDbCommand("SELECT * from Users WHERE LastName='@1'", connection); 

command.Parameters.AddWithValue("@1", textBox8.Text) 

データベース。

編集:ここ は、GUIからビジネスロジックを区切る方法です:

Class BusLogic 
{ 
public List<string> ListboxItems = new List<string>(); 
public void PopulateListBoxItems(string userName) 
{ 
    string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\redgabanan\Desktop\Gabanan_Red_dbaseCon\Red_Database.accdb"; 
    using (OleDbConnection connection = new OleDbConnection(connString)) 
    { 
     connection.Open(); 
     OleDbDataReader reader = null; 
     OleDbCommand command = new OleDbCommand("SELECT * from Users WHERE LastName='@1'", connection);    
     command.Parameters.AddWithValue("@1", userName) 
     reader = command.ExecuteReader();  
     while (reader.Read()) 
     { 
      ListboxItems.Add(reader[1].ToString()+","+reader[2].ToString()); 
     }  
    } 
}  
} 

GUI

private void button3_Click(object sender, EventArgs e) 
{   
     var busLogic = new BusLogic(); 
     busLogic.PopulateListBoxItems(textBox8.Text);   
     \\listBox1.Items.Clear(); 
     ListboxItems.DataSource = busLogic.ListboxItems; 
} 
+0

で示していますが、それはSQLインジェクションに対して非常に脆弱です。パラメータはAddwithValueを使用してください:) – Pyromancer

+2

ありがとう。それは私のコードが大丈夫であることを知りたいだけです。 Parameticedクエリを使用しました。 –

+0

エラーがなければ、それはいいです:) – Pyromancer

1

異なるクラスのデータアクセス関数を分離したり、ジェネリック関数を作成してレコードを取得することができます。痛み親指のように突き出ている

+0

私の仕事は大丈夫ですか? –

+0

+1ありがとうございます。私はこれを示す答えを –

2

私は答えは "イエス" の両方にあると言うでしょう。

あなたが今やっていることは、単純なケースでは完全に受け入れられます。ちょうどそれが「スケール」していないことに気をつけてください。つまり、10個または20個のアイテムを読み込んでも問題ありません。しかし、それが万人になるとどうなるのでしょうか?

この場合、モデルビューコントローラ(MVC)アーキテクチャを使用して見たいと思っています。それ自体は話題ですが、基本的にはリストボックス(ビュー)とデータ(「モデル」)を分離します。

は何あなたが今やっていると本格的なMVCアーキテクチャ間でthis site for a C#-centric MVC discussion

を参照してください、あなたは単にあなたが示唆としてやりたいこと - リストボックスに追加し、最初のリストを読み込みます。一度ロードすれば何も得られませんが、リストが "どこにいても"ロードされれば、毎回データベースIOのオーバーヘッドを1回だけ保存することができます。

質問をしたと思うという事実は、あなたが正しい方向にいることを示しています。

+0

ありがとうございました。 –

2

あなたのコードは問題なく動作しますがOleDbConnection.Open()OleDbCommand.ExecuteReader()両方がInvalidOperationExceptionを投げるかもしれないので、私は、this exampleのようにいくつかの例外処理を実行することができ示唆しています。

usingステートメントで接続をラップするのが一般的です。したがって、最後にはconnection.close()が自動的に呼び出されますが、これは個人的な好みに過ぎません。

+0

+1ありがとうございます。私はこれを私の答えに示すコードを含めました –

関連する問題