最近从sqlite切换到mysql。需要转换c中的一些代码

时间:2012-03-19 08:41:03

标签: mysql c api sqlite

我正在编写C程序来访问数据库。 我最近从sqlite切换到mysql。 我不熟悉mysql c api,所以我需要帮助转换一些代码。

下面的示例是使用参数执行sql语句。

源码:

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语句的结果解析为变量

源码:

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()功能相同的功能?

编辑: 我对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 :(得分:0)

对于你的第一个例子,简短的答案是否定的,你必须自己做,见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中的语法API非常相似。关键是你提供MYSQL_BIND类型的缓冲区,然后将输入绑定到它,或者在那里有mysql绑定输出值。

准备好的声明文档:http://dev.mysql.com/doc/refman/5.5/en/c-api-prepared-statement-data-structures.html