从Access数据库获取数据的正确方法

时间:2013-03-01 00:54:27

标签: c# winforms

我对如何从访问数据库获取数据感到困惑。在List中首先收集它然后从列表中获取这些数据是否合适?或者可以直接在数据库中获取它?

我的代码工作得很好,但我想知道是否有更好的方法来做到这一点? :

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

*我直接从数据库中获取记录,然后将其显示在列表框中。

4 个答案:

答案 0 :(得分:18)

像拇指一样伸出的一件事是SQLInjection并使用参数化查询,例如:

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

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

尽管通常最好使用SQL数据库,但您的工作完全可以接受。

编辑: 以下是从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;
}

答案 1 :(得分:4)

我会说答案对两者都是肯定的。

现在你正在做的事情对于简单的案例是完全可以接受的。请注意,它不能很好地“扩展”。也就是说,加载10或20个项目就可以了。但如果它变成一万或一百万,会发生什么?

在这种情况下,您需要查看使用模型 - 视图 - 控制器(MVC)架构。这本身就是一个话题,但基本上你将列表框(“视图”)与数据(“模型”)分离。

请参阅this site for a C#-centric MVC discussion

在你现在正在做的事情和一个成熟的MVC架构之间,你可能只想按照你的建议去做 - 首先加载列表然后将它们添加到列表框中。如果只加载一次就没有任何好处,但是如果列表“遍布整个地方”,则每次只需访问一次就可以节省数据库IO开销。

你想问这个问题的事实表明你正走在正确的轨道上。

答案 2 :(得分:2)

虽然您的代码没有任何问题,但我建议您像this example一样执行一些异常处理,因为OleDbConnection.Open()OleDbCommand.ExecuteReader()都可能会抛出InvalidOperationException。< / p>

使用using语句包装连接也很常见,因此最后会自动调用connection.close(),但这只是个人偏好。

答案 3 :(得分:1)

您可以将不同类别的数据访问功能分开,或创建通用功能来检索记录。