недавно переключился с sqlite на mysql. нужно конвертировать некоторый код в с - PullRequest
1 голос
/ 19 марта 2012

Я пишу программу на C для доступа к базе данных. Я недавно переключился с sqlite на mysql. Я не знаком с mysql c api, поэтому мне нужна помощь в преобразовании кода.

Ниже приведен пример выполнения оператора sql с параметром.

SQLite:

char *zSQL = sqlite3_mprintf("SELECT price FROM warehouse WHERE p_ID='%q'", input_value);
sqlite3_prepare_v2(handle,zSQL,-1,&stmt,0);

моя попытка в mysql:

char zSQL[60] = {'\0'};
int n = 0;

n = sprintf(zSQL, "SELECT price FROM warehouse WHERE p_ID='%s'", input_value);
mysql_real_query(conn, zSQL, n);

Другим примером является анализ результата оператора sql в переменную

SQLite:

double price_value = 0;
if (sqlite3_step (stmt) == SQLITE_ROW) {
    price_value = sqlite3_column_double (stmt, 0);
}

MySQL:

MYSQL_ROW row;
while ((row = mysql_fetch_row(result)))
{
    price_value = atof(row[0]);
}

Хотя код в MySQL работает для меня, но я чувствую, что недостаточно использую API. Есть ли в mysql c api какая-либо функция, имеющая такую ​​же функциональность, как sqlite3_mprintf() и sqlite3_column_double()?

Edit: Моя попытка mysql_real_escape_string():

ulong in_length = strlen(input_value);
char input_esc[(2 * in_length)+1];

mysql_real_escape_string(conn, input_esc, input_value, in_length); 
char sql_stmnt[56] = {'\0'};

n = sprintf(zSQL, "SELECT price FROM warehouse WHERE p_ID='%s'", input_esc);
mysql_real_query(conn, sql_stmnt, n);

1 Ответ

0 голосов
/ 19 марта 2012

Для вашего первого экзамена короткий ответ - нет, вы должны сделать это самостоятельно, см. http://dev.mysql.com/doc/refman/5.5/en/mysql-real-escape-string.html

 unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length)

Второй, да, это путь, с некоторой дополнительной проверкойчто row[0] действительно имеет тип double.

В качестве альтернативы, вы можете использовать подготовленный API операторов, который работает почти так же, как в sqlite3.Ключ заключается в том, что вы предоставляете буферы типа MYSQL_BIND и затем либо привязываете к нему входные данные, либо имеете выходные значения привязки mysql.

Документация подготовленного оператора: http://dev.mysql.com/doc/refman/5.5/en/c-api-prepared-statement-data-structures.html

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