从访问数据库获得数据的正确方法
本文关键字:方法 数据 访问 数据库 | 更新日期: 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()
,但这只是个人偏好。
您可以将数据访问函数划分为不同的类,或者创建通用函数来检索记录。