实体框架核心"枚举中的存储过程没有产生任何结果"错误

时间:2017-05-13 06:03:48

标签: c# asp.net-core ado.net entity-framework-core ado.net-entity-data-model

在我使用EF Core 1.1的ASP.NET Core 1.1项目中,我尝试按照official MSDN articlethis post调用SQL Server存储过程。但我在以下代码中的While loop内收到了上述错误。

我已经使用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;
}

1 个答案:

答案 0 :(得分:2)

ORM和Micro ORM的一个好处是它们通常会为您处理可空数据。

但是,在低级别工作时(直接使用ADO.NET),您需要自己处理所有事情。使用<script> $(document).ready(function(){ $("#client-list").on('change', function postinput(){ var matchvalue = $(this).val(); // this.value $.ajax({ url: 'sql/client-to-property.php', data: { matchvalue: matchvalue }, type: 'post' }).done(function(responseData) { console.log('Done: ', responseData); }).fail(function() { console.log('Failed'); }); }); }); </script> <div class="input-group mb-3"> <span class="input-group-addon gi data-gi-size gi-user-add"></span> <select id="client-list" name="client-list"> <?php $sql = "SELECT `id`, `email` FROM `clients` ORDER BY `id` ASC"; $result = $DB_CON_C->query($sql); if($result !== false) { $data_row = '<option>New Client</option>' . "\n"; foreach($result as $row) { $data_row .= '<option>' .$row['email'] . '</option>' . "\n"; } } unset($row); echo $data_row; ?> </select> </div> <select class="form-control" name="property_list"> *insert output javascript here </select> 表示在调用具体的DbDataReader方法之前应使用IsDBNull方法。

因此,如果GetXXX列可以为空,为避免异常,您应该使用类似这样的内容

OrderDesctiption

与任何其他可空类型列类似。

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

OrderDesctiption = !oReader.IsDBNull(3) ? oReader.GetString(3) : 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