11

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

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

 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

4 回答 4

21

像拇指痛一样突出的一件事是 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());
        }    
   }
 }    
}

图形用户界面

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。

ps 理想情况下ListboxItems,应该是一个 IEnumerable 而不是 List,这样我们就不会从调用者那里向 Add/Remove 等公开任何功能。这是很好的 API 设计。

于 2013-03-01T01:02:43.277 回答
4

我会说两个人的答案都是“是”。

您现在所做的对于简单的情况是完全可以接受的。请注意,它不能很好地“扩展”。也就是说,加载 10 或 20 个项目就可以了。但是,如果它变成一万或一百万会怎样?

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

有关以 C# 为中心的 MVC 讨论,请参阅此站点

在你现在正在做的事情和成熟的 MVC 架构之间,你可能只想按照你的建议去做——首先加载列表,然后将它们添加到列表框中。如果您只加载一次,这不会给您带来任何好处,但是如果列表“到处”加载,您每次只需访问一次就可以节省数据库 IO 开销。

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

于 2013-03-01T01:05:49.903 回答
2

尽管您的代码可以正常运行,但我建议您像本示例中那样执行一些异常处理,因为两者都OleDbConnection.Open()可能OleDbCommand.ExecuteReader()会抛出InvalidOperationException.

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

于 2013-03-01T01:10:04.560 回答
1

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

于 2013-03-01T00:59:58.963 回答