Linux下用freetds执行SqlServer的sql语句和存储过程

  Windows下访问Sqlserver很方便,特别是用ADO,即便是用C++写代码,也没怎么感觉麻烦,如果是用C#的话,写起来估计更是飞一般的感觉,可现在我要处理的问题是在Linux下访问SqlServer,执行sql语句和存储过程……

  好,不废话了,下面开工。

一、包含头文件

#include <sybfront.h> //freetds

#include <sybdb.h> //freetds 

二、执行sql语句或存储过程

1、查询类 

1.1 核心代码:

bool queryCmd(DBPROCESS *dbprocess,const char* strSql)
{
    dbcmd(dbprocess,strSql);
    if(dbsqlexec(dbprocess) == FAIL)
    {
        printf("Query error.\n");
        returnfalse;
    }
    DBINT result_code;
    char infArr[MaxColumnNums][MaxColumnSize];
    int retCode = 1;
    while ((result_code = dbresults(dbprocess)) != NO_MORE_RESULTS)
    {
        if (result_code == SUCCEED)
        {
            int i=1;
            int sz = 0;
            while(true)
            {
                //retCode = dbbind(dbprocess,i++, CHARBIND, (DBCHAR)0, (BYTE*)infArr[i]);
                retCode = dbbind(dbprocess,i, CHARBIND, (DBINT)0, (BYTE*)infArr[i]);
                if(retCode != 1) break;
                i++;
            }
            sz = i;
            while (dbnextrow(dbprocess) != NO_MORE_ROWS)
            {
                for(i=1; i<=sz; i++)
                {
                    //printf("%s ",infArr[i]);
                    cout<<infArr[i]<<" ";//<<endl;
                    memset(infArr[i],0,sizeof(infArr[i]));
                }
                cout<<endl;
            }
        }
    }
    returntrue;
} 

1.2 直接执行Sql语句

queryCmd(dbprocess, "select * from table"); 

1.3 不带参数的存储过程 

创建存储过程如下: 

createproctestPro 

as 

  select*fromstu; 

go 

调用如下:

queryCmd(dbprocess, "exec testPro"); 

1.4 带参数的存储过程 

创建存储过程如下: 

createprocgetPro1(@numint) 

as

  select*fromstuwhereStuID=@num;

go 

调用如下:

queryCmd(dbprocess, "exec getPro1 1003"); 

2、更新类

2.1 核心代码: 

bool updateCmd(DBPROCESS *dbprocess,const char* strSql)
{
    dbcmd(dbprocess,strSql);
    if(dbsqlexec(dbprocess) == FAIL)
    {
        printf("error : update fail\n");
        returnfalse;
    }
    returntrue;
}

2.2 直接执行sql语句

updateCmd(dbprocess,"insert into stu(StuID, Name, Age) values(888,'Mike',24)");

2.3不带参数的存储过程

创建存储过程如下: 

createprocdelPro1

as

  deletefromstuwhereStuID=888

go

调用如下:

updateCmd(dbprocess,"exec delPro1"); 

2.4 带参数的存储过程

创建存储过程如下: 

createprocdelPro2(@numint)

as

  deletefromstuwhereStuID=@num

go 

调用如下: 

updateCmd(dbprocess,"exec delPro2 888"); 

三、编译选项

比如源文件为test2.cppfreetds的安装路径为usr/local/freetds ,则如下编译:

g++ -g test2.cpp -o test2 -L/usr/local/freetds/lib -lsybdb -I/usr/local/freetds/include

PS环境 freetds 0.91 + Sqlserver 2008

好,就这些了,希望对你有帮助。

posted on 2012-03-30 18:03  Mike_Zhang  阅读(3624)  评论(0编辑  收藏  举报