索引超出范围异常(位置0处没有行)

时间:2014-02-12 13:11:17

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

我想从视图模型中将存储过程调用到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);
}

1 个答案:

答案 0 :(得分:1)

那么,你认为错误意味着什么呢?为什么不正确调试?

为简短起见,GetDataBySecureGUID返回一个空数组,因此访问索引0无效。


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

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

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

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