SubSonic — это очень хорошая платформа доступа к данным, которая объединяет генерацию кода и поставщик сборки (новая функция asp.net 2.0). Он создан на основе ActionPack в ROR. Он очень подходит для быстрой разработки небольших веб-сайтов.
Вчера я начал использовать эту структуру и обнаружил небольшую проблему.
У меня есть поле с именем Key, и SQL сообщает об ошибке при создании запроса для оператора Select. Поскольку Key является ключевым словом, оно не экранируется в SQL-коде, генерируемом SubSonic.
SQL-код, сгенерированный при отладке, можно получить следующим образом:
SELECT TOP 100 PERCENT [cfg_Tips].[Id], [cfg_Tips].[Key], [cfg_Tips].[Descr], [cfg_Tips].[Значение], [cfg_Tips] . [Ярлыки] ИЗ [cfg_Tips] ГДЕ [cfg_Tips].Key = @Key ORDER BY [Id];
Я изменил метод BuildWhere в SqlDataProvider.cs в исходном коде, чтобы временно решить эту проблему.
защищенная статическая строка BuildWhere (Query qry)
{
строка где = "";
строкаwhereOperator = "ГДЕ
foreach" (Где wWhere в qry.wheres)
{
если (wWhere.ParameterValue != DBNull.Value)
{
где +=whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " +
Где.GetComparisonOperator(wWhere.Comparison) + " @" + wWhere.ParameterName;
}
еще
{
где +=whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " + Comparison.Is +
"НУЛЕВОЙ";
}
гдеОператор = «И»;
}
foreach (МеждуИ между в qry.betweens)
{
где +=whereOperator + "[" + между.TableName + "].[" + между.ColumnName + "] МЕЖДУ @start" +
между.ИмяСтолбца + " И @end" + между.ИмяСтолбца;
гдеОператор = «И»;
}
for (int i = qry.wheres.Count - 1; i >= 0; i--)
{
if (qry.wheres[i].ParameterValue == DBNull.Value)
{
qry.wheres.RemoveAt(i);
}
}
вернуться куда;
}
Части, которые я добавил, отмечены зеленым в приведенном выше коде.
Странно, что автор добавил квадратные скобки к имени таблицы, а не к имени столбца, что явно не строго.
В этой библиотеке также есть такие классы, как MySqlDataProvider, которые также имеют эту проблему. Поскольку я пока не использую MySQL, я пока не буду их менять.
Другой опыт заключается в том, что при использовании сторонних библиотек с открытым исходным кодом попробуйте добавить их в проект в исходном коде. В противном случае отладка будет невозможна, если что-то пойдет не так.
Теперь я использую эту платформу, используя созданную ею веб-страницу классов GenerateAllClasses.aspx для генерации кода, а затем сам ссылаюсь на нее. Хотя это немного более хлопотно, чем прямая генерация по умолчанию, а затем компиляция и запуск в памяти, все же ради удобства отладки оно того стоит.
опубликовано 22 января 2007 г. 00:28 Kinoho Чтение (62) Комментарии (4) Редактировать коллекцию Цитата Сетевая выдержка Категория: .NET
Комментарий
# re: Исправлена проблема с неэкранированным именем поля SubSonic 22 января 2007 г., 00:47 TerryLee
SubSonic неплох, он известен как уровень доступа к данным с нулевым кодом :) Ответить больше комментариев
# re: Имя поля SubSonic, неэкранированное исправление проблемы 2007-01-22 00:49 Kinohu
@ТерриЛи
Хаха, да. Однако я не смею использовать его автоматический режим, ведь я чувствую, что у меня меньше контроля. Причина описана в этом посте.
Ответить Больше комментариев
# re: Исправление неэкранированной проблемы с именем поля SubSonic 22 января 2007 г. 00:53 TerryLee
@木野湖 Ну да,
я использовал его только для написания небольшого демо :) Ответить Больше комментариев
# re: Имя поля SubSonic, неэкранированное исправление проблемы 2007-01-22 01:02 木野湖 чувствует эту вещь при использовании его отдельно Документация: все еще редкий. Приведенный пример также очень прост. Немного более полезное использование зависит от моих собственных исследований.
Например это:
Чтобы загрузить объект на основе условий, в документе (pdf) упоминается, что вы можете использовать
object.Load(...) для загрузки, а параметрами могут быть IDataReader, DataRow, DataTable.
Я использовал IDataReader для его передачи и. мне потребовалось много времени, чтобы сделать это, это ошибка. Наконец, после отладки исходного кода платформы я обнаружил, что для успеха мне нужно прочитать его один раз, прежде чем передавать IDataReader. Например, он используется в этом простом примере, который я написал:
/// <summary>
/// Получить ответственного за отдел, в котором находится ответственное лицо
/// </сводка>
/// <param name="staff"></param>
/// <возвращается></возвращается>
public static Staff GetManager (Сотрудник персонала) {
SubSonic.Query qry = новый SubSonic.Query(Staff.Schema.Name);
qry.AddWhere(Staff.Columns.IsFunctionary, true);
qry.AddWhere(Staff.Columns.OfficeId, Staff.OfficeId
Менеджер персонала = новый персонал());
Читатель IDataReader = qry.ExecuteReader();
если (читатель.Читать())
{
менеджер.Загрузка(читатель);
}
менеджер по возврату;
}
http://www.cnblogs.com/RChen/archive/2007/01/22/actionpack1.html