数据表的问题选择语句

Nei*_*eil 12 c# vb.net datatable select

以下VB行,其中_DSversionInfo是DataSet,不返回任何行:

_DSversionInfo.Tables("VersionInfo").Select("FileID=88")
Run Code Online (Sandbox Code Playgroud)

但检查显示该表包含FileID为92,93,94,90,88,89,215,216的行.表列都是字符串类型.

进一步调查显示,如果引用该数字,使用ID为88,215和216将仅返回行.

_DSversionInfo.Tables("VersionInfo").Select("FileID='88'")

无论数字是否被引用,所有其他行都可以工作.

任何人都得到了解释为什么这会发生在一些数字而不是其他数字?我明白应该引用这些数字而不是为什么有些工作和其他工作没有?

我在一些VB.NET代码中发现了这一点但是(尽管我最初的指责)并不认为它是VB.NET特有的.

Val*_*ddi 20

根据有关构建表达式MSDN文档,应始终引用字符串.如果不这样做会产生一些奇怪的不可预测的行为......你应该引用你的数字字符串来获得可预测和正确的行为,就像文档说的那样.

我已经描述了你过去所描述的内容,并且有点试图解决它 - 在这里,弹出你最喜欢的.NET编辑器并尝试以下方法:

创建一个DataTable,并在该DataSet的字符串列'Stuff'中,按以下顺序插入行:"6","74","710",并选择过滤器表达式"Stuff = 710".你将获得1排.现在,将第一行更改为大于7的任何数字 - 突然,您将获得0行.

只要使用字符串排序逻辑以正确的降序排序数字(即,在599之后出现7),未加引号的查询似乎起作用.

我的猜测是,这是对DataSet过滤器表达式的解析方式的限制,并不意味着以这种方式工作......

代码:

            // Unquoted filter string bizzareness.
            var table = new DataTable();

            table.Columns.Add(new DataColumn("NumbersAsString", typeof(String)));

            var row1 = table.NewRow(); row1["NumbersAsString"] = "9"; table.Rows.Add(row1); // Change to '66
            var row2 = table.NewRow(); row2["NumbersAsString"] = "74"; table.Rows.Add(row2);
            var row4 = table.NewRow(); row4["NumbersAsString"] = "90"; table.Rows.Add(row4);
            var row3 = table.NewRow(); row3["NumbersAsString"] = "710"; table.Rows.Add(row3);

            var results = table.Select("NumbersAsString = 710"); // Returns 0 rows.
            var results2 = table.Select("NumbersAsString = 74"); // Throws exception "Min (1) must be less than or equal to max (-1) in a Range object." at System.Data.Select.GetBinaryFilteredRecords()

结论:基于最后一种情况下的异常文本,似乎在过滤器表达式中会出现一些不能保证安全的恶意转换.通过让.NET知道这是一个文字,明确地在您查询的值周围放置单引号可以避免这个问题.


Pra*_*enu 8

DataTable在列上构建索引以快速进行Select()查询.该索引按值排序,然后使用二进制搜索来选择与查询表达式匹配的记录范围.

因此记录将按照215,216,88,89,90,92,93,94进行排序.完成二进制搜索将它们视为整数(根据我们的过滤器表达式)无法定位某些记录,因为它只能搜索正确排序的集合.

它将数据索引为字符串,将二进制搜索搜索编号为数字.请参阅以下说明.

        string[] strArr = new string[] { "115", "118", "66", "77", "80", "81", "82" };
        int[] intArr = new int[] { 215, 216, 88, 89, 90, 92, 93, 94 };
        int i88 = Array.BinarySearch(intArr, 88); //returns -ve index
        int i89 = Array.BinarySearch(intArr, 89); //returns +ve index
Run Code Online (Sandbox Code Playgroud)

这应该是框架中的错误.