2011-11-04 4 views
2

Я изучаю классы на C# и пытаюсь создать «DataAccessClass». У меня работает «OpenSqlConnection» void, и я использую его как руководство для создания «OpenSqlDatareader» void. Я пытаюсь объединить все мои вызовы базы данных в этом классе. Мое препятствие - это передать DataTable из класса на страницу aspx, чтобы связать его с ListView. Я читал и пытался в течение дня, чтобы сделать эту работу и не могу понять, что я делаю неправильно ...Как передать DataTable из класса на страницу

Вот 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 »не удалось найти (вы не указали директиву использования или ссылку на сборку?)« Любые предложения?

+1

Вот урок: страницы _are_ classes. –

+1

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

+0

из вашего сообщения об ошибке Я думаю, вы использовали локальный varialbe под названием «dt» вне того, где он действителен ... где он объявлен? –

ответ

0

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

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

1

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

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

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

Смежные вопросы