Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ADO.NET DAL和BLL_C# - Fatal编程技术网

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
语句中。它将在调用方控制之外的某个点被释放或关闭。