2012-03-19 83 views
1

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

下面的例子是用参数执行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); 

回答

0

关于你的第exampe,简单的答案是否定的,你必须自己做,看到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]确实是双重类型。

或者,您可以使用准备好的声明API,它与sqlite3中的声明非常相似。关键是你提供MYSQL_BIND类型的缓冲区,然后将输入绑定到它,或者在那里有mysql绑定输出值。

准备语句文档:http://dev.mysql.com/doc/refman/5.5/en/c-api-prepared-statement-data-structures.html

+0

我发现这个[示例](http://mysqlresources.com/api/c/690)。这和我的很相似。我可以只'mysql_real_escape_string()''input_value'吗? – 2012-03-20 04:42:50

+0

看看我的帖子,在'mysql_real_escape_string()' – 2012-03-20 05:23:06

+0

是我的尝试,这看起来是对的 – hroptatyr 2012-03-20 07:36:14