Использование символов-разделителей
Вы, возможно, заметили, что и в примере с запросом к БД, и в примере с методом DataTable, Select указан критерий для столбцов со строковыми типами данных. В каждом случае мы заключали искомое значение в одиночные кавычки. Описание этого процесса кажется весьма простым, но вполне может создать трудности программистам. Нельзя просто взять и заключить в критерии поиска строку в одиночные кавычки.
Ну, вообще-то это допустимо, но не рекомендуется. Предположим, ваше приложение позволяет искать сотрудников по фамилиям и пользователь ввел фамилию O'Malley. Если заключить в критерии поиска литеральное значение в одиночные кавычки, критерий будет выглядеть так: LastName = 'O'Malley' Тем не менее, если в искомом значении уже присутствует символ-разделитель, его необходимо продублировать. В нашем случае критерий поиска будет таким: LastName = '0''Malley1 Если вы создаете критерий поиска динамически, обязательно проверьте искомое значение на наличие символов-разделителей. В этом случае вам пригодится метод Replace класса String. Следующий фрагмент кода создает строку поиска для метода Select и с помощью метода Replace класса String заменяет каждую одиноч ную кавычку в этой строке двумя такими кавычками: Visual Basic. NET strCriteria = "LastName = '" & strLastName.
Replacef , ) & " ' Visual C#.NET strCriteria = "LastName = '" + strLastName. Replace("'", ) + ; А как указать в критерии поиска дату? Заключите ее в символы *, как показано ниже (к счастью, на символы-разделители в датах можно не обращать внимания). strCriteria = "OrderDate >= 01/01/2002 AND OrderDate< в02/01/2002йиногда требуется заключить в символы-разделитети имена столбцов, используемые в критерии поиска, — например, когда имя содержит пробел или другой символ, не относящийся к алфавитно-цифровым, или похоже на зарезервированное слово типа ыке или sum. так, если имя вашего столбца — space in name и вам требуется выбрать все записи, значение поля space in name которых равно 3, воспользуйтесь следующим критерием поиска: strcriteria = "[space in name] = 3а что. если имя столбца включает символ-разделитель? поставьте в критерии поиска перед закрывающим символом-разделителем (]) управляющий символ (\). например, если имя вашего столбца — bad]column[name и вам требуется выбрать все записи, значение поля bad]column[name которых равно 5, используйте такую строку поиска: visual basic .net strcriteria = "[bad\]column[name] = 5visual c# .net strcriteria = "[bad\\]colunin[name] = 5"; и напоследок, прежде чем перейти от символов-разделителей к следующей теме, рассмотрим фрагмент кода, который по-настоящему изящно справляется с ужасной ситуацией. объект datatable в данном фрагменте кода содержит столбец с действительно некорректным именем, принимающий строки. код выполняет поиск в этих строках, успешно заключая имя столбца и искомое значение в символыразделители. visual basic .net dim tbl as new datatableq tbl.columns.add("id", gettype(integer)) tbl.columns.add("why]would[you ever\use.thistfcolumn/name?", gettype(string)) tbl.loaddatarow(new object{) {1, "thompson"), true) tbl.loabdatarow(new object() {2, "o'halley"}, true) dim strfilter, strfieldname, strvalue as string dim row as datarow strfieldname = "why]would[you ever\use.thisftcolumn/name?strvalue = "o'malleystrfilter = "[" & strfieldname.replacec"]", "\]") & "] = '" & strvalue.replacef , } & for each row in tbl.select(strfilter) console.writeline(row(strfieldname)) next row visual c# .net datatable tbl = new datatable(); tbl.columns.add("id", typeof(int; tbl.columns.add("why]would[you ever\\use.thisftcolumn/name?' typeof(string)); tbl.loaddatarow(new object[] {1, "thompson"}, true); tbl.loaddatarow(new object[] {2, "o'malley"}, true); string strfilter, strfieldname, strvalue; strfieldname = "why]would[you ever\\use.this#column/name?"; strvalue = "o'halley"; strfilter = "[" + strfieldname.replacec"]", "\\]") + "] = ' " + strvalue.replace( ) + ; foreach (datarow row in tbl.select(strfilter)) console.writeline(row[strfieldname]);
Основы работы с Microsoft ADO.NET
Использование поставщика данных .NET
Метео


