#include #include #include #include #include #define DSN "Driver=MySQL ODBC 8.0 Unicode Driver;Server=localhost;Port=3306;Database=test;BIG_PACKETS=1;FORWARD_CURSOR=1;MULTI_STATEMENTS=1;FOUND_ROWS=1;no_ssps=1;LOG_QUERY=1;" #pragma comment(lib, "odbc32.lib") typedef struct { wchar_t data1[11]; int indic1; wchar_t data2[11]; int indic2; wchar_t data3[11]; int indic3; } T_DATA; T_DATA data[5] = { { L"data1_1", 7 * sizeof(wchar_t), L"data1_2", 7 * sizeof(wchar_t), L"data1_3", 7 * sizeof(wchar_t) }, { L"data2_1", 7 * sizeof(wchar_t), L"data2_2", 7 * sizeof(wchar_t), L"data2_3", 7 * sizeof(wchar_t) }, { L"data3_1", 7 * sizeof(wchar_t), L"data3_2", 7 * sizeof(wchar_t), L"data3_3", 7 * sizeof(wchar_t) }, { L"data4_1", 7 * sizeof(wchar_t), L"data4_2", 7 * sizeof(wchar_t), L"data4_3", 7 * sizeof(wchar_t) }, { L"data5_1", 7 * sizeof(wchar_t), L"data5_2", 7 * sizeof(wchar_t), L"data5_3", 7 * sizeof(wchar_t) } }; void printerr(SQLUSMALLINT type, SQLHANDLE handle, int rc) { SQLINTEGER sqlcode; SQLSMALLINT len; char sqlstate[6] = "", message[512] = ""; if (SQLGetDiagRec (type, handle, 1, (SQLCHAR*)sqlstate, &sqlcode, (SQLCHAR*)message, _countof(message), &len) == SQL_SUCCESS) { printf("[%s - %d] %s\n", sqlstate, sqlcode, message); } else { printf("Unexpected error %d\n", rc); } } int main (int argc, char ** argv) { long rc, exitCode = -1; SQLSMALLINT dsnlen = 0, len; SQLHANDLE env = 0, con = 0, stmt = 0; char dsn[1024] = ""; rc = SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); rc = SQLSetEnvAttr (env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER); rc = SQLAllocHandle (SQL_HANDLE_DBC, env, &con); rc = SQLDriverConnect (con, NULL, (SQLTCHAR*)DSN, SQL_NTS, dsn, 1024, &len, SQL_DRIVER_NOPROMPT); if (rc != SQL_SUCCESS) { printerr(SQL_HANDLE_DBC, con, rc); printf("connexion failed...\n"); SQLFreeHandle (SQL_HANDLE_DBC, con); SQLFreeHandle (SQL_HANDLE_ENV, env); return -1; } rc = SQLAllocHandle (SQL_HANDLE_STMT, con, &stmt); rc = SQLExecDirect (stmt, "create table if not exists test_array (c1 varchar(10), c2 varchar(10), c3 varchar(10))", SQL_NTS); rc = SQLExecDirect (stmt, "delete from test_array", SQL_NTS); SQLFreeHandle (SQL_HANDLE_STMT, stmt); // main test rc = SQLAllocHandle (SQL_HANDLE_STMT, con, &stmt); SQLUSMALLINT status_codes[5]; rc = SQLSetStmtAttr (stmt, SQL_ATTR_PARAM_BIND_TYPE, (SQLPOINTER)sizeof(T_DATA), SQL_IS_INTEGER); rc = SQLSetStmtAttr (stmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)5, SQL_IS_INTEGER); rc = SQLSetStmtAttr (stmt, SQL_ATTR_PARAM_STATUS_PTR, (SQLPOINTER)status_codes, SQL_IS_INTEGER); rc = SQLBindParameter (stmt, (short) 1, (short) SQL_PARAM_INPUT, SQL_C_WCHAR, SQL_WVARCHAR, 10, 0, &(data[0].data1), 10, (SQLINTEGER*) &(data[0].indic1)); rc = SQLBindParameter (stmt, (short) 2, (short) SQL_PARAM_INPUT, SQL_C_WCHAR, SQL_WVARCHAR, 10, 0, &(data[0].data2), 10, (SQLINTEGER*) &(data[0].indic2)); rc = SQLBindParameter (stmt, (short) 3, (short) SQL_PARAM_INPUT, SQL_C_WCHAR, SQL_WVARCHAR, 10, 0, &(data[0].data3), 10, (SQLINTEGER*) &(data[0].indic3)); rc = SQLExecDirect (stmt, "insert into test_array(c1, c2, c3) values (?, ?, ?)", SQL_NTS); if (rc != SQL_SUCCESS) { printerr(SQL_HANDLE_STMT, stmt, rc); printf("insertion failed...\n"); SQLDisconnect (con); SQLFreeHandle (SQL_HANDLE_DBC, con); SQLFreeHandle (SQL_HANDLE_ENV, env); return -1; } int i, inserted = 0; for (i = 0; i < 5; i++) { printf ("row %d status : %d\n", i, status_codes[i]); if (status_codes[i] == SQL_SUCCESS || status_codes[i] == SQL_SUCCESS_WITH_INFO) inserted++; } printf ("%d rows of 5 inserted\n", inserted); SQLFreeHandle (SQL_HANDLE_STMT, stmt); SQLDisconnect (con); SQLFreeHandle (SQL_HANDLE_DBC, con); SQLFreeHandle (SQL_HANDLE_ENV, env); return 0; }