2015-04-19 8 views
0

Я продолжаю получать ошибку, когда выбираю значение из моего раскрывающегося списка.возвращает действительный набор данных с использованием asp.net C#

**The SelectCommand property has not been initialized before calling 'Fill'.**

Похоже, мой набор данных возвращается как пустое.

Я хочу придерживаться структуры 3 уровня.

Как вернуть действительный набор данных, используя мой код?

DAL

public static DataTable GetCustomer(collection b) 
{ 
    { 
     DataTable table; 
     try 
     { 
      string returnValue = string.Empty; 
      DB = Connect(); 
      DBCommand = connection.Procedure("getCustomer"); 
      DB.AddInParameter(DBCommand, "@CustomerRef", DbType.String, b.CustomerRef1); 

      DbDataReader reader = DBCommand.ExecuteReader(); 
      table = new DataTable(); 
      table.Load(reader); 
      return table; 
     } 
     catch (Exception ex) 
     { 
      throw (ex); 
     } 

    } 

} 

BLL

Похоже, у меня есть некоторый избыточный код ниже. Я хотел бы использовать мой класс соединения ниже:

public DataSet returnCustomer(collection b) 
    { 
     try 
     { 
      SqlDataAdapter adapt = new SqlDataAdapter(); 
      DataSet table = new DataSet(); 

      adapt.Fill(table, "table"); 
      return table; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

Класс соединения

using Microsoft.Practices.EnterpriseLibrary.Data; 
using Microsoft.Practices.EnterpriseLibrary.Common; 
using Microsoft.Practices.ObjectBuilder; 
using System.Data.Common; 
using System.Data; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace DAL 
{ 
    public class connection 
    { 
     const string StrConnection = "CustomerHelperConnectionString"; 
     internal static Database DB; 
     public static DbCommand DBCommand; 
     public static Database Connect() 
     { 

      try 
      { 
       DB = DatabaseFactory.CreateDatabase(StrConnection); 
       return DB; 
      } 
      catch (Exception ex) 
      { 
       throw (ex); 
      } 
     } 
     public static DbCommand Procedure(string procedure) 
     { 

      try 
      { 
       DBCommand = DB.GetStoredProcCommand(procedure); 
       return DBCommand; 
      } 
      catch (Exception ex) 
      { 
       throw (ex);    
      } 
     } 
    } 
} 

PL

protected void ddl_Customers_SelectedIndexChanged(object sender, EventArgs e) 
{ 

    DAL.collection cobj = new collection(); 
    BLL.business bobj = new business(); 

    string selectedValue = ddl_Customers.SelectedValue.ToString(); 

     //populate the text boxes 
     txtCustomerRef.Text = bobj.returnCustomer(cobj).Tables[0].Rows[0][0].ToString(); 
} 
+0

В методе 'returnCustomer' ваш адаптер данных не имеет в нем никакой команды. Таким образом, он пуст. Из этого ничего не нужно. –

+0

Добавлен класс подключения * – PriceCheaperton

+0

Я думаю, что в коде BLL чего-то нет, я ничего не делал, я имел в виду, что вам нужно иметь некоторый командный объект для заполнения этого или запроса DAL, получить некоторое значение, применить фильтр на основе бизнес-логики, а затем вернуть объект и если вам нужно 'CustomerRef1' только в' GetCustomer', вы можете передать 'string' напрямую. –

ответ

1

Изменение кода DAL, как это:

public static DataTable GetCustomer(collection b) 
{ 
    { 
     DataTable table = new DataTable(); 
     try 
     { 
      string returnValue = string.Empty; 
      DB = Connect(); 
      DBCommand = connection.Procedure("getCustomer"); 
      DB.AddInParameter(DBCommand, "@CustomerRef", DbType.String, b.CustomerRef1); 

      SqlDataAdapter adptr = new SqlDataAdapter(DBCommand); 
      adptr.Fill(table); 
      return table; 
     } 
     catch (Exception ex) 
     { 
      throw (ex); 
     } 
    } 
} 

и теперь ваш BAL, как это,

public DataSet returnCustomer(collection b) 
    { 
     try 
     { 
      DataSet _ds = new DataSet(); 
      _ds.Tables.Add(DAL.GetCustomer(b)); 
      return _ds; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 
+0

не может конвертировать из 'System.Data.Common.DbCommand' в 'System.Data.SqlClient.SqlCommand' – PriceCheaperton

+0

Наилучшее перегруженное соответствие метода для 'System.Data.SqlClient.SqlDataAdapter.SqlDataAdapter (System.Data.SqlClient.SqlCommand)' имеет некоторые недопустимые аргументы – PriceCheaperton

+0

Я также открыт для вашего ответа. – PriceCheaperton

1

согласно моему предположению, упомянутых в комментариях к вопросу OP, вы необходимо следовать.

Изменение DAL, чтобы этот public static DataTable GetCustomer(string customer_ref) и использовать DB.AddInParameter(DBCommand, "@CustomerRef", DbType.String, customer_ref);

Я вижу, что нет работы, проделанной в БАЛ, поэтому я вприпрыжку использование этого.

Вместо использования объекта BLL в bobj используйте один из экземпляров DAL, так как он имеет GetCustomer и имеет некоторую работу по извлечению информации из БД.

Так предполагая bobj является экземпляром DAL, затем, изменить PL, как это - txtCustomerRef.Text = bobj.GetCustomer(selectedValue).Tables[0].Rows[0][0].ToString();

+0

Спасибо, но я не вижу GetCustomer из своего PL – PriceCheaperton

+0

Вот почему я написал, чтобы сделать «bobj как экземпляр DAL вместо BLL» –

+0

Я создал 'DAL.collection dobj = new collection();' и я до сих пор не вижу GetCustomer – PriceCheaperton