Это хороший способ использовать system () для сценариев базы данных из C? - PullRequest
6 голосов
/ 11 августа 2009

Я искал соединение с базой данных из программы на Си. Но я думал, что соединения ODBC, вход в систему и все нуждаются в некоторых библиотеках. Также у меня есть минимальный компилятор, такой как Tiny C Compiler, который очень быстрый. Я не хочу использовать какую-либо логику ODBC и т. Д., Которая необходима для подключения и запроса к базе данных.

Поэтому я использую метод, который заключается в следующем.

Я использую скрипт bteq (teradata), который будет содержать команды login, query, logoff. (FYI bteq - это утилита базы данных командной строки. Вы можете использовать ее подобно mysql.exe в командной строке, перейдя по пути к файлу exe. Вы можете заменить bteq на mysql.exe и т. Д.). И я использую

system("bteq <myscript.txt >out.txt");

myscript.txt будет выглядеть следующим образом.

.logon boxname/user,password;
select date;
.logoff;

Приведенный выше сценарий войдет в базу данных и дату запроса (вы можете изменить запрос и написать сценарий в соответствии с вашим механизмом базы данных и вашими потребностями) и вывести результат в out.txt.

Теперь я проанализирую файл out.txt для столбца строки X, который я хочу, используя fgetc, fscanf или fgets. И использовать данные для проверки и отправки почты с помощью PHP на любой сервер

system("c:/server/php/php.exe sendmail.php");.

Мы можем сделать то же самое для многих механизмов баз данных, таких как mysql и т. Д., С помощью простой программы на Си.

Теперь мой вопрос: есть ли недостаток в вышеуказанном методе? Если это так, то как я могу преодолеть это? Я задаю этот вопрос, потому что считаю этот метод нетрадиционным. Пожалуйста, выскажите свое мнение об этом методе. Я не беспокоюсь о времени, необходимом для выполнения, используемой оперативной памяти, проблемах с производительностью и т. Д. Я знаю, что функция system () отнимает много времени, что в любом случае меня не касается. Я также разработал специальные функции для доступа к результатам запроса (аналогично доступу к плоскому файлу). Скажите, пожалуйста, есть ли у вас какие-либо улучшения в этом методе. Если вы обнаружите какие-либо недостатки в этом, пожалуйста, дайте мне знать. Все виды предложений приветствуются.

Моя среда: teradata bteq в Windows с Tiny C Compiler

Ответы [ 3 ]

3 голосов
/ 11 августа 2009

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

1 голос
/ 12 августа 2009

Метод в порядке: здорово отделить подсистему db и подсистему парсера, реализовав их на соответствующем языке.

Есть только одна маленькая мелочь - но я могу ошибаться, потому что я не знаком с bteq: программе потребуется скрипт bteq, установленный в папке исполнения; этот скрипт будет содержать имя пользователя и пароль. Если они не прописаны каким-либо образом, это может быть недостатком безопасности.

1 голос
/ 11 августа 2009

Я бы не рекомендовал это, если ваш вызывающий код работает с setuid или setgid, но в этом случае вы могли бы использовать вместо этого одну из функций exec(). (Есть несколько других соображений, которые вы можете принять во внимание, все подробно описано в man 3 system.)

...