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

Posted

技术标签:

【中文标题】从 Access 数据库中获取数据的正确方法【英文标题】:Proper way of getting a data from an Access Database 【发布时间】:2013-03-01 00:54:27 【问题描述】:

我对如何从 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();

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

【问题讨论】:

为未处理的异常做好准备。 【参考方案1】:

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,这样我们就不会向调用者公开任何添加/删除等功能。这是很好的 API 设计。

【讨论】:

对,就是很容易被SQL注入,最好用参数AddwithValue :) 谢谢。这就是我想知道我的代码很好。我现在使用参数化查询。 添加一些异常处理机制会很好。因为不能保证会有一个具有硬编码表名的访问数据库具有读取访问权限。【参考方案2】:

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

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

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

见this site for a C#-centric MVC discussion

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

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

【讨论】:

【参考方案3】:

虽然您的代码可以正常运行,但我建议您像在this example 中那样执行一些异常处理,因为OleDbConnection.Open()OleDbCommand.ExecuteReader() 都可能抛出InvalidOperationException

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

【讨论】:

+1 谢谢。我已经在我的答案中包含了演示这一点的代码【参考方案4】:

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

【讨论】:

+1 谢谢。我在我的回答中包含了演示这一点的代码

以上是关于从 Access 数据库中获取数据的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

正确查询以获取 PostgreSQL 数据库中的当前连接数

从 Ms Access Mdb 文件获取数据到 sql server 2005 的最佳方法

MS Access VBA从Web浏览器控件的内容中获取数据

从 access 97 数据库中获取表/模式

在 Visual Studio C# 中从 MS Access 数据库中获取 OLE(位图)对象,我的代码有啥问题?

从 Spring Boot 中只有客户拥有的数据库中获取数据的正确方法