2012-07-23 84 views
1

这行:DataTable中选择返回数组索引越界

searchParamsTable.Select(string.Format("TABLE = {0} AND FIELD = '{1}'", tableNumbers[i], fieldName[i]))[0]["VALUE"] = wildcardedSearchString; 

在C#中返回一个数组索引越界异常。我怎么写这个不会抛出错误?或者,如果没有记录被返回以继续执行代码,我是否可以使用另一种方法编写此代码?我用三个不同的表格搜索结果,使用'i'作为表格和字段名称的增量。

回答

3

这是不完整的,我们应该怎么知道tableNumbers,fieldNamewildcardedSearchString是什么?该异常可能会引发tableNumbers [i],fieldName [i]或select的[0]索引器。

我假设select不返回行,所以[0]会抛出IndexOutOfBounds异常。

你可以使用施特费斯方法或使用LINQ到数据集是更具可读性和强大:

IEnumerable<DataRow> rows = searchParamsTable.AsEnumerable() 
         .Where(r => r.Field<String>("TABLE") == tableNumbers[i] 
           && r.Field<String>("FIELD ") == fieldName[i]); 
if(rows.Any()) 
{ 
    // do something with the rows, for example create a new DataTable from the result: 
    DataTable tblSearch = rows.CopyToDataTable(); 
} 
+2

真的,我需要一个关于Linq的速成课程! - = – Steve 2012-07-23 20:38:30

2

假如你i指数变种是正确的,那么你应该检查是否有任何行SELECT语句

DataRow[] rows = searchParamsTable.Select(string.Format("TABLE = {0} AND FIELD = '{1}'", 
       tableNumbers[i], fieldName[i])); 

if(rows.Length > 0) 
    rows[0]["VALUE"] = wildcardedSearchString; 
+0

感谢史蒂夫,现在正试图这样。 – CodeMan5000 2012-07-23 20:33:59

1

你是做了相当多的数组索引在该语句返回,那么到底是哪一个是出界很难说。你确定i是tableNumbers和fieldName的有效索引吗?

尝试将声明分解成单独的行,然后使用调试器查明。

+0

是的,我是有效的。这似乎是无效的这一块:[0] [“VALUE”] – CodeMan5000 2012-07-23 20:33:29

+1

那么我想你没有从数据库中得到任何行;因此你不会有第0行。当你没有结果时,你需要处理这个案例。 – driis 2012-07-23 20:35:18