我想显示存储在MS Access数据库中的用户的信息。用户输入他的用户ID并在点击按钮后跟随功能被调用。但是没有显示数据。我究竟做错了什么 ?
System.Data.OleDb.OleDbConnection con;
System.Data.OleDb.OleDbDataAdapter da;
protected void Button1_Click(object sender, EventArgs e)
{
con = new System.Data.OleDb.OleDbConnection();
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"
+ "Data Source=C:\\Users\\sam\\Desktop\\mydb.mdb";
con.Open();
string sql = "SELECT * From Leave where userid="+Textbox1.Text;
da = new System.Data.OleDb.OleDbDataAdapter(sql, con);
DataTable t = new DataTable();
da.Fill(t);
GridView1.DataSource = t;
con.Close();
}
答案 0 :(得分:1)
您需要致电GridView1.DataBind()
GridView1.DataSource = t;
GridView1.DataBind();
请注意,最好将您的连接与using
using(con = new System.Data.OleDb.OleDbConnection())
{
con = new System.Data.OleDb.OleDbConnection();
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"
+ "Data Source=C:\\Users\\sam\\Desktop\\mydb.mdb";
con.Open();
...
...
}
答案 1 :(得分:0)
你应该使用绑定功能:
protected void Button1_Click(object sender, EventArgs e)
{
con = new System.Data.OleDb.OleDbConnection();
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"
+ "Data Source=C:\\Users\\sam\\Desktop\\mydb.mdb";
con.Open();
string sql = "SELECT * From Leave where userid="+Textbox1.Text;
da = new System.Data.OleDb.OleDbDataAdapter(sql, con);
DataTable t = new DataTable();
da.Fill(t);
GridView1.DataSource = t;
GridView1.DataBind();
con.Close();
}
答案 2 :(得分:0)
首先,请不要在SQL中连接WHERE参数。使用参数。其次,在模块顶部添加“using System.Data.OleDb”语句,这样您就不必输入如下内容:
System.Data.OleDb.OleDbDataAdapter
一遍又一遍。
尝试以下代码。就个人而言,当我不得不使用数据表等时,我宁愿避免所有DataAdapter的废话,并保持尽可能简单。
请注意以下代码:
“使用”块。这些变量将在其中创建的变量放在自己的范围内,并为您处理。
我使用了OleDb参数而不是连接标准。这是一种更安全的方法,并且可以创建更清晰,更易读的代码,尤其是在WHERE子句中有多个条件的情况下。
我假设您的UserID输入是一个字符串,因为您从文本框中获取值。如果它实际上是一个int值(例如MS Access中的自动递增id),则需要使用int数据类型。你可能不得不惹一点。当你还在想出这些东西时,可能会有点痛苦。但是,使用参数可提高安全性和可维护性。
获取数据表作为MyUsers方法的返回后,您应该能够简单地设置Gridview的数据源。如果您仍然遇到困难,请按照Steve的建议并检查设计器中的Autogenerate columns属性,或者在代码中进行设置。
示例代码:
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时,它提供了最大的灵活性。