尝试保存存储过程中的结果时出现System.IndexOutOfRangeException

时间:2017-09-27 18:10:40

标签: sql sql-server asp.net-mvc

我有一个带有此输出的SQL Server存储过程:

unit_id     on_date             notes   type_code   type_order  status  (No column name)    (No column name)
3       2016-12-08 00:00:00.000             AVL             -1      D   NULL                 16
3       2016-12-08 00:00:00.000             RSU             1       D   3                     2
3       2016-12-08 00:00:00.000             TOW             2       D   6                     5
.......etc       

我想要做的是将这些行添加到列中,我可以在网格(类似电子表格)视图中显示它们,并将它们用作条形图中的变量。

我已经尝试过代码(在我的控制器中)

var model = new List<ResultsModel>();

SqlCommand command3 = new SqlCommand("dbo.pr_name");

command3.Parameters.Add(new SqlParameter { ParameterName = "@from", SqlDbType = System.Data.SqlDbType.DateTime, Value = NowDate });
command3.Parameters.Add(new SqlParameter { ParameterName = "@to", SqlDbType = System.Data.SqlDbType.DateTime, Value = "2017-09-21 00:00:00" });
command3.Parameters.Add(new SqlParameter { ParameterName = "@method", SqlDbType = System.Data.SqlDbType.Int, Value = 3 });
command3.CommandType = System.Data.CommandType.StoredProcedure;

using (var SPOutput3 = command.ExecuteReader())
{
    model.Add(new ResultsModel()
                {
                    unit_id = (Int32)SPOutput3["unit_id"],
                    on_date = (DateTimeOffset)SPOutput3["on_date"],
                    notes = SPOutput3["notes"].ToString(),
                    type_code = (string)SPOutput3["type_code"]
                    // other properties
                });
    return View(model);
}

在我看来

@*@foreach (var item in Model)
{
    <tr>
        <td>@item.on_date</td>
        <td>@item.type_code</td>
    </tr>
}*@

代码在行中断:

unit_id = (Int32)SPOutput3["unit_id"],

错误System.IndexOutOfRangeException

如果我注释掉那一行,则错误会移到下一行等。

建议是在:是错误告诉我收到的输出中没有名为unit_id的列?甚至认为SSMS的输出显示出来了? ..我能做些什么来解决这个问题?

另外....如果列没有名称,我该怎么指定它...像unit_id,on_date等?

由于

1 个答案:

答案 0 :(得分:2)

好吧,首先,您需要在while循环中调用Read

using (var SPOutput3 = command.ExecuteReader())
{
    while (SPOutput3.Read())
    {
        ...
    }
}

然后,在while循环中,你正在处理一个单独的行。所以你可以这样做:

while (SPOutput3.Read())
{
    var unit_id = SPOutput3["unit_id"] as int?;
}

您希望在此处使用as而非直接投射,以便在返回错误数据或类型不是您认为的类型时,可以避免潜在问题。如果需要非可空值,则只需使用null coalesce运算符即可提供默认值:

SPOutput3["unit_id"] as int? ?? 0;