DataTable Select() с идентификаторами Guid
Вопрос
Я пытаюсь создать свой treeview во время выполнения из DataTable, который возвращается из запроса LINQ.Возвращаемые поля следующие:
ИМЯ = Идентификатор дела | Дата контакта | Родительская заметка ТИП = Guid | Дата-время | Guid
Поле ParentNote соответствует записи в столбце CaseNoteID.Выбор (фильтр) выдает мне ошибку времени выполнения Не удается найти столбец [ea8428e4]. Этот буквенно-цифровой символ является первым разделом одного из идентификаторов Guid.Когда я прохожу через свой кодовый фильтр = "ParentNote=ea8428e4-1274-42e8-a31c-f57dc2f189a4"
Что я упускаю из виду?
var tmpCNoteID = dr["CaseNoteID"].ToString();
var filter = "ParentNote="+tmpCNoteID;
DataRow[] childRows = cNoteDT.Select(filter);
Решение
Попробуйте заключить GUID в одинарные кавычки:
var filter = "ParentNote='"+tmpCNoteID+"'";
Другие советы
это должно работать:
var tmpCNoteID = dr["CaseNoteID"].ToString();
var filter = "ParentNote=\""+tmpCNoteID+"\"";
DataRow[] childRows = cNoteDT.Select(filter);
Я знаю, что это старая тема, но я хотел добавить к ней дополнение.При использовании оператора IN с идентификатором Guid (например:Родительское примечание В ( , , и т.д.) ) тогда одинарные кавычки больше не принимаются.В этом случае необходим метод CONVERT (предложенный granadaCoder).(Одинарные кавычки вызывают исключение при сравнении Guid со строкой с помощью оператора '='...который мы на самом деле не используем.)
Подробные сведения: Я унаследовал некоторый устаревший код, который создал большую строку фильтра в формате: MyColumn = '11111111-2222-3333-4444-555555555555' OR MyColumn = '11111111-2222-3333-4444-555555555555' ....
Когда количество идентификаторов guid (и, следовательно, количество предложений OR) становилось слишком большим, это вызывало исключение переполнения стека.Заменив многочисленные предложения OR предложением IN, я смог установить фильтр без исключения.Но использование предложения IN означает необходимость использования подхода CONVERT.
Вот один метод, который я использую:
MyStrongDataSet ds = new MyStrongDataSet();
Guid myUuid = new Guid("11111111-2222-3333-4444-555555555555");
System.Data.DataRow[] rows = ds.MyStrongTable.Select("MyGuidProperty = (CONVERT('" + myUuid.ToString("N") + "', 'System.Guid'))");
//Fish out a single row if need be and cast to a strong row
if (null != rows)
{
if (rows.Length > 0)
{
MyStrongDataSet.MyStrongTableRow returnRow = rows[0] as MyStrongDataSet.MyStrongTableRow;
return returnRow;
}
}
return null;
Вот небольшое изменение:
string filterSql = "MyGuidProperty ='{0}'";
filterSql = string.Format(filterSql, Guid.NewGuid().ToString("D"));