0

我想显示存储在 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();
}
4

3 回答 3

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();
   ...
   ...
}

这可确保您的连接在使用后得到妥善处理

于 2012-10-20T19:42:07.900 回答
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();
    }
于 2012-10-20T19:12:29.297 回答
0

首先,请不要在 SQL 中连接 WHERE 参数。使用参数。其次,在模块顶部添加“使用 System.Data.OleDb”语句,这样您就不必键入以下内容:

System.Data.OleDb.OleDbDataAdapter

一遍又一遍地。

试试下面的代码。就个人而言,当我必须使用数据表等时,我更愿意避免所有的 DataAdapter 废话,并使其尽可能简单。

请注意以下代码:

  1. “使用”块。这些将在其中创建的变量放置在它们自己的范围内,并为您处理处置等。

  2. 我使用了 OleDb 参数而不是连接标准。这是一种更安全的做事方式,也可以创建更清晰、更易读的代码,尤其是在 WHERE 子句中有多个条件的情况下。

  3. 我假设您的 UserID 输入是一个字符串,因为您正在从文本框中获取值。如果它实际上是一个 int 值(例如 MS Access 中的自动递增 id),您将需要使用 int 数据类型。你可能不得不稍微弄乱它。当您仍在弄清楚这些东西时,可能会有些痛苦。但是,使用参数可以提高安全性和可维护性。

一旦您从 MyUsers 方法获得了一个数据表作为返回,您应该能够简单地设置您的 Gridview 的数据源。如果您仍然遇到困难,请按照 Steve 的建议执行并检查设计器中的 Autogenerate columns 属性,或在代码中设置它。

  1. 并不是说我已将连接字符串移至项目属性/设置。您应该在解决方案设计器中找到它。将您的连接字符串放在一个位置,您可以从代码中的任何位置获取它。如果您稍后更改连接字符串(例如将您的 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 时。

于 2012-10-20T19:51:51.470 回答