2013-03-01 107 views
7

我对如何从访问数据库获取数据有点困惑。首先将它收集到列表中然后从列表中获取这些数据是合适的,或者直接将它们存储在数据库中可以吗?从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(); 

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

+0

为自己处理未处理的异常。 – kiran 2014-02-27 07:14:02

回答

15

的一件事就是伸出像突兀是SQL注入攻击和使用参数化的查询,如:

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

正确,这是很容易SQL注入,更好地使用参数AddwithValue :) – Pyromancer 2013-03-01 01:05:20

+2

谢谢。这就是我想知道我的代码是好的。我现在使用了Parametised查询。 – 2013-03-01 01:13:17

+0

如果你没有任何错误,这很好:) – Pyromancer 2013-03-01 01:15:40

1

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

+0

所以你的意思是,我的工作没问题? – 2013-03-01 01:05:07

+0

+1谢谢你。我已经包含代码在我的回答 – 2013-03-01 01:14:01

2

我想说的答案是 “是” 两者。

你现在正在做的事情对于简单情况是完全可以接受的。请注意,它不会很好地“缩放”。也就是说,加载10或20个项目是好的。但是,如果它变成一万或一百万,会发生什么?

在这种情况下,您希望查看使用模型 - 视图 - 控制器(MVC)体系结构。这本身就是一个主题,但基本上你可以将列表框(“视图”)与数据(“模型”)分开。

this site for a C#-centric MVC discussion

在你现在在做什么,一个成熟的MVC架构之间,你可能只想做你的建议 - 加载列表中第一个,然后将它们添加到列表框中。如果你只加载一次,那么你就什么也得不到,但是如果列表被全部加载,那么每次只需访问一次就可以节省数据库IO开销。

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

+0

Thanks.Appreciated much。 – 2013-03-01 01:18:11

2

虽然你的代码工作没有任何问题,我建议你在this example执行一些异常处理的,因为这两个OleDbConnection.Open()OleDbCommand.ExecuteReader()可能抛出InvalidOperationException

将连接换成using声明也很常见,因此最终connection.close()会自动调用,但这只是个人偏好。

+0

+1谢谢你。我在我的回答中包含了证明这一点的代码 – 2013-03-01 01:13:39

相关问题