C# ADO.NET DAL和BLL
我有两个类C# ADO.NET DAL和BLL,c#,C#,我有两个类SqlHelper和dishestype它们在DAL项目中使用 公共类SqlHelper { 公共静态SqlDataReader ExecuteReader(字符串过程, 参数SqlParameter[]命令参数) { 使用(var connection=newsqlconnection)( ConfigurationManager.ConnectionString[“DefaultConnection”].ConnectionString) 使用(var命
SqlHelper
和dishestype
它们在DAL项目中使用
公共类SqlHelper
{
公共静态SqlDataReader ExecuteReader(字符串过程,
参数SqlParameter[]命令参数)
{
使用(var connection=newsqlconnection)(
ConfigurationManager.ConnectionString[“DefaultConnection”].ConnectionString)
使用(var命令=新的SqlCommand(过程,_连接))
{
command.CommandType=CommandType.storedProcess;
command.Parameters.AddRange(commandParameters);
return命令.ExecuteReader();
}
}
公共类餐具类型
{
公共静态SqlDataReader DishestypeSelectAll()
{
返回SqlHelper.ExecuteReader(“dishestypeSelectAllRows”);//过程的名称
}
}
我有类DishedTypes
,在类似这样的BLL项目中使用
公共类DishesTypes
{
公共类型ID{get;set;}
公共字符串类型{get;set;}
公共静态列表目录类型SelectAll()
{
IDataReader dr=DataAccessLayer.DishestTypes.DishestTypesSelectAll();
List dishesTypesList=新列表();
while(dr.Read())
{
DishesTypes myDishesTypes=新的DishesTypes
{
DishTypeId=(int)dr[“DishTypeId”],
dishcype=(字符串)dr[“dishcype”]
};
dishestypes list.Add(myDishesTypes);
}
返回dishesTypesList;
}
}
问题从这里开始
,而(dr.Read())
,原因是,到这一点的连接已经关闭,有必要重新连接如何最好地更改类DAL和BLL的实现,以使其工作?如果您想自己运行,这样更好:
public class DataQuery
{
private readonly string _connectionString;
public DataQuery(string connectionString)
{
_connectionString = connectionString;
}
public IEnumerable<T> GetList<T>(string procedure,
Func<IDataRecord, T> entityCreator,
params SqlParameter[] commandParameters
)
{
var result = new List<T>();
using (var connection = CreateConnection())
using (var command = CreateCommand(procedure, connection, commandParameters))
using (var reader = command.ExecuteReader())
{
result.Add(entityCreator(reader));
}
return result;
}
private SqlConnection CreateConnection()
{
var connection = new SqlConnection(_connectionString);
connection.Open();
return connection;
}
private static DbCommand CreateCommand(string procedure,
SqlConnection connection, SqlParameter[] commandParameters)
{
var command = new SqlCommand(procedure, connection)
{
CommandType = CommandType.StoredProcedure
};
command.Parameters.AddRange(commandParameters);
return command;
}
}
公共类数据查询
{
私有只读字符串_connectionString;
公共数据查询(字符串连接字符串)
{
_connectionString=connectionString;
}
公共IEnumerable GetList(字符串过程,
Func entityCreator,
参数SqlParameter[]命令参数
)
{
var result=新列表();
使用(var connection=CreateConnection())
使用(var命令=CreateCommand(过程、连接、命令参数))
使用(var reader=command.ExecuteReader())
{
添加(entityCreator(reader));
}
返回结果;
}
专用SqlConnection CreateConnection()
{
var connection=newsqlconnection(_connectionString);
connection.Open();
回路连接;
}
私有静态DbCommand CreateCommand(字符串过程,
SqlConnection连接,SqlParameter[]命令参数)
{
var命令=新的SqlCommand(过程、连接)
{
CommandType=CommandType.StoredProcess
};
command.Parameters.AddRange(commandParameters);
返回命令;
}
}
你会这样称呼它:
var connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"]
.ConnectionString;
var query = new DataQuery(connectionString);
Func<IDataRecord, DishesTypes> creator = dr =>
new DishesTypes
{
DishTypeId = (int)dr["DishTypeId"],
DishType = (string)dr["DishType"]
};
var results = query.GetList("DishesTypesSelectAllRows", creator);
var connectionString=ConfigurationManager.connectionString[“DefaultConnection”]
.连接字符串;
var query=新数据查询(connectionString);
Func creator=dr=>
新的餐具类型
{
DishTypeId=(int)dr[“DishTypeId”],
dishcype=(字符串)dr[“dishcype”]
};
var results=query.GetList(“DishesTypesSelectAllRows”,创建者);
否则,我建议你看看 Dapper将允许您简单地执行以下操作:
var results = connection.Query<DishesTypes>("DishesTypesSelectAllRows",
commandType: CommandType.StoredProcedure);
var results=connection.Query(“DishesTypesSelectAllRows”,
commandType:commandType.StoredProcess);
首先,你的using
语句正在关闭你的连接,因此你不能期望返回一个可用的IDataReader
。其次,你的连接从未打开过,所以你无论如何也不会得到结果这对代码的影响应该是最小的
public class SqlHelper
{
public static IDataReader ExecuteReader(string procedure, params SqlParameter[] commandParameters)
{
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
{
connection.Open();
using (var command = new SqlCommand(procedure, connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddRange(commandParameters);
DataTable dt = new DataTable();
using (SqlDataAdapter da = new SqlDataAdapter(command))
da.Fill(dt);
return dt.CreateDataReader();
}
}
}
}
public class DishesTypes
{
public static IDataReader DishesTypesSelectAll()
{
return SqlHelper.ExecuteReader("DishesTypesSelectAllRows");//name of procedure
}
}
您不应该将返回的内容放入
using
语句中。它将在调用方控制之外的某个点被释放或关闭。