2011-07-07 4 views
4

一つはテキストフィールドの結果を処理するためのMySQL C APIで調製したステートメントを使用する場合、一方は結合アウトの文字列の長さを指定しなければならない:のMySQL C APIハンドルテキストフィールド

MYSQL_BIND out_bind; 
char   str_data[STRING_SIZE]; 
my_bool  is_null; 
my_bool  error; 

.... 
/* STRING COLUMN */ 
out_bind.buffer_type = MYSQL_TYPE_STRING; 
out_bind.buffer = str_data; 
out_bind.buffer_length = STRING_SIZE; 
out_bind.is_null= &is_null; 
out_bind.length= &length; 
out_bind.error= &error; 

mysql_stmt_bind_result(statement, out_bind) 

与えられた例においてSTRING_SIZE既知の定数ですが、データの長さが小さなサイズからメガバイトまで変化するTEXTフィールドを使用する方法はありますか?

標準的なアプローチはありますか?

+0

Ugh! 'str_data'自体(崩壊後)は' char * 'です。なぜあなたは 'char *'に変換していますか? :) – pmg

+0

あなたは正しいです。実際のコードからこの単純化された例に移行した後は、ここにとどまったのはただの手がかりです。気にしないで。 – MajesticRa

+0

私は正確に覚えていませんが、返品構造でこれを取得します – Ulterior

答えて

2

は言う:あなたはmysql_stmt_fetchでそれをフェッチする前に、列の値の長さを決定することがありますいくつかのケースで

を()。その後、クライアント側での結果全体をバッファリングするmysql_stmt_store_result()を呼び出し、mysql_stmt_attr_set()STMT_ATTR_UPDATE_MAX_LENGTHを渡し、個々の行を取得するためにmysql_stmt_fetch()を呼び出す前

  • :...これを実現するために、あなたは、これらの戦略を使用することができます。 STMT_ATTR_UPDATE_MAX_LENGTH属性を設定すると、列値の最大長は、mysql_stmt_result_metadata()によって返される結果セットのメタデータのmax_lengthメンバーによって示されます。

  • mysql_stmt_fetch()は、該当する列の長さがゼロのバッファと、実際の長さが格納されるポインタを呼び出します。次に、実長をmysql_stmt_fetch_column()で使用します。

また、私は同じ問題を持っていたmanual page for mysql_stmt_bind_result

2

を読むのが好きかもしれません。私はSTMT_ATTR_UPDATE_MAX_LENGTHの設定を使用して、最初のポイントにPMGのsaidsのように、この問題を解決した、ここに私のコードは次のとおりです。

MYSQL_STMT *stmt; 
MYSQL_BIND bind[1]; 
MYSQL_BIND bind_result[1]; 

// _con your mysql connection 
stmt = mysql_stmt_init(_con); 
if (!stmt) 
{ 
    fprintf(stderr, " mysql_stmt_init(), out of memory\n"); 
    exit(0); 
} 

char* aQuery = (char*) "'your query'"; 
if (mysql_stmt_prepare(stmt, aQuery, strlen(aQuery))) 
{ 
    fprintf(stderr, " mysql_stmt_prepare(), INSERT failed\n"); 
    fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); 
    exit(0); 
} 

    // Here fill binded parameters (here a string) 
memset(bind, 0, sizeof(bind)); 

const char* aStr = ioType.c_str(); 
long unsigned int aSize = ioType.size(); 

bind[0].buffer_type= MYSQL_TYPE_STRING; 
bind[0].buffer= (char *) aStr; 
bind[0].buffer_length= 2048; 
bind[0].is_null= 0; 
bind[0].length= &aSize; 

/* Bind the buffers */ 
if (mysql_stmt_bind_param(stmt, bind)) 
{ 
    fprintf(stderr, " mysql_stmt_bind_param() failed\n"); 
    fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); 
    exit(0); 
} 

    // Reauest meta data information 
MYSQL_RES* aRes = mysql_stmt_result_metadata(stmt); 

    // Set STMT_ATTR_UPDATE_MAX_LENGTH attribute 
my_bool aBool = 1; 
mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &aBool); 

/* Execute the select statement - 1*/ 
if (mysql_stmt_execute(stmt)) 
{ 
    fprintf(stderr, " mysql_stmt_execute(), 1 failed\n"); 
    fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); 
    exit(0); 
} 

if (mysql_stmt_store_result(stmt)) { 
    fprintf(stderr, " mysql_stmt_execute(), 1 failed\n"); 
    fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); 
    exit(0); 
}  

// Retrieving meta data information 
MYSQL_FIELD* aField = &aRes->fields[0]; 

fprintf(stdout, " field %s \n",aField->name); 
fprintf(stdout, " field length %d \n",(int) aField->length); 
fprintf(stdout, " field max length %d \n", (int) aField->max_length); 


int totalrows = mysql_stmt_num_rows(stmt); 
fprintf(stdout, " fetched %d description\n",totalrows); 
fprintf(stdout, " field count %d \n",(int) aRes->field_count); 

long unsigned int aMaxSize; 
char* aBuffer = (char*) malloc(aField->max_length); 

memset (bind_result, 0, sizeof (bind_result)); 
bind_result[0].buffer_type= MYSQL_TYPE_BLOB; 
bind_result[0].is_null= 0; 
bind_result[0].buffer= (char *) aBuffer; 
bind_result[0].buffer_length= aField->max_length; 
bind_result[0].length= &aMaxSize; 

mysql_stmt_bind_result(stmt, bind_result); 

std::string aStrData; 
while(!mysql_stmt_fetch(stmt)) 
{ 
    fprintf(stdout, " size %d\n", (int) aMaxSize); 
    aStrData = std::string(aBuffer,aMaxSize); 
    fprintf(stdout, " data %s\n", aStrData.c_str()); 
} 

free(aBuffer); 

mysql_free_result(aRes); 

if (mysql_stmt_close(stmt)) 
{ 
    fprintf(stderr, " failed while closing the statement\n"); 
    fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); 
    exit(0); 
} 

・ホープ、このことができます!