首先,请不要在 SQL 中连接 WHERE 参数。使用参数。其次,在模块顶部添加“使用 System.Data.OleDb”语句,这样您就不必键入以下内容:
System.Data.OleDb.OleDbDataAdapter
一遍又一遍地。
试试下面的代码。就个人而言,当我必须使用数据表等时,我更愿意避免所有的 DataAdapter 废话,并使其尽可能简单。
请注意以下代码:
“使用”块。这些将在其中创建的变量放置在它们自己的范围内,并为您处理处置等。
我使用了 OleDb 参数而不是连接标准。这是一种更安全的做事方式,也可以创建更清晰、更易读的代码,尤其是在 WHERE 子句中有多个条件的情况下。
我假设您的 UserID 输入是一个字符串,因为您正在从文本框中获取值。如果它实际上是一个 int 值(例如 MS Access 中的自动递增 id),您将需要使用 int 数据类型。你可能不得不稍微弄乱它。当您仍在弄清楚这些东西时,可能会有些痛苦。但是,使用参数可以提高安全性和可维护性。
一旦您从 MyUsers 方法获得了一个数据表作为返回,您应该能够简单地设置您的 Gridview 的数据源。如果您仍然遇到困难,请按照 Steve 的建议执行并检查设计器中的 Autogenerate columns 属性,或在代码中设置它。
- 并不是说我已将连接字符串移至项目属性/设置。您应该在解决方案设计器中找到它。将您的连接字符串放在一个位置,您可以从代码中的任何位置获取它。如果您稍后更改连接字符串(例如将您的 Db 移动到另一台计算机、服务器共享等),您只需在一个地方更改它。
示例代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb; // put this here, and stop writing long namespaces inline
namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// Where possible, move code out of specific event handlers
// into methods which can be re-used from other client code.
// Here, I pulled the actual data access out into separate methods,
// and simply call it from the event handler:
this.LoadGridView(textBox1.Text);
}
private void LoadGridView(string UserID)
{
// Now we can load the gridview from other places in our
// code if needed:
this.dataGridView1.DataSource = this.MyUsers(UserID);
}
private DataTable MyUsers(string UserID)
{
var dt = new DataTable();
// Use a SQL Paramenter instead of concatenating criteria:
string SQL = "SELECT * FROM Leave WHERE userid = @UserID";
// The "using" statement limits the scope of the connection and command variables, and handles disposal
// of resources. Also note, the connection string is obtained from the project properties file:
using(OleDbConnection cn = new OleDbConnection(Properties.Settings.Default.MyConnectionString))
{
using (var cmd = new OleDbCommand(SQL, cn))
{
// For simpler things, you can use the "AddWithValue" method to initialize a new parameter,
// add it to the Parameters collection of the OleDBCommand object, and set the value:
cmd.Parameters.AddWithValue("@UserID", UserID);
// Get in, get out, get done:
cn.Open();
dt.Load(cmd.ExecuteReader());
cn.Close();
}
}
return dt;
}
}
}
希望有帮助。不是每个人都可以这样做,但我发现它提供了最大的灵活性,当您必须使用 MS Access 时。