Linux环境下通过ODBC访问MSSql Server源代码

/*
 ============================================================================
 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即可。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值