【问题标题】:Index Out of Range Exception (No Row at Position 0)索引超出范围异常(位置 0 无行)
【发布时间】:2014-02-12 13:11:17
【问题描述】:

我正在尝试从视图模型将存储过程调用到 ActionResult 中。

当我尝试运行我的代码时出现错误

IndexOutOfRangeException 由用户代码处理 - 位置 0 无行

这是一个新创建的表并且是空的,但是为什么不触发存储过程来插入数据?这是我的代码。

调用过程 CreateSecureRequestOutcome

 public static void CreateSecureRequestOutcome(
 OracleTransaction trans,
 dsAdmin.SECURE_REQUEST_OUTCOMESRow outcomeRow)
  {
   using (OracleCommand cm = new OracleCommand())
  {
   cm.Connection = trans.Connection;
   cm.Transaction = trans;
   cm.CommandText = "TheService.PKG#SECURE_REQUEST.SECURE_REQUEST_OUTCOME";
   cm.CommandType = CommandType.StoredProcedure;
   cm.AddToStatementCache = true;

 OracleParameter param = cm.Paramaters.Add("P_KEEP_PERSON_ID", OracleDBType.Decimal, Paremeter.Direction.Input);
 param.Value = keepPersonID;

 param = cm.Paramaters.Add("P_SECURE_REQUEST_GUID", OracleDBType.Raw, 16, null, Paremeter.Direction.Input);
 param.Value = outcomeRow.SECURE_REQUEST_GUID;

 param = cm.Parameters.Add("P_OUTCOME_TIMESTAMP", OracleDBType.Object, Paremeter.Direction.Output);
  }
}
 cm.ExecuteNonQuery();

IdentityConfirmed ViewModel 控制器

[httpPost]
public ActionResult IdentityConfirmed(FormCollection collection)
{
 dsAdmin.SECURE_REQUESTS_OUTCOMESRow secReqOutRow;

using (OracleConnection cn = new OracleConnection (OracleConnectionManager.GetProxyServiceConnetionString()))
{
    cn.Open();
    using (OracleTransaction trans = cn.BeginTransaction())
    {
          using (Data.dsAdminTableAdapters.SECURE_REQUESTS_OUTCOMESTableAdapter taOut = new Data.dsAdminTableAdapters.SECURE_REQUESTS_OUTCOMESTableAdapter();
          {
             typedDatasetFiller.ApplyConnection(taOut, cn);
             secReqOutRow = taOut.GetDataBySecureGUID(request.ToByteArray())[0];
          }
            secReqOutRow.OUTCOME_TIMESTAMP = DateTime.Now.AddMonths(1);
            Support.CreateSecureRequestOutcome(trans, secReqOutRow);
            trans.Commit();
      }
    cn.Close();
  }
 retrun View("IdentityConfirmed", vm);
}

【问题讨论】:

  • 您是否曾经在 Google 中搜索过您的异常消息?您在哪一行收到此错误?
  • 这里出现错误 secReqOutRow = taOut.GetDataBySecureGUID(request.ToByteArray())[0];
  • 您应该先检查secReqOutRow 是否包含数据,然后再放入索引器。
  • 您的 using 语句缺少右大括号并且分号错误。可能只是一个错字?
  • @Abbas,另一种方式是正确的 - 在将任何内容分配给 secReqOutRow 之前,他应该在将索引器放入之前验证 GetDataBySecureGUID 是否包含数据。

标签: c# asp.net-mvc stored-procedures model-view-controller exception-handling


【解决方案1】:

嗯,你认为这个错误是什么意思?为什么不正确调试?

简而言之,GetDataBySecureGUID 返回一个空数组,因此访问索引 0 无效。


请按如下方式更改您的代码:

var results = taOut.GetDataBySecureGUID(request.ToByteArray());           
secReqOutRow = results[0];

现在在第二行设置一个断点并检查results 的值。有多少个元素?

我敢打赌没有,因为这正是异常的含义。您正在尝试使用大于最大允许索引的索引访问集合中的元素。您尝试访问第一个元素并收到此错误的事实意味着没有第一个元素,因此集合中根本没有元素。

【讨论】:

  • 实际上我在那一行上放了一个断点,它返回一个字节数的值。 xx00xxxxx-x0xx-xxxx-0120-xxxx-xxxxx2xx0xxx,数字/字母。所以有价值
  • request.ToByteArray() 可能包含一个值,但GetDataBySecureGUID 返回一个空数组/列表。我建议你调试一下我要写的内容,然后告诉我有数据。
  • 你的权利是0,我对C#很陌生,我如何获取数据?
  • 这是一个新问题。至此,错误已经解释完毕,您应该将答案标记为已接受。
猜你喜欢
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2018-03-02
  • 2011-12-25
相关资源
最近更新 更多