1
我已經多次閱讀文檔,我已經在谷歌搜索,我發現了很多的例子,下面的代碼是我的研究結果。 但現在我有一個大問題,我找不到解決方案來解決它。 下面的代碼執行查詢,但不顯示結果,它總是返回0行,而它必須返回2行...我不明白錯誤在哪裏。準備SELECT語句執行但總是返回0行
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <mysql/mysql.h>
#define STRING_SIZE 50
#define SELECT_SAMPLE "select p.id_paz from pazienti p where p.id_doc = ?"
int main(void)
{
MYSQL *conn;
MYSQL_STMT *stmt;
MYSQL_BIND pbind[1],result[1]; /* results */
unsigned long length;
int row_count;
char login[STRING_SIZE];
my_bool is_null;
unsigned long plength;
char *pdata;
my_bool p_is_null;
// Open Database
const char *server = "localhost";
char *user = "root";
char *password = "password"; /* set me first */
char *database = "ProgettoSi";
conn = mysql_init(NULL);
/* Connect to database */
if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) {
//...
}
// Allocate statement handler
stmt = mysql_stmt_init(conn);
if (mysql_stmt_prepare(stmt, SELECT_SAMPLE, strlen(SELECT_SAMPLE)))
{
//...
}
fprintf(stdout, " prepare, SELECT successful\n");
plength = STRING_SIZE * sizeof(char);
p_is_null = 0;
pdata = (char*)malloc(STRING_SIZE * sizeof(char));
/* STRING PARAMETER */
pbind[0].buffer_type= MYSQL_TYPE_STRING;
pbind[0].buffer= (char *)pdata;
pbind[0].buffer_length=STRING_SIZE * sizeof(char);
pbind[0].is_null= &p_is_null;
pbind[0].length= &plength;
if(mysql_stmt_bind_param(stmt, pbind)) {
//...
}
mysql_real_escape_string(conn, pdata, "123", strlen("123")*sizeof(char));
plength = strlen(pdata) + 1;
printf("Executing query with parameters %s. \n", pdata);
/* Execute the SELECT query */
if (mysql_stmt_execute(stmt))
{
//...
}
/* Bind the result buffers for all 4 columns before fetching them */
result[0].buffer_type= MYSQL_TYPE_STRING;
result[0].buffer= (char *)login;
result[0].buffer_length= STRING_SIZE;
result[0].is_null= &is_null;
result[0].length= &length;
if (mysql_stmt_bind_result(stmt, result))
{
//...
}
if (mysql_stmt_store_result(stmt))
{
//...
}
row_count= 0;
fprintf(stdout, "Fetching results ...\n");
while (!mysql_stmt_fetch(stmt))
{
row_count++;
fprintf(stdout, " row %d\n", row_count);
/* column 2 */
fprintf(stdout, " column1 (string) : ");
if (is_null)
fprintf(stdout, " NULL\n");
else
fprintf(stdout, " %s(%ld)\n", login, length);
}
/* Validate rows fetched */
fprintf(stdout, " total rows fetched: %d\n", row_count);
/* Close the statement */
if (mysql_stmt_close(stmt))
{
//...
}
return 0;
}
它的工作原理,如果我手動插入查詢中的值。
#define SELECT_SAMPLE "select p.id_paz from pazienti p where p.id_doc = 123"
如果我執行這個查詢,顯然更多的註釋代碼...它的工作原理...
最好的錯誤條件愚蠢的問題:你* did *仔細檢查,數據庫實際上包含你期望的數據行?如果是的話,我會建議將示例代碼縮短到絕對最小值,以便仍然顯示觀察到的行爲。那裏有很多錯誤檢查,顯然沒有被觸發;他們沒有對這個例子做出貢獻,或者可以用簡單的'assert()'來代替,以表明你*做了*檢查條件... – DevSolar 2012-01-05 15:55:11
是的,我做了仔細檢查。現在像你建議我簡短的例子代碼。 – 2012-01-05 16:23:10