Вопрос

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

Редактировать:Пожалуйста, ответьте в случае с c ++.

Это было полезно?

Решение 3

Есть какая- то вещь, называемая SOCI - Библиотека доступа к базе данных C ++ для C++

Другие советы

Всегда используйте "prepare", будет эквивалент prepareStatement, но точное имя функции будет зависеть от вашей базы данных и комбинации драйверов.

Преимуществ подготовленного оператора перед execute (строкой) много:-

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

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

Хуже всего то, как работают атаки "sql-инъекции".Если строка что-то вроде "x' из cust_table;удалить из cust_table;выберите " вводится как данные, это вполне может привести к тому, что инструкция delete будет проанализирована и выполнена.

Обработка чисел намного эффективнее.Вызов SetInt принимает целочисленное значение, как и для эквивалентной строки SQL, которую вы должны преобразовать в символы, затем СУБД должна преобразовать ее обратно в целое число.

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

Однако есть пара случаев, когда execute (Строка) на самом деле лучше.

Где ваши ключи распределены очень неравномерно.Например,G.Если 95% ваших клиентов живут в США, и вы хотите указать 4%, которые живут в Канаде, тогда "where country = ?" обычно это приводит к сканированию табличного пространства, в то время как с "where country = 'CA'" у вас есть некоторый шанс использовать индекс.

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

В Java вы должны использовать Подготовленное утверждение.

PreparedStatement statement = connection.prepareStatement("SELECT * FROM Table WHERE ID = ?");
statement.setInt(1, 17);
ResultSet resultSet = statement.executeQuery();

При использовании подготовленных инструкций это невозможно, Я нахожу , что использование потоков C ++ - лучший способ написать запрос:

std::ostringstream sql;
sql << "exec loadStuff(" << param1 << ", " << param2 << ")";

Не нужно беспокоиться о типах параметров и длине строки - это здорово!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top