我有一个带有此输出的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等?
由于
答案 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;