MySQL 9.0 C API 開發人員指南  /  ...  /  預處理語句處理日期和時間值

3.6.4 預處理語句處理日期和時間值

二進位 (預處理語句) 通訊協定可讓您使用 MYSQL_TIME 結構傳送和接收日期和時間值 (DATETIMEDATETIMETIMESTAMP)。此結構的成員說明於第 6.2 節,「C API 預處理語句資料結構」

若要傳送時間資料值,請使用 mysql_stmt_prepare() 建立預處理語句。接著,在呼叫 mysql_stmt_execute() 執行語句之前,請使用以下程序來設定每個時間參數:

  1. 在與資料值相關聯的 MYSQL_BIND 結構中,將 buffer_type 成員設定為指示您要傳送的時間值類型的類型。對於 DATETIMEDATETIMETIMESTAMP 值,請分別將 buffer_type 設定為 MYSQL_TYPE_DATEMYSQL_TYPE_TIMEMYSQL_TYPE_DATETIMEMYSQL_TYPE_TIMESTAMP

  2. MYSQL_BIND 結構的 buffer 成員設定為您傳遞時間值的 MYSQL_TIME 結構的位址。

  3. 填入適合要傳遞的時間值類型的 MYSQL_TIME 結構成員。

使用 mysql_stmt_bind_param()mysql_stmt_bind_named_param() 將參數資料繫結至語句。然後,您可以呼叫 mysql_stmt_execute()

若要擷取時間值,程序類似,但您要將 buffer_type 成員設定為您預期接收的值類型,並將 buffer 成員設定為應放入傳回值的 MYSQL_TIME 結構的位址。在呼叫 mysql_stmt_execute() 之後以及擷取結果之前,請使用 mysql_stmt_bind_result() 將緩衝區繫結至語句。

以下是一個簡單的範例,說明如何插入 DATETIMETIMESTAMP 資料。假設 mysql 變數是有效的連線處理常式。

  MYSQL_TIME  ts;
  MYSQL_BIND  bind[3];
  MYSQL_STMT  *stmt;

  strmov(query, "INSERT INTO test_table(date_field, time_field, \
                               timestamp_field) VALUES(?,?,?");

  stmt = mysql_stmt_init(mysql);
  if (!stmt)
  {
    fprintf(stderr, " mysql_stmt_init(), out of memory\n");
    exit(0);
  }
  if (mysql_stmt_prepare(mysql, query, strlen(query)))
  {
    fprintf(stderr, "\n mysql_stmt_prepare(), INSERT failed");
    fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
    exit(0);
  }

  /* set up input buffers for all 3 parameters */
  bind[0].buffer_type= MYSQL_TYPE_DATE;
  bind[0].buffer= (char *)&ts;
  bind[0].is_null= 0;
  bind[0].length= 0;
  ...
  bind[1]= bind[2]= bind[0];
  ...

  mysql_stmt_bind_named_param(stmt, bind, 3, NULL);

  /* supply the data to be sent in the ts structure */
  ts.year= 2002;
  ts.month= 02;
  ts.day= 03;

  ts.hour= 10;
  ts.minute= 45;
  ts.second= 20;

  mysql_stmt_execute(stmt);
  ..