最近需要再linux下开发一个服务链接SQLserver。但是没有相关经验,然后参考了网上的一些博客。有点心得记录如下。
主要参考了这个:
主要思路:采用unixODBC + FreeTDS 封装库的方案来实现
我使用离线安装:
Index of /rhel/7/prod/Packages/u/ (microsoft.com)
在上面中下载了上图中的2个安装包。
unixODBC-2.3.7-1.rh.x86_64.rpm
unixODBC-utf16-2.3.1-1.x86_64.rpm
安装
yum localinstall unixODBC-2.3.7-1.rh.x86_64.rpm
yum localinstall unixODBC-utf16-2.3.1-1.x86_64.rpm
去下面的地址下载freeTDS,最新的包。freetds-1.3.18.tar.gz
FreeTDS.org
tar -zxvf freetds-1.3.18.tar.gz
cd freetds-1.3.18
进入目录之后就开始编译了,但是需要注意一些事情。
需要注意的就是这里的--with-tdsver=7.3,这个非常重要,你需要根据你的数据库版本选择正确的配置项,由于现在大多是SQLserve2008 r2 所以需要选择7.3.
./configure --prefix=/usr/local/freetds --with-tdsver=7.3 --enable-msdblib
主要参数说明:--with-tdsver设置FreeTDS的版本,我这里设置了7.3是为了能连接SQL2008
--enable-msdblib是是否允许Microsoft数据库函数库,这里为允许
紧接着;
make && make install
然后我们可以测试一下是否安装成功,切换到目录/usr/local/freetds/bin/tsql -C
如果出现一下命令.说明成功安装了。
测试数据库是否联通
# /usr/local/freetds/bin/tsql -H 数据库服务器IP -p 端口号 -U 用户名 -P 密码
/usr/local/freetds/bin/tsql -H 127.0.0.1 -p 1433 -U sa -P '123'
如果是我上图中的,证明联通成功。
C代码示例,参考了Linux下连接Sql Server_linux 联接sql server_zhangatm的博客-CSDN博客
#include
#include
#include
#include
#include //freetds头文件
#include //freetds
int main(void)
{
char szUsername[32] = "admin";
char szPassword[32] = "root123";
char szDBName[32] = "db1"; //数据库名
char szServer[32] = "192.168.11.112:1433";//数据库服务器:端口
//初始化db-library
dbinit();
//连接数据库
LOGINREC *loginrec = dblogin();
DBSETLUSER(loginrec, szUsername);
DBSETLPWD(loginrec, szPassword);
DBPROCESS *dbprocess = dbopen(loginrec, szServer);//连接数据库
if(dbprocess == FAIL)
{
printf("Conect to MS SQL SERVER fail, exit!\n");
return -1;
}
printf("Connect to MS SQL SERVER success!\n");
if(dbuse(dbprocess, szDBName) == FAIL)
printf("Open database failed!\n");
else
printf("Open database success!\n");
//查询数据库
printf("[查询数据库表]\n");
dbcmd(dbprocess, "select StuID, Name, Age from StuInfo");
if(dbsqlexec(dbprocess) == FAIL)
{
printf("Query table 'StuInfo' error.\n");
return -1;
}
DBINT result_code;
char szStuID[20]={};
char szName[80]={};
char szAge[10]={};
int rows = 0;
while ((result_code = dbresults(dbprocess)) != NO_MORE_RESULTS){
if (result_code == SUCCEED){
dbbind(dbprocess, 1, CHARBIND, (DBINT)0, (BYTE*)szStuID);
dbbind(dbprocess, 2, CHARBIND, (DBCHAR)0, (BYTE*)szName);
dbbind(dbprocess, 3, CHARBIND, (DBCHAR)0, (BYTE*)szAge);
printf("StuID\tName\tAge\n", szStuID);
while (dbnextrow(dbprocess) != NO_MORE_ROWS){
printf("%s\t", szStuID);
printf("%s\t", szName);
printf("%s\n", szAge);
}
}
}
printf("[插入数据到数据库表]\n");
dbcmd(dbprocess, "insert into StuInfo(StuID, Name, Age) values(888,'James',28)");
if(dbsqlexec(dbprocess) == FAIL)
{
printf("insert into table 'StuInfo' error.\n");
return -1;
}
printf("insert into table 'StuInfo' success.\n");
printf("[删除数据库表中的记录]\n");
dbcmd(dbprocess, "delete from StuInfo where StuID=888");
if(dbsqlexec(dbprocess) == FAIL)
{
printf("delete from table 'StuInfo' error.\n");
return -1;
}
printf("delete from table 'StuInfo' success.\n");
//关闭数据库连接
dbclose(dbprocess);
return 0;
}
代码写完之后,编译的时候需要链接正确才能通过,整句话是这样的:
gcc -o dbTest dbTest.c -lrt /usr/lib/libsybdb.a 【一定要加入 -lrt 才行】