当我从下拉列表中选择一个值时,我一直收到错误。
**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 :(得分:1)
根据我对OP问题的评论中提到的假设,你需要关注。
更改DAL以使其public static DataTable GetCustomer(string customer_ref)
并使用此DB.AddInParameter(DBCommand, "@CustomerRef", DbType.String, customer_ref);
我发现在BAL中没有完成任何工作,所以我正在跳过它的使用。
不使用bobj
中的BLL对象,而是使用DAL实例中的一个,因为它具有GetCustomer
,并且有一些工作要从DB获取信息。
假设bobj
是DAL的实例,接下来,改变PL,就像这样 - txtCustomerRef.Text = bobj.GetCustomer(selectedValue).Tables[0].Rows[0][0].ToString();
答案 1 :(得分: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;
}
}