3.6.4 Prepared Statement Handling of Date and Time Values (original) (raw)
3.6.4 Prepared Statement Handling of Date and Time Values
The binary (prepared statement) protocol enables you to send and receive date and time values (DATE,TIME,DATETIME, andTIMESTAMP), using theMYSQL_TIME
structure. The members of this structure are described inSection 6.2, “C API Prepared Statement Data Structures”.
To send temporal data values, create a prepared statement usingmysql_stmt_prepare(). Then, before callingmysql_stmt_execute() to execute the statement, use the following procedure to set up each temporal parameter:
- In the
MYSQL_BIND
structure associated with the data value, set thebuffer_type
member to the type that indicates what kind of temporal value you're sending. ForDATE,TIME,DATETIME, orTIMESTAMP values, setbuffer_type
toMYSQL_TYPE_DATE
,MYSQL_TYPE_TIME
,MYSQL_TYPE_DATETIME
, orMYSQL_TYPE_TIMESTAMP
, respectively. - Set the
buffer
member of theMYSQL_BIND
structure to the address of theMYSQL_TIME
structure in which you pass the temporal value. - Fill in the members of the
MYSQL_TIME
structure that are appropriate for the type of temporal value to pass.
Use mysql_stmt_bind_param() ormysql_stmt_bind_named_param() to bind the parameter data to the statement. Then you can callmysql_stmt_execute().
To retrieve temporal values, the procedure is similar, except that you set the buffer_type
member to the type of value you expect to receive, and thebuffer
member to the address of aMYSQL_TIME
structure into which the returned value should be placed. Usemysql_stmt_bind_result() to bind the buffers to the statement after callingmysql_stmt_execute() and before fetching the results.
Here is a simple example that insertsDATE,TIME, andTIMESTAMP data. Themysql
variable is assumed to be a valid connection handler.
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);
..