#include #include #include #include "sqltypes.h" #include "sql.h" #include "sqlext.h" struct t1 { char uuid[36 + 1]; SQLLEN l1; unsigned short num; SQLLEN l2; char data[128]; SQLLEN l3; SQLLEN c; }; int main() { SQLHANDLE env; SQLHANDLE conn; SQLHANDLE query_handle; SQLHANDLE cursor; SQLCHAR dsn[] = "MySQL ODBC 8"; SQLCHAR uid[] = "root"; SQLCHAR pwd[] = "root"; SQLCHAR drop_db_query[] = "drop database if exists d1;"; SQLCHAR create_db_query[] = "create database d1;"; SQLCHAR use_db_query[] = "use d1;"; SQLCHAR drop_table_query[] = "drop table if exists t1;"; SQLCHAR create_table_query[] = "create table t1 ( \ uuid varchar(36) not null primary key, \ num tinyint unsigned not null, \ data blob) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;"; SQLCHAR insert_query[] = "insert into t1 (uuid, num, data) values (\"00000000-0000-0000-0000-000000000000\", 7, \"data\");"; SQLCHAR select_query[] = "select * from t1 where uuid = ?"; char uuid[] = "00000000-0000-0000-0000-000000000000"; char error_msg[256]; struct t1 t1; t1.num = 2; if (SQLAllocEnv(&env) != SQL_SUCCESS) { return -1; } if (SQLAllocConnect(env, &conn) != SQL_SUCCESS) { return -1; } if (SQLConnect(conn, dsn, SQL_NTS, uid, SQL_NTS, pwd, SQL_NTS) != SQL_SUCCESS) { SQLError(env, conn, SQL_NULL_HSTMT, NULL, NULL, (SQLCHAR *)error_msg, sizeof(error_msg), NULL); printf("SQLConnect error:\n%s\n", error_msg); return -1; } if (SQLAllocHandle(SQL_HANDLE_STMT, conn, &query_handle) != SQL_SUCCESS) { return -1; } if (SQLExecDirect(query_handle, drop_db_query, SQL_NTS) != SQL_SUCCESS) { SQLError(env, conn, query_handle, NULL, NULL, (SQLCHAR *)error_msg, sizeof(error_msg), NULL); printf("SQLExecDirect drop db error:\n%s\n", error_msg); return -1; } if (SQLExecDirect(query_handle, create_db_query, SQL_NTS) != SQL_SUCCESS) { SQLError(env, conn, query_handle, NULL, NULL, (SQLCHAR *)error_msg, sizeof(error_msg), NULL); printf("SQLExecDirect create db error:\n%s\n", error_msg); return -1; } if (SQLExecDirect(query_handle, use_db_query, SQL_NTS) != SQL_SUCCESS) { SQLError(env, conn, query_handle, NULL, NULL, (SQLCHAR *)error_msg, sizeof(error_msg), NULL); printf("SQLExecDirect use db error:\n%s\n", error_msg); return -1; } if (SQLExecDirect(query_handle, drop_table_query, SQL_NTS) != SQL_SUCCESS) { SQLError(env, conn, query_handle, NULL, NULL, (SQLCHAR *)error_msg, sizeof(error_msg), NULL); printf("SQLExecDirect drop table error:\n%s\n", error_msg); return -1; } if (SQLExecDirect(query_handle, create_table_query, SQL_NTS) != SQL_SUCCESS) { SQLError(env, conn, query_handle, NULL, NULL, (SQLCHAR *)error_msg, sizeof(error_msg), NULL); printf("SQLExecDirect create table error:\n%s\n", error_msg); return -1; } if (SQLExecDirect(query_handle, insert_query, SQL_NTS) != SQL_SUCCESS) { SQLError(env, conn, query_handle, NULL, NULL, (SQLCHAR *)error_msg, sizeof(error_msg), NULL); printf("SQLExecDirect insert error:\n%s\n", error_msg); return -1; } if (SQLAllocHandle(SQL_HANDLE_STMT, conn, &cursor) != SQL_SUCCESS) { return -1; } if (SQLSetStmtAttr(cursor, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER)SQL_CURSOR_FORWARD_ONLY, 0) != SQL_SUCCESS) { return -1; } if (SQLSetStmtAttr (cursor, SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER) sizeof(struct t1), 0) != SQL_SUCCESS) { return -1; } if (SQLSetStmtAttr (cursor, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)1, 0) != SQL_SUCCESS) { return -1; } sprintf(t1.uuid, uuid); memset(t1.data, '\0', sizeof(t1.data)); SQLBindCol(cursor, 1, SQL_C_CHAR, t1.uuid, sizeof(t1.uuid), &t1.l1); SQLBindCol(cursor, 2, SQL_C_UTINYINT, &t1.num, 0, &t1.l2); SQLBindCol(cursor, 3, SQL_C_BINARY, t1.data, sizeof(t1.data), &t1.l3); SQLBindParameter(cursor, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, t1.uuid, sizeof(t1.uuid), NULL); SQLPrepare(cursor, select_query, SQL_NTS); if (SQLExecute(cursor) != SQL_SUCCESS) { SQLError(env, conn, cursor, NULL, NULL, (SQLCHAR *) error_msg, sizeof(error_msg), NULL); printf ("SQLExecute error:\n%s\n", error_msg); return -1; } if (SQLFetch(cursor) != SQL_SUCCESS) { SQLError(env, conn, cursor, NULL, NULL, (SQLCHAR *) error_msg, sizeof(error_msg), NULL); printf ("SQLFetch error:\n%s\n", error_msg); return -1; } printf("uuid: %s\n", t1.uuid); printf("num: %d\n", t1.num); printf("data: %s\n", t1.data); if (t1.num == 7) { printf("ok\n"); } else { printf("failed\n"); } return 0; }