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

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

问题描述:

我打算从视图模型调用存储过程到ActionResult中。索引超出范围异常(在位置0处没有行)

当我试图运行我的代码我得到一个错误

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视图模型控制器

[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); 
} 
+0

你有没有在Google搜索你的例外讯息?在哪一行你会得到这个错误? –

+0

我在这里得到错误secReqOutRow = taOut.GetDataBySecureGUID(request.ToByteArray())[0]; – Gee

+0

在将索引器添加到索引器之前,您应该首先检查'secReqOutRow'是否包含数据。 – Abbas

嗯,你觉得错误意味着什么?你为什么不正确调试?

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


请改变你的代码如下:

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

现在设置一个断点到第二行和检查的results值。那里有几个元素?

我敢打赌,没有,因为这正是例外的意思。您正尝试使用大于最大允许索引的索引访问集合中的元素。事实上,你试图访问第一个元素并得到这个错误意味着没有第一个元素,所以在集合中根本没有任何元素。

+0

其实我在这一行放了一个中断,它返回一个字节数值。 xx00xxxxx-x0xx-xxxx-0120-xxxx-xxxxx2xx0xxx,数字/字母。所以有值 – Gee

+0

'request.ToByteArray()'可能包含一个值,但是'GetDataBySecureGUID'返回一个空的数组/列表。我建议你在一秒钟内调试我要写入我的答案的内容,然后告诉我有数据。 –

+0

你的权利是0,我对C#如此陌生,我如何获取数据? – Gee