#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
.