C# 索引超出范围异常(位置0处无行)
我尝试从视图模型调用一个存储过程到ActionResult中 当我试图运行我的代码时,我得到了一个错误 IndexOutOfRangeException由用户代码处理-位置0处无行 这是一个新创建的表,是空的,但是为什么不触发存储过程来插入数据呢?这是我的密码 调用过程CreateSecureRequestOutputC# 索引超出范围异常(位置0处无行),c#,asp.net-mvc,stored-procedures,model-view-controller,exception-handling,C#,Asp.net Mvc,Stored Procedures,Model View Controller,Exception Handling,我尝试从视图模型调用一个存储过程到ActionResult中 当我试图运行我的代码时,我得到了一个错误 IndexOutOfRangeException由用户代码处理-位置0处无行 这是一个新创建的表,是空的,但是为什么不触发存储过程来插入数据呢?这是我的密码 调用过程CreateSecureRequestOutput public static void CreateSecureRequestOutcome( OracleTransaction trans, dsAdmin.SECURE
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();
标识已确认的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);
}
你认为这个错误是什么意思?为什么不正确调试
简而言之,getDatabaseCureGuid
返回一个空数组,因此访问索引0无效
请按以下方式更改您的代码:
var results = taOut.GetDataBySecureGUID(request.ToByteArray());
secReqOutRow = results[0];
现在在第二行设置一个断点,并检查结果的值。有多少元素
我打赌没有,因为这正是例外的意思。您试图使用大于允许的最大索引的索引访问集合中的元素。您试图访问第一个元素并获取此错误意味着没有第一个元素,因此集合中根本没有元素。您是否在Google中搜索过您的异常消息?您在哪一行得到此错误?我在这里得到错误secReqOutRow=taOut.getDatabaseCureGuid(request.ToByteArray())[0];您应该首先检查secReqOutRow
是否包含数据,然后再将索引器放入其中。您使用的语句缺少右大括号,并且分号错误。可能只是一个输入错误?@Abbas,另一种方法是正确的-在将任何内容分配给secReqOutRow
之前,他应该先验证getDatabaseCureGuid
是否包含数据,然后再将索引器放入其中。实际上,我在该行上加了一个分隔符,它返回的是一个字节数值。XXXX00XXXXX-x0xx-xxxx-0120-xxxx-XXXXX 2xX0xXX,数字/字母。因此有一个值request.ToByteArray()
可能包含一个值,但GetDatabaseCureGuid
返回一个空数组/列表。我建议你在一秒钟内调试我要写在答案中的内容,然后告诉我有数据。你的权利是0,我对C#是如此陌生,我如何获得数据?这是一个新问题的素材。到目前为止,已经解释了错误,您应该将答案标记为已接受。