Существует ли стандартный подход к генерации sql динамично?

Я могу добавить два совета, если кто-то еще не сможет это сделать. В файле Manifest.xml убедитесь, что активность хостинга не завершилась при обратном вызове, и для запуска активности в качестве стандартного режима запуска. См. Подробности, как показано ниже:

Для активности хостинга установите свойство no history как false, если у вас есть

android:noHistory="false"

. Для запуска операции установите режим запуска в качестве стандарта, если у вас

android:launchMode="standard"
12
задан MarredCheese 30 May 2019 в 00:38
поделиться

8 ответов

У меня была потребность сделать это на одном из моих недавних проектов. Вот схема, которую я использую для генерации SQL:

  • Каждый компонент запроса представлен Объектом (который в моем случае является Linq-to-Sql объектом, который отображается на таблицу в DB). Таким образом, у меня есть следующие классы: Запрос, SelectColumn, Соединение, WhereCondition, Вид, GroupBy. Каждый из этих классов содержит все детали, касающиеся того компонента запроса.
  • Последние пять классов все связаны с объектом Запроса. Таким образом, сам объект Запроса имеет наборы каждого класса.
  • Каждый класс имеет метод, который может генерировать SQL для части запроса, который это представляет. Так создание полного запроса заканчивает тем, что назвало Запрос. GenerateQuery (), который в свою очередь перечисляет через все поднаборы и называет их соответствующий GenerateQuery () методами

Это все еще немного сложно, но в конце Вы знаете, где поколение SQL для каждой отдельной части запроса происходит (и я не думаю, что существуют любые большие операторы переключения). И не забывайте использовать StringBuilder.

2
ответ дан 2 December 2019 в 22:52
поделиться

Вы могли попробовать подход, используемый инструментами генерации кода как CodeSmith. Создайте шаблон SQL с заполнителями. Во времени выполнения считайте шаблон в строку и замените заполнителями с фактическими значениями. Это только полезно, если весь код SQL следует за шаблоном.

1
ответ дан 2 December 2019 в 22:52
поделиться

Мы создали наш собственный объект FilterCriteria, который является своего рода черным ящиком динамический конструктор запросов. Это имеет свойства набора для SelectClause, WhereClause, GroupByClause и OrderByClause. Это также содержит свойства для CommandText, CommandType и MaximumRecords.

Мы затем выступаем, передают наш объект FilterCriteria нашей логике данных, и это выполняет его против сервера базы данных и передает значения параметров хранимой процедуре, которая выполняет динамический код.

Работы хорошо для нас... и сохраняют поколение SQL приятно содержавшимся в объекте.

2
ответ дан 2 December 2019 в 22:52
поделиться

Из любопытства имейте Вас, рассмотрел использование ORM для управления Вашим доступом к данным. Большая функциональность, которую Вы пытаетесь реализовать, могла уже быть там. Это может быть что-то для взгляда на потому что его лучшее для не изобретения велосипед.

0
ответ дан 2 December 2019 в 22:52
поделиться

Обычно это - что-то вроде этого:

string query= "SELECT {0} FROM .... WHERE {1}"
StringBuilder selectclause = new StringBuilder();
StringBuilder wherecaluse = new StringBuilder();

// .... the logic here will vary greatly depending on what your system looks like

MySqlcommand.CommandText = String.Format(query, selectclause.ToString(), whereclause.ToString());

Я также просто начинаю с ORMs. Вы могли бы хотеть смотреть на одного из тех. ActiveRecord / В спящем режиме, некоторые хорошие ключевые слова к Google.

1
ответ дан 2 December 2019 в 22:52
поделиться

Gulzar и Ryan Lanciaux делают правильные замечания в упоминании CodeSmith и ORM. Или тех мог бы уменьшить или устранить Вашу текущую нагрузку когда дело доходит до генерации динамического SQL. Ваш текущий подход использования параметризованного SQL мудр, просто потому что это защищает хорошо от атак с использованием кода на SQL.

Без фактического примера кода для комментария трудно обеспечить информированную альтернативу циклам и операторам переключения, которые Вы в настоящее время используете. Но так как Вы упоминаете установку свойства CommandText я рекомендовал бы использование строки. Формат в Вашей реализации (если Вы уже не используете его). Я думаю, что это может сделать Ваш код легче реструктурировать, и поэтому улучшить удобочитаемость и понимание.

1
ответ дан 2 December 2019 в 22:52
поделиться

Если действительно необходимо сделать это из кода, то ORM является, вероятно, способом пойти, чтобы попытаться содержать его в чистоте.

Но я хотел бы предложить альтернативу, которая работает хорошо и могла избежать проблем производительности, которые сопровождают динамические запросы, из-за изменения SQL, который требует, чтобы новые планы запросов были созданы с различными требованиями к индексам.

Создайте хранимую процедуру, которая принимает все возможные параметры, и затем используйте что-то вроде этого в где пункт:

where...
and (@MyParam5 is null or @MyParam5 = Col5)

затем, из кода, намного более просто установить значение параметра на DBNull. Значение, когда это не применимо, вместо того, чтобы менять струну SQL, Вы генерируете.

Ваш DBAs будет намного более доволен Вами, потому что у них будет одно место для движения для оптимизации запросов, SQL будет легко считать, и они не должны будут рыть через трассировки профилировщика для нахождения многих различных запросов, сгенерированных кодом.

1
ответ дан 2 December 2019 в 22:52
поделиться

ORMs уже решили проблему динамического поколения SQL (я предпочитаю NHibernate/ActiveRecord). Используя эти инструменты можно создать запрос с неизвестным количеством условий цикличным выполнением через ввод данных пользователем и генерацией массива объектов Выражения. Затем выполните встроенные методы запроса, с которыми пользовательское выражение установило.

List<Expression> expressions = new List<Expression>(userConditions.Count);
foreach(Condition c in userConditions)
{
    expressions.Add(Expression.Eq(c.Field, c.Value));
}
SomeTable[] records = SomeTable.Find(expressions);

Существует больше опций 'Expression': неравенство, больше/меньшее количество, чем, null/not-null, и т.д. Тип 'Условия', который я просто составил, можно, вероятно, наполнить ввод данных пользователем в полезный класс.

0
ответ дан 2 December 2019 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: