第一篇文章所以请耐心等待。我正在尝试实现mysql C API的一部分来检索一个已知的字段,它将是一个TINYINT值(布尔值,1或0)
mysql C API提供了一个类型,它是一个指向数组MYSQL_ROW行的指针;其中通过row [i]访问数组的元素,其中i是索引。无论数据库中的数据类型如何,元素都将作为字符串返回。
我试图访问的字段显然是布尔值,如果查询找到该字段,则为1或0。我想对这个字段的值进行逻辑检查,但我正在努力解决类型问题。我尝试将row [i]转换为int但没有好处,我似乎得到了返回的指针。我知道C没有本机bool类型但可以实现。任何想法都会受到欢迎..这是我的代码,非常感谢提前 - 保罗
void process_result_set (MYSQL *conn, MYSQL_RES *res_set) {
MYSQL_ROW row;
unsigned int i;
unsigned int logonstatus;
while ((row = mysql_fetch_row (res_set)) != NULL)
{
for (i = 0; i < mysql_num_fields (res_set); i++)
{
logonstatus = (int)(row[i]); // gives an int return but appears to return a memory location i.e. a pointer
printf("The value of logon status is: %d\n", logonstatus);
printf("\nThe value of the logon field is:%s\n", row[i]);
}
}
if (mysql_errno (conn) != 0)
print_error (conn, "mysql_fetch_row() failed");
else
printf ("%lu rows returned\n",(unsigned long) mysql_num_rows (res_set));
}
在回答你的问题时,是的,它是一个指向数组的指针,对于该特定字段,只有一个元素将存在,并且将被设置为1或0,或者该字段最初不会出现在查询中我正在跑步。
2个printf语句执行相同的操作,一个传递int,另一个传递一个字符串,这是使用mysql api时从数据库返回数据的方式。
非常感谢您的帮助。
我得到的输出如下:
(~/museuminfo) localhost $ ./museumDB
Connecting to MySQL Server...
Connection Successful
The SELECT statement you have built is: SELECT logon_status FROM users WHERE userpin='2468'
The value of logon status is: 146753048
The value of the logon field is:1
1 rows returned
答案 0 :(得分:0)
C中的字符串是指向字符数组的指针。类型为char *
。所以,你想要取消引用row [i](这是一个指向char的指针,在这种情况下等于代表数字1的char,正如你所注意到的那样)。使用此:
logonstatus = (int)*row[i];
而不是
logonstatus = (int)row[i];
row
之前的星号表示要查看名为row[i]
的指针指向的值。希望这是有道理的。
答案 1 :(得分:0)
秘密在于:logonstatus = (int)(row[i]);
。你说无论列有什么数据类型,MySQL都会返回字符串,这意味着row [i]是一个C字符串,转换为char*
。这就是为什么你看到一个指针,并且转换为int
对你没有帮助,因为变量仍然保持相同的值(但现在它是int
而不是pointer
); C类型转换不转换值,只转换类型表示。
您需要将字符串转换为int,您可以使用的C函数是atoi()。您需要更新代码如下:logonstatus = atoi(row[i]);