создать SQL-запрос в C ++ / Java? - PullRequest
6 голосов
/ 05 января 2009

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

EDIT: Пожалуйста, ответьте в случае c ++.

Ответы [ 4 ]

6 голосов
/ 05 января 2009

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

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

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

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

Хуже то, как работают атаки "sql инъекция". Если в качестве данных введена строка типа «x» из cust_table; delete from cust_table; select », это может привести к тому, что оператор delete будет проанализирован и выполнен.

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

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

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

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

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

4 голосов
/ 05 января 2009

В Java вы должны использовать PreparedStatement .

PreparedStatement statement = connection.prepareStatement("SELECT * FROM Table WHERE ID = ?");
statement.setInt(1, 17);
ResultSet resultSet = statement.executeQuery();
1 голос
/ 13 января 2009

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

1 голос
/ 07 января 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...