3.6.3 日期和时间值的预处理语句处理

二进制(准备好的语句)协议使您能够使用该结构 发送和接收日期和时间值(DATETIMEDATETIMETIMESTAMP) 。MYSQL_TIME该结构的成员在 第 6.2 节“C API 准备语句数据结构”中进行了描述。

要发送时态数据值,请使用创建准备好的语句 mysql_stmt_prepare()。然后,在调用 mysql_stmt_execute()执行语句之前,使用以下过程设置每个时间参数:

  1. MYSQL_BIND与数据值关联的结构中,将buffer_type 成员设置为指示您发送的时间值类型的类型。对于 DATETIMEDATETIMETIMESTAMP值,分别设置 buffer_typeMYSQL_TYPE_DATEMYSQL_TYPE_TIMEMYSQL_TYPE_DATETIMEMYSQL_TYPE_TIMESTAMP

  2. 将结构的buffer成员 设置为您在其中传递时间值 MYSQL_BIND的结构的地址。MYSQL_TIME

  3. 填写MYSQL_TIME 适合要传递的时间值类型的结构成员。

用于mysql_stmt_bind_param()将参数数据绑定到语句。然后你就可以打电话了 mysql_stmt_execute()

要检索时间值,过程是相似的,只是您将buffer_type成员设置为您希望接收的值的类型,并将 成员设置为返回值应放入buffer的结构地址 。MYSQL_TIME用于 在调用之后和获取结果之前 mysql_stmt_bind_result()将缓冲区绑定到语句 。mysql_stmt_execute()

这是一个插入 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_param(stmt, bind);

  /* 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);
  ..