/*
============================================================================
Name : ODBCTest.c
Author : PengHaiBo
Version :
Copyright : Your copyright notice
Description : MSSQL ODBC Test in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include"sql.h"
#include"sqlext.h"
#include"sqltypes.h"
SQLHENV m_serverhenv;
SQLHDBC m_serverhdbc;
SQLHSTMT m_serverhstmt;
SQLINTEGER m_num;
SQLINTEGER m_nCode;
int m_nId;
int GetErrInfo(SQLHANDLE stmt)
{
SQLRETURN ret;
int i=1;
SQLCHAR SqlState[6]={0};
SQLINTEGER NativeError=0;
SQLCHAR errorString[100]={0};
SQLSMALLINT MsgLen=0;
char errStr[128]={0};
while(1)
{
if((ret = SQLGetDiagRec(SQL_HANDLE_DBC,m_serverhdbc,i,SqlState,&NativeError,errorString,100,&MsgLen)) != SQL_NO_DATA)
{
sprintf(errStr,"%s, %s\n",SqlState,errorString);
printf(errStr);
}
else if((ret = SQLGetDiagRec(SQL_HANDLE_STMT,stmt,i,SqlState,&NativeError,errorString,100,&MsgLen)) != SQL_NO_DATA)
{
sprintf(errStr,"%s, %s\n",SqlState,errorString);
printf(errStr);
}
else
break;
i++;
}
return 0;
}
void InitHandle()
{
SQLRETURN ret;
ret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&m_serverhenv);
ret = SQLSetEnvAttr(m_serverhenv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
if(!SQL_SUCCEEDED(ret))
{
printf("AllocEnvHandle error!\n");
return;
}
ret = SQLAllocHandle(SQL_HANDLE_DBC,m_serverhenv,&m_serverhdbc);
if(!SQL_SUCCEEDED(ret))
{
printf("AllocDbcHandle error!\n");
return;
}
ret = SQLConnect(m_serverhdbc,(SQLCHAR*)"OdbcTest",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"penghb",SQL_NTS);
//ret = SQLConnect(m_serverhdbc,(SQLWCHAR*)L"penghb",SQL_NTS,NULL,SQL_NTS,NULL,SQL_NTS);
//ret = SQLConnect(hdbc, (SQLCHAR *)g_aczODBC, SQL_NTS, (SQLCHAR *)g_aczUSER, SQL_NTS, (SQLCHAR *)g_aczPASS, SQL_NTS);
if(!SQL_SUCCEEDED(ret))
{
GetErrInfo(m_serverhstmt);
return;
}
ret = SQLAllocHandle(SQL_HANDLE_STMT,m_serverhdbc,&m_serverhstmt);
}
void ExecSQL()
{
SQLRETURN ret;
SQLCHAR name[20]={0};
SQLCHAR id[6]={0};
SQLLEN pointer_name=sizeof(name);
SQLLEN pointer_id=sizeof(id);
ret=SQLPrepare(m_serverhstmt,(SQLCHAR*)"update tmp_table set name=?, num=? where id=?",SQL_NTS);
ret=SQLBindParameter(m_serverhstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, pointer_name, 0, (void *)name, pointer_name, &pointer_name);
if( ret != SQL_SUCCESS)
printf("SQLBindParameter name error!\n");
ret=SQLBindParameter(m_serverhstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, (void*)&m_num, 0, 0);
if( ret != SQL_SUCCESS)
printf("SQLBindParameter num error!\n");
ret=SQLBindParameter(m_serverhstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, pointer_id, 0, (void *)id, pointer_id, &pointer_id);
if( ret != SQL_SUCCESS)
printf("SQLBindParameter id error!\n");
strcpy((char*)id,(char *)"0501");
strcpy((char*)name,(char *)"语文");
m_num = m_num +1;
ret=SQLExecDirect(m_serverhstmt,(SQLCHAR*)"update tmp_table set name='语文', num=99 where id='0501'",SQL_NTS);
if(!SQL_SUCCEEDED(ret))
{
GetErrInfo(m_serverhstmt);
return;
}
ret = SQLFreeStmt(m_serverhstmt, SQL_CLOSE ) ;
if( ret != SQL_SUCCESS)
printf("SQLFreeStmt SQL_CLOSE error!\n");
printf("执行成功。\n");
}
void FreeHandle()
{
SQLRETURN ret;
ret=SQLFreeHandle(SQL_HANDLE_STMT,m_serverhstmt);
if(SQL_SUCCESS!=ret && SQL_SUCCESS_WITH_INFO != ret)
printf("free hstmt error!\n");
ret=SQLDisconnect(m_serverhdbc);
if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
printf("disconnected error!\n");
ret=SQLFreeHandle(SQL_HANDLE_DBC,m_serverhdbc);
if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
printf("free hdbc error!\n");
ret=SQLFreeHandle(SQL_HANDLE_ENV,m_serverhenv);
if(SQL_SUCCESS!=ret&&SQL_SUCCESS_WITH_INFO!=ret)
printf("free henv error!\n");
}
int main(void)
{
InitHandle();
ExecSQL();
FreeHandle();
puts("!!!执行ok!!!");
return EXIT_SUCCESS;
}
要在Eclipse里面选择项目->属性中,Setings->GCC Linker->Libraries 界面添加libodbc.so动态库,linux动态库文件前缀lib和后缀.so,不用填写,例如这里添加libodbc.so文件,只需填写odbc即可。