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

我对如何从访问数据库获取数据感到困惑。 在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(); 

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

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

 OleDbCommand command = new OleDbCommand("SELECT * from Users WHERE LastName='@1'", connection); command.Parameters.AddWithValue("@1", textBox8.Text) 

你做的事情是完全可以接受的,尽管你通常最好使用SQL数据库。

编辑:以下是如何从GUI分离业务逻辑:

 Class BusLogic { public List ListboxItems = new List(); 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; } 

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

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

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

请参阅此站点以获取C#中心MVC讨论

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

你想提问的事实表明你走在了正确的轨道上。

尽管您的代码没有任何问题,但我建议您执行此示例中的exception处理,因为OleDbConnection.Open()OleDbCommand.ExecuteReader()可能抛出InvalidOperationException

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

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