создать sql-запрос на c ++ / java?
Вопрос
какой метод вы предпочитаете для создания динамических 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 << ")";
Не нужно беспокоиться о типах параметров и длине строки - это здорово!