Подтвердить что ты не робот

Проблема с таблицей данных Выберите оператор

Следующая строка VB, где _DSversionInfo - это DataSet, не возвращает строки:

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

но проверка показывает, что таблица содержит строки с FileID из 92, 93, 94, 90, 88, 89, 215, 216. Столбцы таблицы представляют собой строку типа.

Дальнейшее исследование показало, что с использованием идентификатора 88, 215 и 216 будут возвращаться только строки, если это число указано.

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

Все остальные строки работают независимо от того, указано ли число или нет.

Кто-нибудь получил объяснение, почему это произойдет для некоторых чисел, но не для других? Я понимаю, что цифры следует указывать только не потому, что какая-то работа и другие нет?

Я обнаружил это в каком-то коде VB.NET, но (несмотря на мой первоначальный указатель пальца) не думаю, что это VB.NET.

4b9b3361

Ответ 1

В соответствии с документацией MSDN по созданию выражений строки всегда должны быть указаны. Неспособность сделать это создает некоторые непредсказуемые поведение, характерные для bizarro... Вы должны указать свои номера строк, чтобы получить предсказуемое и правильное поведение, как говорится в документации.

Я рассказывал о том, что вы описываете в прошлом, и вроде бы попытался понять это - вот, покройте свой любимый редактор .NET и попробуйте следующее:

Создайте DataTable и в строковый столбец "Stuff" этого DataSet вставьте строки в следующем порядке: "6", "74", "710" и "Выбрать" с помощью выражения фильтра "Stuff = 710". Вы получите 1 строку назад. Теперь измените первую строку на любое число больше 7 - внезапно, вы получите 0 строк назад.

Пока числа упорядочены в правильном порядке убывания с использованием логики строкового упорядочения (т.е. 7 приходит после 599), неучтенный запрос работает.

Я предполагаю, что это ограничение того, как выражаются выражения фильтра 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 знать, что это литерал.

Ответ 2

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

Это должно быть ошибкой в ​​рамках.

Ответ 3

this error usually comes due to invalid data table column type in which you are going to search
i got this error when i was using colConsultDate instead of Convert(colConsultDate, 'System.DateTime')
because colConsultDate was a data table column of type string which i must have to convert into System.DateTime therefor your search query should be like 

    string query = "Convert(colConsultDate, 'System.DateTime') >= #" + sdateDevFrom.ToString("MM/dd/yy") + "# AND Convert(colConsultDate, 'System.DateTime') <= #" + sdateDevTo.ToString("MM/dd/yy") + "#";
   DataRow[] dr =  yourDataTable.Select(query);
   if (dr.Length > 0)
   {
      nextDataTabel = dr.CopyToDataTable();
   }

Ответ 4

@Вал Аккапедди просто хочу добавить что-то к твоему ответу.

Если вы сделаете что-то подобное, это будет полезно, когда вам придется использовать операторы сравнения. потому что вы ставите кавычки около 74, он будет рассматриваться как строка. пожалуйста, посмотрите сами, написав код. Операторы сравнения (decimal только для справки, вы можете добавить свой нужный тип данных вместо этого.)

var results2 = table.Select("Convert(NumbersAsString , 'System.Decimal') = 74.0")