DataTable.Rows.Find() 找不到行

Posted

技术标签:

【中文标题】DataTable.Rows.Find() 找不到行【英文标题】:DataTable.Rows.Find() not finding row 【发布时间】:2011-12-06 15:21:55 【问题描述】:

我正在尝试在 DataTable 中搜索我知道存在的行。

// This is the row my search should find
DataRow goal = dtLkupCat.Rows[6];

// This finds the row correctly
string srchexpr = String.Format("sport = '0' and catcode = '1' and type = '2' and [parent] = '3' and code = '4'", goal["sport"], goal["catcode"], goal["type"], goal["parent"], goal["code"]);
DataRow[] test = dtLkupCat.Select(srchexpr);

// But if I set a PK and search for the values I know to be correct, it returns null
dtLkupCat.PrimaryKey = new DataColumn[]  dtLkupCat.Columns["sport"],
                                          dtLkupCat.Columns["catcode"],
                                          dtLkupCat.Columns["type"],
                                          dtLkupCat.Columns["parent"],
                                          dtLkupCat.Columns["code"];
DataRow lkup = dtLkupCat.Rows.Find(new object[]  goal["sport"], goal["catcode"], goal["type"], goal["parent"], goal["code"] );

它正在搜索的列/值没有什么特别之处。它们都是有效的字符串,没有一个是 null/DBNull。我在这里想念什么?显然,我可以使用 Select() 作为解决方法,但想知道 Find() 为什么不起作用。

更新:如果有人想尝试一下,我已经从我的查找表的一个子集中发布了 xml。下载地址:http://www.flantech.net/files/lkup_cat2.zip

然后尝试运行此代码。奇怪的是,它会使用四列的不同组合来查找行,但永远不会使用所有五列。

DataTable dtLkupCat = new DataTable("lkup_cat");
dtLkupCat.ReadXml(@"lkup_cat2.xml");

// This is the row my search should find
DataRow goal = dtLkupCat.Rows[0];

// This is how I need to do the search, but it doesn't find the row
dtLkupCat.PrimaryKey = new DataColumn[]  dtLkupCat.Columns["sport"],
                                          dtLkupCat.Columns["catcode"],
                                          dtLkupCat.Columns["type"],
                                          dtLkupCat.Columns["parent"],
                                          dtLkupCat.Columns["code"];
DataRow found = dtLkupCat.Rows.Find(new object[]  goal["sport"], goal["catcode"], goal["type"], goal["parent"], goal["code"] );
Debug.WriteLine((found == null ? "not " : "") + "found");

// Here I remove the "sport" column from the PK, and it finds the row
dtLkupCat.PrimaryKey = new DataColumn[]  dtLkupCat.Columns["catcode"],
                                          dtLkupCat.Columns["type"],
                                          dtLkupCat.Columns["parent"],
                                          dtLkupCat.Columns["code"];
found = dtLkupCat.Rows.Find(new object[]  goal["catcode"], goal["type"], goal["parent"], goal["code"] );
Debug.WriteLine((found == null ? "not " : "") + "found");

// Here I remove the "catcode" column from the PK, and it finds the row
dtLkupCat.PrimaryKey = new DataColumn[]  dtLkupCat.Columns["sport"],
                                          dtLkupCat.Columns["type"],
                                          dtLkupCat.Columns["parent"],
                                          dtLkupCat.Columns["code"];
found = dtLkupCat.Rows.Find(new object[]  goal["sport"], goal["type"], goal["parent"], goal["code"] );
Debug.WriteLine((found == null ? "not " : "") + "found");

// Here I remove the "type" column from the PK, and it finds the row
dtLkupCat.PrimaryKey = new DataColumn[]  dtLkupCat.Columns["sport"],
                                          dtLkupCat.Columns["catcode"],
                                          dtLkupCat.Columns["parent"],
                                          dtLkupCat.Columns["code"];
found = dtLkupCat.Rows.Find(new object[]  goal["sport"], goal["catcode"], goal["parent"], goal["code"] );
Debug.WriteLine((found == null ? "not " : "") + "found");

【问题讨论】:

我不知道答案,但我正在做一些猜测。一种可能性是列定义不明确。也许您也可以致电DataSet.FillSchema。另一种可能性可能是有 2 行具有相同的主键集。尝试检查test.Length。还要检查您的任何dtLkupCat.Columns["xyz"] 是否为null test.Length 为1,如果key列有重复或空值,设置PK时会报错。 【参考方案1】:

尝试将最后一行更改为以下内容:

             DataRow lkup = dtLkupCat.Rows.Find(new object[] 
         
            goal["sport"].ToString(),
            goal["catcode"].ToString(), 
            goal["type"].ToString(), 
            goal["parent"].ToString(), 
            goal["code"].ToString() 
        );

假设你的值都是字符串

【讨论】:

【参考方案2】:

每毫秒:

感谢您报告此问题。我们调查了这个问题,这是我们代码中的一个错误。由于修复此问题会导致重大更改,因此我们需要仔细评估何时以及如何修复此问题,以便将对我们现有客户的负面影响降至最低。我们已经有一个跟踪此问题的现有 Connect 错误 (http://connect.microsoft.com/VisualStudio/feedback/details/491319/dataset-designer-generates-invalid-datarelations)。我将把这个 bug 解决为 Connect bug #491319 的“重复”,但随着我们的进展,我们会及时通知您。 同时作为一种解决方法,您可以在设置主键之前将 PK 设置为 null,使 XML 上的约束以匹配代码上新 PK 的顺序,或者在设置 PK 并执行查找之前清理约束和关系。

https://connect.microsoft.com/VisualStudio/feedback/details/694803/datatable-rows-find-fails-to-locate-row

【讨论】:

【参考方案3】:

我遇到了同样的问题,并通过明确调整新对象的大小来解决它。 found = dtLkupCat.Rows.Find(new object[5] goal["sport"], goal["catcode"], goal["parent"], goal["code"] );

【讨论】:

以上是关于DataTable.Rows.Find() 找不到行的主要内容,如果未能解决你的问题,请参考以下文章

java为啥每次都是找不到文件。找不到文件?

java 枚举 找不到符号

bat系统找不到指定文件怎么办?

java package找不到符号

SpringBoot报找不到 dao 问题

ubuntu20.04找不到start命令