c语言访问sql数据库(使用freetds连接sql)

首页常识更新时间:2023-08-07 15:21:53

C语言 使用freetds连接sql server读取,win下可用, Linux下也可以,.

以下是源码,使用sql server的master数据库来测试。读取,

Win下编译器是TDM-gcc-64,: gcc version 10.3.0 (tdm64-1)

Linux下是gcc:: gcc version 6.3.0 20170516

-----------------------------

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

#include <wchar.h>

#include <locale.h>

#include<sybfront.h>

#include<sybdb.h>

void shuju()

{

// 编码

//setlocale(LC_ALL, "");

//win下的cmd要执行chcp 65001, 到utf8的编码下显示才正常

char aaa[50]= "test start ...";

printf("=> %s \t\n",aaa);

char szName[32] = "sa";

char szPwd[32] = "123456789";

char szDBName[32] = "master"; // master 数据库

char szServer[32] = "192.168.0.9:1433";

char bianma[32] = "utf8";

//初始化db-library

DBINT result_code;

dbinit();

//

LOGINREC *loginrec = dblogin();

DBSETLUSER(loginrec, szName);

DBSETLPWD(loginrec, szPwd);

DBSETLCHARSET(loginrec, bianma);

DBPROCESS *dbprocess = dbopen(loginrec, szServer);

if(dbprocess == FAIL) //如果连接失败

{

fprintf(stderr, "Connect Fail\n"); //在标准错误中输出信息

exit(EXIT_FAILURE); //进程异常退出

}else{ //如果连接成功

printf("Connect success\n");

}

if(dbuse(dbprocess, szDBName) == FAIL) //使用某个数据库,如果使用失败

{

dbclose(dbprocess); //关闭数据库连接句柄, 并且回收相关资源

exit(EXIT_FAILURE); //进程异常退出

}

//开始进行数据库中数据查询的工作------------------

char mssqlbuf[1024]; //定义保存数据库查询语句的字符串

memset(mssqlbuf, 0x00, sizeof(mssqlbuf)); //开始初始化字符串

sprintf(mssqlbuf, "select name,dbid from [sysdatabases] order by [name]"); //组装操作sql的语句, 将sql语句保存到mssqlbuf

dbcmd(dbprocess, mssqlbuf); //将刚刚组装好的sql命令, 使用dbcmd命令保存到数据库连接句柄的缓存中

if(dbsqlexec(dbprocess) == FAIL) //如果执行的命令失败

{

dbclose(dbprocess); //关闭数据库操作进程

exit(EXIT_FAILURE); //程序异常退出

}

char UserName[80]; //定义两个变量来保存绑定出来的数据 ????

char CardNo[16];

memset(UserName,'\0',sizeof(UserName));

memset(CardNo,'\0',sizeof(CardNo));

//char strx[] = "";

//char *strx;

char query[4096]={};

while ((result_code = dbresults(dbprocess)) != NO_MORE_RESULTS){

if (result_code == SUCCEED){

dbbind(dbprocess, 1, STRINGBIND, 0, (BYTE*)UserName);

dbbind(dbprocess, 2, CHARBIND, (DBINT)0, (BYTE*)CardNo);

int k=1;

while (dbnextrow(dbprocess) != NO_MORE_ROWS){

char shustr[100]="";

sprintf(shustr,"%d\tname: %s\t no: %s\n",k,UserName,CardNo);

k=k 1;

strcat(query,shustr);

}

printf("%s\n ok \n",query);

// printf("%s",strx);

}

}

dbclose(dbprocess);

}

int main(void)

{

shuju();

//return 0;

}

// linux: 手动编译freetds , 就要在编译时指向freetds安装路径

// linux编译: gcc -o cmssqlmaster cmssql-master.c -lsybdb -I /usr/local/freetds/include -L /usr/local/freetds/lib

// linux: 如果是apt-get install freetds-dev 安装的,编译时就不用上边那行那样加参数: gcc -o cmssqlmaster cmssql-master.c -lsybdb

// win下用的freedts 去这里下载, https://github.com/ramiro/freetds/releases/tag/v0.95.95

// win下cmd终端运行输出中文乱码解决:在cmd状态下输入 chcp 65001 , utf8字符串,在终端的显示

// win 编译: gcc -o cmssqlmaster cmssql-master.c -lsybdb -L "D:\Proj-C\freetds-win64-vs2015\lib-nossl" -I "D:\Proj-C\freetds-win64-vs2015\include"

-----------------------------

最初这个程序连接mssql测试的例子网上很多源码,都是使用freetds的,后来想在Windows下使用,网上都C语言版本的都是使用odbc的,但测试了很久,中文乱码部分始终不完全解决,最终发现原来freetds有win版本的,实践后,上述源码编译都可以通过.。

,
展开阅读全文
推荐内容
热门内容
热门文章

© 2007-2022 http://www.anhuiqq.cn,All Rights Reserved.