从访问数据库获得数据的正确方法

本文关键字:方法 数据 访问 数据库 | 更新日期: 2023-09-27 18:01:51

我有点困惑如何从访问数据库获得数据。首先在列表中收集它,然后从列表中获取这些数据,或者直接在数据库中获取它是合适的吗?

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

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

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

从访问数据库获得数据的正确方法

一个突出的问题是sqlinject和使用参数化查询,例如:

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;
}

这个"mvc"的美方法是,只有当我们依赖于使用Binding绑定的控件时,才真正需要测试BusLogic。

理想情况下,ListboxItems将是IEnumerable而不是List,这样我们就不会从调用者中暴露任何添加/删除等功能。这是一个很好的API设计

我认为答案是肯定的。

对于简单的情况,你现在所做的是完全可以接受的。只是要注意它并不能很好地"扩展"。也就是说,加载10或20个项目是可以的。但如果变成1万或1百万呢?

在这种情况下,您需要考虑使用模型-视图-控制器(MVC)体系结构。这本身就是一个主题,但基本上你将列表框("视图")与数据("模型")解耦。

查看此站点以c#为中心的MVC讨论

在你现在所做的和一个成熟的MVC架构之间,你可能只是想做你建议的——首先加载列表,然后将它们添加到列表框中。如果你只加载它一次,这对你没有任何好处,但是如果列表被"到处"加载,你可以通过每次只访问它一次来节省数据库IO开销。

你想到要问这个问题就说明你的思路是对的。

虽然您的代码工作没有任何问题,但我建议您执行一些异常处理,如本例所示,因为OleDbConnection.Open()OleDbCommand.ExecuteReader()都可能抛出InvalidOperationException

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

您可以将数据访问函数划分为不同的类,或者创建通用函数来检索记录。