Как передать DataTable из класса на страницу

#c# #.net #class-design

#c# #.net #класс-дизайн

Вопрос:

Я изучаю классы на C # и пытаюсь создать «DataAccessClass». У меня есть рабочая пустота «OpenSqlConnection», и я использую ее в качестве руководства для создания пустоты «OpenSqlDatareader». Я пытаюсь объединить все мои вызовы базы данных в этом классе. Мой вопрос в том, как передать DataTable из класса на страницу 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 blnResu<
}

// -----------------------------------------------------------------------------------------
// 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 blnResu<
  }
}
  

Сообщение об ошибке: «Не удалось найти тип или имя пространства имен ‘dt’ (вам не хватает директивы using или ссылки на сборку?)»
Есть предложения?

Комментарии:

1. Вот урок: страницы являются классами.

2. Вот еще: вызывайте Dispose только для объекта, с которым вы закончили. Хотя вы , возможно, уже закончили с таблицей данных, ваша сетка еще не закончила с ней.

3. из вашего сообщения об ошибке я думаю, что вы использовали локальную переменную с именем «dt» за пределами того места, где она допустима… где это объявлено?

Ответ №1:

Чтобы добавить к списку проблем с этим кодом (который вы еще не обнаружили, потому что вы не зашли так далеко):

В вашем OpenSqlDataReader методе вам нужно создать экземпляр вашего SqlConnection объекта, используя определенную вами строку подключения. Прямо сейчас вы просто создаете его с помощью пустого конструктора, что означает, что он не будет функционировать как фактический объект подключения.

Кроме того, вам нужно будет явно вызвать . Open() в вашем объекте подключения. В противном случае он не будет открыт, и при попытке его использования вы получите исключение.

Ответ №2:

перед вызовом 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);
}
...
  

измените свою подпись OpenSqlDatareader с помощью out DataTable dt

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

внутри метода

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

Ответ №3:

В Page_Load вам также нужно будет объявить dt .