// gcc $(pkg-config --cflags odbc) -g -o odbc104068 odbc104068.c $(pkg-config --libs odbc) #include #include #include int main(int argc, char **argv) { SQLHANDLE hdbc; SQLHANDLE henv; SQLHANDLE hstmt; SQLRETURN rc; rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ); assert( rc == SQL_SUCCESS ); rc = SQLSetEnvAttr( henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0 ); assert( rc == SQL_SUCCESS ); rc = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc ); assert( rc == SQL_SUCCESS ); rc = SQLConnect( hdbc, "test", SQL_NTS, "test", SQL_NTS, "test", SQL_NTS ); assert( rc == SQL_SUCCESS ); rc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ); assert( rc == SQL_SUCCESS ); rc = SQLExecDirect( hstmt, "SET SESSION sql_mode = 'NO_BACKSLASH_ESCAPES'", SQL_NTS ); assert( rc == SQL_SUCCESS ); rc = SQLPrepare( hstmt, "SELECT dtEnd FROM TimeInterval WHERE dtEnd < ?", SQL_NTS ); assert( rc == SQL_SUCCESS ); TIMESTAMP_STRUCT input; SQLLEN input_indicator; rc = SQLBindParameter( hstmt, 1, SQL_PARAM_INPUT, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, 24, 4, &input, sizeof( input ), &input_indicator ); assert( rc == SQL_SUCCESS ); input.year = 2021; input.month = 6; input.day = 1; input.hour = 0; input.minute = 0; input.second = 0; input.fraction = 0; input_indicator = sizeof( input ); rc = SQLFreeStmt( hstmt, SQL_CLOSE ); assert( rc == SQL_SUCCESS ); rc = SQLExecute( hstmt ); assert( rc == SQL_SUCCESS ); TIMESTAMP_STRUCT output; SQLLEN output_length; rc = SQLBindCol( hstmt, 1, SQL_C_TYPE_TIMESTAMP, &output, 0, &output_length ); assert( rc == SQL_SUCCESS ); rc = SQLFetch( hstmt ); assert( rc == SQL_SUCCESS ); printf( "fetch: %04d-%02d-%02dT%02d:%02d:%02d.%04d\n", output.year, output.month, output.day, output.hour, output.minute, output.second, output.fraction ); rc = SQLFreeStmt( hstmt, SQL_CLOSE ); assert( rc == SQL_SUCCESS ); return 0; }