文件首頁
MySQL 9.0 C API 開發人員指南
下載本手冊
PDF (US Ltr) - 1.4Mb
PDF (A4) - 1.4Mb


5.4.3 mysql_bind_param()

bool
mysql_bind_param(MYSQL *mysql,
                 unsigned n_params,
                 MYSQL_BIND *bind,
                 const char **name)

說明

自 MySQL 8.0.23 起提供的 mysql_bind_param() 允許定義套用至傳送至伺服器的下一個查詢的屬性。有關查詢屬性的用途和使用方式的討論,請參閱查詢屬性

使用 mysql_bind_param() 定義的屬性適用於使用 mysql_real_query()mysql_query() 以封鎖方式執行的非預處理語句,或使用 mysql_real_query_nonblocking() 以非封鎖方式執行的非預處理語句。屬性不適用於使用 mysql_stmt_execute() 執行的預處理語句。

如果查詢執行之前發生多個 mysql_bind_param() 呼叫,則僅套用最後的呼叫。

使用 mysql_bind_param() 定義的屬性僅適用於下一個執行的查詢,之後會被清除。mysql_reset_connection()mysql_change_user() 函數也會清除任何目前定義的屬性。

mysql_bind_param() 是向後相容的。對於連線至不支援查詢屬性的舊伺服器,不會傳送任何屬性。

引數

  • mysql:從 mysql_init() 傳回的連線處理常式。

  • n_params:由 bindname 引數定義的屬性數量。

  • bindMYSQL_BIND 結構陣列的位址。該陣列應包含 n_params 個元素,每個屬性一個。

  • name:字元指標陣列的位址,每個指標都指向定義屬性名稱的以 null 結尾的字串。該陣列應包含 n_params 個元素,每個屬性一個。查詢屬性名稱會使用 character_set_client 系統變數指示的字元集傳輸。

每個屬性都有一個名稱、一個值和一個資料類型。name 引數定義屬性名稱,而 bind 引數定義其值和類型。有關用於 bind 引數的 MYSQL_BIND 資料結構成員的說明,請參閱第 6.2 節「C API 預處理語句資料結構」

每個屬性類型都必須是表 6.1「MYSQL_BIND 結構允許的輸入資料類型」中列出的 MYSQL_TYPE_xxx 類型之一,除了不支援 MYSQL_TYPE_BLOBMYSQL_TYPE_TEXT。如果為屬性指定了不支援的類型,則會發生 CR_UNSUPPORTED_PARAM_TYPE 錯誤。

傳回值

成功則傳回零。如果發生錯誤,則傳回非零值。

錯誤

範例

此範例使用 mysql_bind_param() 定義字串和整數查詢屬性,然後使用 mysql_query_attribute_string() 使用者定義函數依名稱擷取並顯示其值

MYSQL_BIND bind[2];
const char *name[2] = { "name1", "name2" };
char *char_data = "char value";
int int_data = 3;
unsigned long length[2] = { 10, sizeof(int) };
int status;

/* clear and initialize attribute butffers */
memset(bind, 0, sizeof (bind));

bind[0].buffer_type = MYSQL_TYPE_STRING;
bind[0].buffer = char_data;
bind[0].length = &length[0];
bind[0].is_null = 0;

bind[1].buffer_type = MYSQL_TYPE_LONG;
bind[1].buffer = (char *) &int_data;
bind[1].length = &length[1];
bind[1].is_null = 0;

/* bind attributes */
status = mysql_bind_param(&mysql, 2, bind, name);
test_error(&mysql, status);
const char *query =
"SELECT mysql_query_attribute_string('name1'),"
"       mysql_query_attribute_string('name2')";
status = mysql_real_query(&mysql, query, strlen(query));
test_error(&mysql, status);
MYSQL_RES *result = mysql_store_result(&mysql);
MYSQL_ROW row = mysql_fetch_row(result);
unsigned long *lengths = mysql_fetch_lengths(result);
for(int i = 0; i < 2; i++)
{
    printf("attribute %d: [%.*s]\n", i+1, (int) lengths[i],
           row[i] ? row[i] : "NULL");
}
mysql_free_result(result);

執行後,程式碼會產生以下結果

attribute 1: [char value]
attribute 2: [3]