如何将DataTable从类传递到页

本文关键字:DataTable | 更新日期: 2023-09-27 18:13:43

我正在学习c#中的类,并试图构建一个"DataAccessClass"。我有一个工作的"OpenSqlConnection"void,我用它作为一个指南来构建一个"OpenSqlDatareader"void。我试图在这个类中整合所有的数据库调用。我的困惑是如何将数据表从类传递到aspx页面以将其与ListView绑定。我已经阅读和尝试了一天,使这个工作,不知道我做错了什么…

这是Page_Load:

// --------------------------------------------------------------------------------
// Populate the Customers page.
// --------------------------------------------------------------------------------

// Define the query
string sqlQuery = " SELECT CustomerID, LastName + ', ' + FirstName AS CustomerName, Email, City, State, Phone"
                            + " FROM Customer"
                            + " ORDER BY LastName, FirstName";
string strErrorMessage = "";
if (DataAccessClass.OpenSqlConnection(out strErrorMessage) == false)
{
    string strErrorType = "Database Connection Error:";
    SendErrorMessageToClient(strErrorType, strErrorMessage);
}
else if (DataAccessClass.OpenSqlDatareader(sqlQuery, out dt, out strErrorMessage) == false)
{
    string strErrorType = "Datareader Error:";
    SendErrorMessageToClient(strErrorType, strErrorMessage);
}
else
{
    // Bind the Listview
    lvCustomers.DataSource = dt;
    lvCustomers.DataBind();
    dt.Dispose();
}

这是类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
/// <summary>
/// Summary description for DataAccessClass
/// </summary>
/// 
public class DataAccessClass
{
    public DataAccessClass()
{
    //
    // TODO: Add constructor logic here
    //
}

// -----------------------------------------------------------------------------------------
// Name: OpenSqlConnection
// Abstract: Open a connection to a SQL Server
// -----------------------------------------------------------------------------------------
public static bool OpenSqlConnection(out string strErrorMessage)
{
    SqlConnection theConnection = new SqlConnection();
    bool blnResult = false;
    string strConnectionString = ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString;
    strErrorMessage = "";
    if (theConnection == null)
        theConnection = new SqlConnection();
    try
    {
        switch (theConnection.State)
        {
            case ConnectionState.Broken:
                theConnection.Close();
                theConnection.ConnectionString = strConnectionString;
                theConnection.Open();
                blnResult = true;
                break;
            case ConnectionState.Closed:
                theConnection.ConnectionString = strConnectionString;
                theConnection.Open();
                blnResult = true;
                break;
            case ConnectionState.Open:
                blnResult = true;
                break;
            default:
                strErrorMessage = "Connection state is " + theConnection.State.ToString();
                break;
        }
    }
    catch (Exception excError)
    {
        strErrorMessage = excError.Message;
    }
    return blnResult;
}
// -----------------------------------------------------------------------------------------
// Name: OpenSqlDataReader
// Abstract: Open a SQL DataReader
// -----------------------------------------------------------------------------------------
public static bool OpenSqlDatareader(string sqlQuery, out dt, out string strErrorMessage)
{
    SqlConnection theConnection = new SqlConnection();
    bool blnResult = false;
    string strConnectionString = ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString;
    strErrorMessage = "";
    if (theConnection == null)
        theConnection = new SqlConnection();
    try
    {
        // Declare a SQL Adapter
        SqlDataAdapter da = new SqlDataAdapter(sqlQuery, theConnection);
        // Declare a DataTable
        DataTable dt = new DataTable();
        // Populate the DataTable
        da.Fill(dt);
        // Clean up.
        dt.Dispose();
        da.Dispose();
        theConnection.Close();
    }
    catch (Exception excError)
    {
        strErrorMessage = excError.Message;
    }
    return blnResult;
  }
}

错误信息是:"类型或命名空间名称'dt'无法找到(您是否缺少using指令或程序集引用?)"有什么建议吗?

如何将DataTable从类传递到页

添加到这段代码的问题列表中(由于还没有发现这些问题):

OpenSqlDataReader方法中,您需要使用您定义的连接字符串实例化SqlConnection对象。现在,您只是使用空构造函数创建它,这意味着它不会作为实际的连接对象起作用。

还需要显式调用。连接对象上的Open()。否则,它将不会打开,并且当您尝试使用它时将会抛出异常。

在调用OpenSqlDatareader之前,您需要声明dt

DataTable dt;// no need to assign 
....
else if (DataAccessClass.OpenSqlDatareader(sqlQuery, out dt, out strErrorMessage) == false)
{
    string strErrorType = "Datareader Error:";
    SendErrorMessageToClient(strErrorType, strErrorMessage);
}
...

out DataTable dt修改OpenSqlDatareader的签名

public static bool OpenSqlDatareader(string sqlQuery, out DataTable dt, out string strErrorMessage)

方法内部

// create new  DataTable
dt = new DataTable();

Page_Load中,您还需要声明dt