Koneksi Program C Ke SQL Server Dari Linux

You might also like

You are on page 1of 16

Koneksi Dari C/C++ Di Linux Centos 7.

9 Ke SQL Server 2008


Enterprise Di Windows Server 2008 R2 Enterprise
https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/connection-string-keywords-and-data-
source-names-dsns?view=sql-server-ver15

http://www.intelmenu.com/notes/c/c_odbc.html

Persiapan :

IP Address Linux Centos 7.9 : 192.168.1.7

IP Address Windows Server 2008 R2 Enterprise : 192.168.1.1

RDBMS : SQL Server 2008 Enterprise


Untuk memudahkan uji coba, Firewall di Linux & Windows di-OFF kan saja

Di Linux Centos 7.9 Part 1


1. Setting repo

[rhel7.9-dvd]

Name=RHEL-$releasever-DVD

Baseurl= file:///media/

gpgcheck=0

enabled=1

2. Memasang paket unixODBC & unixODBC-devel : yum install unixODBC unixODBC-devel

unixODBC-devel harus diinstal karena koneksi ke database server memerlukan sejumlah file header
yaitu : sql.h, sqlext.h, sqltypes.h
Instalasi unixODBC & unixODBC-devel selesai

3. Memasang paket driver database Microsoft SQL Server

4. Membuat DSN (Data Source Name)

Pastikan di file /etc/odbcinst.ini berisi sbb :

Ada 2 tipe konfigurasi DSN yaitu : level sistem & level user
A. Membuat DSN Di Level Sistem

Konfigurasi ini berlaku untuk semua user. Buat file baru : vim /etc/odbc.ini dengan isi sbb :

B. Membuat DSN Di Level User

Konfigurasi ini berlaku untuk 1 user saja, yaitu user yang sedang login dan sudah melakukan konfigurasi
tsb. Buat file baru di folder home user yang bersangkutan :

Isi file .odbc.ini sbb :

Di Windows Server 2008 R2 Enterprise


Database & Tabel Yang Digunakan
Nama database : dbtes_untuk_c

Nama tabel : employee

Field : Nama kolom, tipe data & atribut2 lainnya sesuai gambar

Di Linux Centos 7.9 Part 2


1. Tulis kode sbb :

#include <stdio.h>

#include <string.h>

#include <sql.h>

#include <sqlext.h>

#include <sqltypes.h>

#define MAXNAME 1024

SQLHENV henv = SQL_NULL_HENV;

SQLHDBC hdbc1 = SQL_NULL_HDBC;

SQLHSTMT hstmt1 = SQL_NULL_HSTMT;

int main() {

RETCODE retcode;

UCHAR szDSN[SQL_MAX_DSN_LENGTH+1] =
"SQL_SERVER_2008_ENTERPRISE";

UCHAR szUID[MAXNAME] = "testermin1";

UCHAR szAuthStr[MAXNAME] = "J@karta3";

// Allocate the ODBC Environment and save handle.

retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);

// Let ODBC know this is an ODBC 3.0 application.


retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,

(SQLPOINTER)SQL_OV_ODBC3,

SQL_IS_INTEGER);

// Allocate an ODBC connection handle and connect.

retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);

retcode = SQLConnect(hdbc1, szDSN, (SWORD)strlen(szDSN),

szUID, (SWORD)strlen(szUID),

szAuthStr, (SWORD)strlen(szAuthStr));

if ( (retcode != SQL_SUCCESS) &&

(retcode != SQL_SUCCESS_WITH_INFO) ) {

printf("Koneksi Ke Database SQL Server 2008 gagal\n");

else {

printf("Koneksi Ke Database SQL Server 2008 sukses\n");

// Allocate statement handles and do ODBC processing.

/* Clean up. */

SQLDisconnect(hdbc1);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);

SQLFreeHandle(SQL_HANDLE_ENV, henv);

return 0;

}
2. Setting linker di CodeBlocks 20.03

Klik Build options


Pengaturan di Other compiler options

Pengaturan di Linker settings  Other linker options


3. Pengujian

Contoh Lain
Tulis kode sbb :

#include <stdio.h>

#include <string.h>

#include <sql.h>

#include <sqlext.h>

SQLHENV henv = NULL;

SQLHDBC hdbc = NULL;

int ODBCConnectDB(SQLCHAR *ds, SQLCHAR *user, SQLCHAR *pw) {

SQLRETURN rc;

hdbc = NULL;
henv = NULL;

rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {

rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void *)


SQL_OV_ODBC3, 0);

if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {

rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {

SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT,
(SQLPOINTER) 5, 0);

rc = SQLConnect(hdbc, ds, SQL_NTS, user, SQL_NTS,


pw, SQL_NTS);

if(rc == SQL_SUCCESS || rc ==
SQL_SUCCESS_WITH_INFO) {

return 1;

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, henv);

hdbc = NULL;
henv = NULL;

return 0;

int ODBCDisconnectDB() {

if(hdbc) {

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

if(henv) {

SQLFreeHandle(SQL_HANDLE_ENV, henv);

hdbc = NULL;

henv = NULL;

return 1;

int db_exec_stmt(char *stmt_str) {

SQLHSTMT hstmt;

SQLRETURN rc;

if(henv == NULL || hdbc == NULL) { return 0; }

rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);


if( !(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) )
{ return 0; }

rc = SQLExecDirect(hstmt, stmt_str, SQL_NTS);

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { return


1; }

if(rc == SQL_NO_DATA) { return 1; }

printf("sqlerr: %d\n", rc);

return 0;

int db_fetch() {

SQLRETURN r;

SQLHSTMT hstmt;

SQLCHAR sql[256];

SQLINTEGER n;

SQLINTEGER id;

SQLCHAR name[20];

SQLREAL age;

SQL_DATE_STRUCT birthday;

SQL_TIMESTAMP_STRUCT create_timestamp;
if(hdbc == NULL || henv == NULL) { return 0; }

r = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

if( !(r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) ) { return


0; }

strcpy(sql, "SELECT id, name, age, birthday, create_timestamp


FROM employee");

r = SQLExecDirect(hstmt, sql, SQL_NTS);

if(r != SQL_SUCCESS) {

printf("Cannot access [%s]\n", sql);

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

return 0;

while(1) {

r = SQLFetch(hstmt);

if(r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) {

r = SQLGetData(hstmt, 1, SQL_C_ULONG, &id, 0, &n);

r = SQLGetData(hstmt, 2, SQL_C_CHAR, name, 20, &n);

r = SQLGetData(hstmt, 3, SQL_C_FLOAT, &age, 0, &n);

r = SQLGetData(hstmt, 4, SQL_C_TYPE_DATE, &birthday,


0, &n);
r = SQLGetData(hstmt, 5, SQL_C_TYPE_TIMESTAMP,
&create_timestamp, 0, &n);

printf("%d, %s\n", id, name);

else if(SQL_NO_DATA == r) {

break;

else {

printf("%s\n", "fail to fetch data");

break;

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

return 0;

void main() {

ODBCConnectDB("SQL_SERVER_2008_ENTERPRISE", "testermin1",
"J@karta3");

db_exec_stmt("INSERT INTO employee (name, age, birthday) VALUES


(\'Joy\', 20.76, \'2001-9-13\') ");

db_fetch();

ODBCDisconnectDB();

Begitu program dijalankan, data akan disimpan di SQL Server 2008 dan program akan menampilkan data
dari kolom id & name. Hasilnya di bawah ini :
Cek data yang masuk ke database

Data yang tampil di aplikasi

Data yang ditampilkan adalah data dari kolom id dan name


Selesai.
Created By : C/C++ Coder in Jakarta, SE Asia

You might also like