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<<<" ";//<
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.cpp,freetds的安装路径为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
好,就这些了,希望对你有帮助。