How to INSERT data into MySQL via ODBC by C programming.

Yesterday, we talked about “How to connect MySQL5 via ODBC by C programming.” I recommend if you are not expert in C programming please see that post firstly. Because many part of source in this post are come from that post.

Today, I need to show how to insert data after we can create a connection between our program and MySQL.

Before you go to to see my source code, I would like to show my “data table” inside MySQL database.


mysql> use zonetic;
Database changed
mysql> describe location_country;
| Field | Type             | Null | Key | Default | Extra          |
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| code  | varchar(2)       | YES  |     | NULL    |                |
| X     | varchar(7)       | YES  |     | NULL    |                |
| Y     | varchar(7)       | YES  |     | NULL    |                |
4 rows in set (0.20 sec)

First of all, we need to allocate a “statement handle” so as to reserve memory for put our SQL command statement like this:

ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

Second, we need to create a SQL statement like this:

SQLWCHAR* SQL = L"INSERT INTO location_country(code, X, Y) VALUES('ru','1234567','7654321')";

DON’T FORGET to put “L” at first of SQL Command.

Third, we put our SQL statement in function”SQLExecDirect” so as to execute SQL command.

ret = SQLExecDirect(stmt, SQL, SQL_NTS);

Finally, we need to free our memory after we send our command by fuction “SQLFreeHandle”

SQLFreeHandle(SQL_HANDLE_STMT, stmt);

Below is my full source code…

#include <windows.h>
#include <stdio.h>
#include <sql.h>
#include <sqlext.h>

static void extract_error(
 char *fn,
 SQLHANDLE handle,

main() {
 SQLRETURN ret; /* ODBC API return status */
 SQLWCHAR outstr[1024];
 SQLSMALLINT outstrlen;

 /* Allocate an environment handle */
 /* We want ODBC 3 support */
 SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
 /* Allocate a connection handle */
 SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
 /* Connect to the DSN mydsn */
 ret = SQLDriverConnect(dbc, NULL, (SQLWCHAR *)L"DSN=DSNMySQL", SQL_NTS, (SQLWCHAR *)outstr, sizeof(outstr), &outstrlen, SQL_DRIVER_COMPLETE);

 if (SQL_SUCCEEDED(ret)) {

 /* Allocate a statement handle */
 ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

 if(ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
 printf("Error Allocating Handle: %d\n", ret);
 }else {
 SQLWCHAR* SQL = L"INSERT INTO location_country(code, X, Y) VALUES('jp','1234567','7654321')";
 ret = SQLExecDirect(stmt, SQL, SQL_NTS);
 if(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
 printf("Insert data OK!!. SQL was:\n\n%s\n\n");
 SQLFreeHandle(SQL_HANDLE_STMT, stmt);
 SQLDisconnect(dbc);        /* disconnect from driver */
 } else {
 fprintf(stderr, "Failed to connect\n");
 extract_error("SQLDriverConnect", dbc, SQL_HANDLE_DBC);
 /* free up allocated handles */
 SQLFreeHandle(SQL_HANDLE_DBC, dbc);
 SQLFreeHandle(SQL_HANDLE_ENV, env);

static void extract_error(
 char *fn,
 SQLHANDLE handle,


Special thanks:

0 0 vote
Article Rating
1 Comment
Inline Feedbacks
View all comments
10 years ago

Great topic this code help me very much