Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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# 实体框架核心中的存储过程“;枚举未产生任何结果”;错误_C#_Asp.net Core_Ado.net_Entity Framework Core_Ado.net Entity Data Model - Fatal编程技术网

C# 实体框架核心中的存储过程“;枚举未产生任何结果”;错误

C# 实体框架核心中的存储过程“;枚举未产生任何结果”;错误,c#,asp.net-core,ado.net,entity-framework-core,ado.net-entity-data-model,C#,Asp.net Core,Ado.net,Entity Framework Core,Ado.net Entity Data Model,在我的ASP.NET Core 1.1项目和EF Core 1.1中,我尝试通过以下方法调用SQL Server存储过程,并执行以下操作。但是在下面的代码中,我在While循环中得到了上面的错误 我已经使用SQL Server Profiler验证了在 DbDataReader oReader = await cmd.ExecuteReaderAsync(); 行,当我在SSMS中运行捕获的SQL调用时,它确实返回了正确的记录数 那么,我为什么会得到错误,以及如何解决它呢?由于此错误,应用程序

在我的ASP.NET Core 1.1项目和EF Core 1.1中,我尝试通过以下方法调用SQL Server存储过程,并执行以下操作。但是在下面的代码中,我在
While循环中得到了上面的错误

我已经使用SQL Server Profiler验证了在

DbDataReader oReader = await cmd.ExecuteReaderAsync();
行,当我在SSMS中运行捕获的SQL调用时,它确实返回了正确的记录数

那么,我为什么会得到错误,以及如何解决它呢?由于此错误,应用程序无法在视图中返回结果

注意:您可能已经注意到,我正在使用ADO.NET与EF提供的数据库连接[参考:上述MSDN文章]

public async Task<List<CustOrderViewModel>> getOrderReport(int SelectedYear, byte SelectedOrderType)
{
    List<CustOrderViewModel> lstOrderReport = new List<CustOrderViewModel>();

    using (SqlConnection conn = (SqlConnection)_context.Database.GetDbConnection())
    {
        await conn.OpenAsync();

        using (SqlCommand cmd = conn.CreateCommand())
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "getOrderReport_SP";
            cmd.Parameters.AddWithValue("@year", SelectedYear);
            cmd.Parameters.AddWithValue("@orDerType", SelectedProjType);

            DbDataReader oReader = await cmd.ExecuteReaderAsync();

            if (oReader.HasRows)
            {
                while (await oReader.ReadAsync())
                {
                    var row = new CustOrderViewModel
                    {
                        SelectedOrderYr = oReader.GetInt32(0),
                        OrderNumber = oReader.GetString(1),
                        OrderDesctiption = oReader.GetString(3),
                        OrderType = oReader.GetByte(8)
                    };
                    lstOrderReport.Add(row);
                }
            }

            oReader.Dispose();
        }
    }

    return lstOrderReport;
}
公共异步任务getOrderReport(int-SelectedYear,byte-SelectedOrderType)
{
List lstOrderReport=新列表();
使用(SqlConnection conn=(SqlConnection)\u context.Database.GetDbConnection()
{
等待连接OpenAsync();
使用(SqlCommand cmd=conn.CreateCommand())
{
cmd.CommandType=CommandType.storedProcess;
cmd.CommandText=“getOrderReport\u SP”;
cmd.Parameters.AddWithValue(“@year”,SelectedYear);
cmd.Parameters.AddWithValue(“@orDerType”,SelectedProjType);
DbDataReader oReader=await cmd.ExecuteReaderAsync();
if(oReader.HasRows)
{
while(等待oReader.ReadAsync())
{
var row=新的CustOrderViewModel
{
SelectedOrderYr=oReader.GetInt32(0),
OrderNumber=oReader.GetString(1),
OrderDesctiption=oReader.GetString(3),
OrderType=oReader.GetByte(8)
};
lstOrderReport.Add(行);
}
}
oReader.Dispose();
}
}
返回订单报告;
}

ORMs和Micro-ORMs的优点之一是它们通常为您处理可为空的数据

但是,在低级别(直接使用ADO.NET)工作时,您需要自己处理所有事情。使用
DbDataReader
意味着您应该在调用具体的
GetXXX
方法之前使用该方法

因此,如果
OrderDesctiption
列可为空,为了避免异常,您应该使用如下内容

OrderDesctiption = !oReader.IsDBNull(3) ? oReader.GetString(3) : null,
类似于任何其他可为null的类型列

由于在许多地方这样做很烦人,我宁愿创建一个小的助手扩展方法实用程序,如下所示:

public static class DataReaderExtenstions
{
    public static string GetNString(this DbDataReader reader, int ordinal)
    {
        return !reader.IsDBNull(ordinal) ? reader.GetString(ordinal) : null;
    }
    public static int? GetNInt32(this DbDataReader reader, int ordinal)
    {
        return !reader.IsDBNull(ordinal) ? reader.GetInt32(ordinal) : (int?)null;
    }
    // Similar for Int16, Byte, Decimal, Double, DateTime etc.
}
如果需要,只需使用
N
(可为空)版本即可:

OrderDesctiption = oReader.GetNString(3),

您的代码中的
lstPADBReport
是什么?你从哪里得到上述的例外情况?@IvanStoev这是一个打字错误。我已经改正了。它是
lstOrderReport.Add(行)但是错误是一样的。我明白了。哪一行抛出异常?我们可以看到异常堆栈跟踪吗?嗯,ORM通常对您隐藏null处理,但是当您在低级别(直接使用ADO.NET)上工作时,您应该自己处理。例如,如果
OrderDesctiption
列可为空,则应使用类似
OrderDesctiption=!oReader.IsDBNull(3)?oReader.GetString(3):null
。并对每个可为空的列执行相同的操作。@IvanStoev您的上述评论解决了这个问题(谢谢)。你的第一句话实际上帮助我找到了问题的原因。为了每个人的利益,你可能想把你的上述评论作为一个回应,我将把它标记为一个答案。