错误:
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。代码:
DALFactory(个人觉得问题在这里)
namespace Div.DALFactory
{
public sealed class DALAccess
{
private static readonly string path = ConfigurationManager.ConnectionStrings["path"].ConnectionString.ToString();
private DALAccess()
{ }
public static IMessageBoard CreatMessage()
{
string classname = path + ".MessageBoard";
return (IMessageBoard)Assembly.Load(path).CreateInstance(classname);
}
}
}BLL层
namespace Div.BLL
{
public class MessageBoard
{
public MessageBoard()
{ }
private readonly IMessageBoard access = DALAccess.CreatMessage(); public DataSet GetList()
{
//SQLServerDAL.MessageBoard sm = new Div.SQLServerDAL.MessageBoard();
//return sm.GetList();//这样调用没有问题
return access.GetList();
} }
}
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。代码:
DALFactory(个人觉得问题在这里)
namespace Div.DALFactory
{
public sealed class DALAccess
{
private static readonly string path = ConfigurationManager.ConnectionStrings["path"].ConnectionString.ToString();
private DALAccess()
{ }
public static IMessageBoard CreatMessage()
{
string classname = path + ".MessageBoard";
return (IMessageBoard)Assembly.Load(path).CreateInstance(classname);
}
}
}BLL层
namespace Div.BLL
{
public class MessageBoard
{
public MessageBoard()
{ }
private readonly IMessageBoard access = DALAccess.CreatMessage(); public DataSet GetList()
{
//SQLServerDAL.MessageBoard sm = new Div.SQLServerDAL.MessageBoard();
//return sm.GetList();//这样调用没有问题
return access.GetList();
} }
}
petshop 4.0 里面的
现在就一个 起始页面的 目录绑定介绍第一部分//// 按照这个框架自己先做一个小例子吧...
★ WEB 表示层
private void BindCategories() {
Category category = new Category();
repCategories.DataSource = category.GetCategories(); // 将 IList<CategoryInfo> 作为数据源
repCategories.DataBind();
★ BLL 业务逻辑层
namespace PetShop.BLL {
public class Category {
private static readonly ICategory dal = PetShop.DALFactory.DataAccess.CreateCategory();
public IList<CategoryInfo> GetCategories() {
return dal.GetCategories();
}
}
}
★ DALFactory 数据层的抽象工厂
namespace PetShop.DALFactory {
public sealed class DataAccess {
private static readonly string path = "PetShop.SQLServerDAL";
private DataAccess() { }
public static PetShop.IDAL.ICategory CreateCategory() {
string className = path + ".Category";
return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className); ------这几个方法原来没有接触过... 说明 : 通过 SQLServer数据访问层 和 数据库访问组件基础类 已经从数据库中得到了数据.此时表示层直接调用 SQLServerDAL 就可以了.
但是 却没有这么做..而是通过 BLL---->.DALFactory----> 才将数据引用进来. }
}
}
★ IDAL 数据访问层接口定义
namespace PetShop.IDAL{
public interface ICategory {
IList<CategoryInfo> GetCategories();
}
}
★ Model 业务实体
namespace PetShop.Model { [Serializable]
public class CategoryInfo {
private string id;
private string name;
private string description;
public CategoryInfo() { }
public CategoryInfo(string id, string name, string description) {
this.id = id;
this.name = name;
this.description = description;
}
public string Id {
get { return id; }
}
public string Name {
get { return name; }
}
public string Description {
get { return description; }
}
}
}
★ SQLServerDAL SQLServer数据访问层
namespace PetShop.SQLServerDAL {
public class Category : ICategory {
private const string SQL_SELECT_CATEGORIES = "SELECT CategoryId, Name, Descn FROM Category";
public IList<CategoryInfo> GetCategories() {
IList<CategoryInfo> categories = new List<CategoryInfo>();
using(SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_CATEGORIES, null)) {
while (rdr.Read()) {
CategoryInfo cat = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));
categories.Add(cat);
}
}
return categories;
}
}
}
★ DBUtility 数据库访问组件基础类
namespace PetShop.DBUtility {
public abstract class SqlHelper {
public static readonly string ConnectionStringLocalTransaction ="Server=.;Database=master;uid=sa;pwd=sa";
public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();
SqlConnection conn = new SqlConnection(connectionString);
try {
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
catch {
conn.Close();
throw;
}
}
private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = cmdType;
if (cmdParms != null) {
foreach (SqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
}
}
你的path是一个connection string 吧?拿AppSetting用 ConfigurationManager.AppSettings["path"]Assembly load不起来当然抛出NullReferenceException
这句的值是否正确?path的值应该是Div.SQLServerDAL
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.IO.FileNotFoundException: 未能加载文件或程序集“Div.SQLServerDAL”或它的某一个依赖项。系统找不到指定的文件。但我的SQLServerDAL层命名空间是定义为:namespace Div.SQLServerDAL请大家帮忙!!
在这个SQLServerDAL底下一定要有个:MessageBoard类---//另外注意webconfig的那个命名空间
就检查Bin里有没有相应的程序集
这样的话你就定义两个巴<add name="path" connectionString="SQLServerDAL"/>
<add name="space" connectionString="Div.SQLServerDAL"/>然后public static IMessageBoard CreatMessage()
{
string classname = ConfigurationManager.ConnectionStrings["space"].ConnectionString.ToString() + ".MessageBoard";
return (IMessageBoard)Assembly.Load(path).CreateInstance(classname);
}
然后用 <add name="path" connectionString="Div.SQLServerDAL"/>