关于C语言连接SQL数据库…

关于C语言连接SQL数据库…,第1张

1、配置ODBC数据源。

2、使用SQL函数进行连接。

对于1、配置数据源,配置完以后就可以编程 *** 作数据库了。

对于2、使用SQL函数进行连接,参考代码如下:

#include<windows.h>

#include<sql.h>

#include<sqlext.h>

void main()

{

HENV henv //环境句柄

HDBC hdbc //数据源句柄

HSTMT hstmt //执行语句句柄

unsigned char datasource[]="数据源名称" //即<a href="https://www.baidu.com/s?wd=ODBC&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YLrHIWuWRsPWTvujD4P1Nb0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1mYP1R1n1cknW6sPWbzrj03Pf" target="_blank" class="baidu-highlight">ODBC</a>源中设置的源名称

unsigned char user[]= "用户名" //数据库的帐户名

unsigned char pwd[]= "密码" //数据库的密码

unsigned char search[]="select xm from stu where xh=0"

SQLRETURN retcode//记录各SQL函数的返回情况

// 分配环境句柄

retcode= SQLAllocEnv(&henv) // 等介于 SQLAllocHandle(SQL_HANDLE_ENV, SQL_<a href="https://www.baidu.com/s?wd=NULL&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YLrHIWuWRsPWTvujD4P1Nb0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1mYP1R1n1cknW6sPWbzrj03Pf" target="_blank" class="baidu-highlight">NULL</a>_HANDLE, &henv)

// 设置ODBC环境版本号为3.0

retcode= SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0)

// 分配连接句柄

retcode= SQLAllocConnect(henv,&hdbc)// 等介于 SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc)

//设置连接属性,登录超时为*rgbValue秒(可以没有)

// SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)(rgbValue), 0)

//直接连接数据源

// 如果是windows身份验证,第二、三参数可以是<a href="https://www.baidu.com/s?wd=NULL&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YLrHIWuWRsPWTvujD4P1Nb0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1mYP1R1n1cknW6sPWbzrj03Pf" target="_blank" class="baidu-highlight">NULL</a>,也可以是任何字串

//SQL_NTS 即 "<a href="https://www.baidu.com/s?wd=Null&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YLrHIWuWRsPWTvujD4P1Nb0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6K1TL0qnfK1TL0z5HD0IgF_5y9YIZ0lQzqlpA-bmyt8mh7GuZR8mvqVQL7dugPYpyq8Q1mYP1R1n1cknW6sPWbzrj03Pf" target="_blank" class="baidu-highlight">Null</a>-Terminated String"

retcode= SQLConnect(hdbc,datasource, SQL_NTS, user, SQL_NTS , pwd, SQL_NTS )

//分配语句句柄

retcode= SQLAllocStmt(hdbc,&hstmt) // 等介于 SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt)

//直接执行查询语句

retcode=SQLExecDirect(hstmt,search,SQL_NTS)

//将数据缓冲区绑定数据库中的相应字段(i是查询结果集列号,queryData是绑定缓冲区,BUFF_LENGTH是缓冲区长度)

SQLBindCol(hstmt, i, SQL_C_CHAR, queryData[i-1], BUFF_LENGTH, 0)

//遍历结果集到相应缓冲区 queryData

SQLFetch(hstmt)

/*

*对遍历结果的相关 *** 作,如显示等

*/

//注意释放顺序,否则会造成未知错误!

SQLFreeHandle(SQL_HANDLE_STMT, hstmt)

SQLDisconnect(hdbc)

SQLFreeHandle(SQL_HANDLE_DBC, hdbc)

SQLFreeHandle(SQL_HANDLE_ENV, henv)

}

代码看上去很复杂,其实都可以直接复制。其中需要改的是数据源名称、数据库用户名、数据库密码和SQL语句。

然后就是SQLFetch后得到结果集后,如何使用的问题了。

在下面的注释部分 填写你的处理代码即可。

/*

*对遍历结果的相关 *** 作,如显示等

*/

这是我在大学做过的课程设计,你看看:

/*

程序功能:

能完成每位学生的某门课程的平时成绩和期末考试成绩的录入,

完成每位学生的总评成绩计算(平时成绩*30%+期末考试成绩*70%)并生成数据文件,

生成分数段统计文件(不及格人数,60-69数,70-79人数,80-89人数,90-100人数,及格率),

通过学生成绩的数据文件查询学生成绩(查询条件自定)。

通过学生成绩的分段统计文件输出学生成绩分段情况和及格率。

程序要求:

(1)能够完成300人以内任何人数的成绩处理。

(2)程序要有主控菜单

*/

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct stud

{

long num

char name[20]

double score

}

typedef struct stucode

{

struct stud student

struct stucode *next

}L

void menu()

void createlist(struct stucode **r)

void out(struct stucode *r)

void search1(struct stucode *r)

void search2(struct stucode *r)

void del(struct stucode **r)

void insert(struct stucode **r)

void sort(struct stucode **r)

void main()

{

char choose

int flag=1

struct stucode *r=NULL

while(flag)

{

system("cls")

menu()

choose=getchar()

switch(choose)

{

case '1':

createlist(&r)

out(r)

printf("Testing function 1\nPress any key to continue\n")

getchar()

getchar()

break

case '2':

search1(r)

printf("Testing function 1\nPress any key to continue\n")

getchar()

getchar()

break

case '3':

search2(r)

printf("Testing function 1\nPress any key to continue\n")

getchar()

getchar()

break

case '4':

del(&r)

out(r)

printf("Testing function 1\nPress any key to continue\n")

getchar()

getchar()

break

case '5':

insert(&r)

out(r)

printf("Testing function 1\nPress any key to continue\n")

getchar()

getchar()

break

case '6':

sort(&r)

out(r)

printf("Testing function 1\nPress any key to continue\n")

getchar()

getchar()

break

case '7':

out(r)

printf("Testing function 7\nPress any key to continue\n")

getchar()

getchar()

break

case '0':

flag=0

printf("The end.\n")

break

default: printf("\nWrong Selection!(选择错误,请重选!)\n")getchar()getchar()

}

}

}

void createlist(struct stucode **r)

{

struct stucode *p,*t

long n

char a[20]

double s

if(*r) *r=NULL

printf(" \n请输入:\n 学号(请按学号升序排列) 姓名 分数 (若要结束请输入三个为零)\n")

scanf("%ld%s%lf",&n,a,&s)

if(n==0) return

p=(L *)malloc(sizeof(L))

p->student.num=n

strcpy(p->student.name,a)

p->student.score=s

p->next=NULL

*r=p

scanf("%ld%s%lf",&n,a,&s)

while(n)

{

t=p

p=(L *)malloc(sizeof(L))

p->student.num=n

strcpy(p->student.name,a)

p->student.score=s

p->next=NULL

t->next=p

scanf("%ld%s%lf",&n,a,&s)

}

}

void search1(struct stucode *r)

{

long x

if(!r)

{

printf("没有学生信息可查询!\n")

return

}

printf(" 请输入要查询的学生信息的学生学号:\n")

scanf("%ld",&x)

while(r&&r->student.num!=x)

r=r->next

if(r==NULL)

printf("Error! No such student !\n")

else

printf("%ld %s %.2lf\n",r->student.num,r->student.name,r->student.score)

}

void search2(struct stucode *r)

{

char m[20]

if(!r)

{

printf("没有学生信息可查询!\n")

return

}

printf(" 请输入要查询的学生信息的学生姓名:\n")

scanf("%s",m)

while(r&&strcmp(r->student.name,m))

r=r->next

if(r==NULL)

printf("Error! No such student !\n")

else

printf("%ld %s %.2lf\n",r->student.num,r->student.name,r->student.score)

}

void del(struct stucode **r)

{

long k

struct stucode *p=*r,*t

if(!(*r))

{

printf("没有学生信息可删除 !\n")

return

}

printf(" 请输入要删除的学生信息的学生学号:\n")

scanf("%ld",&k)

if(p->student.num==k)

*r=(*r)->next,free(p)

else

{

while(p->next&&p->next->student.num!=k)

p=p->next

if(p->next==NULL)

printf("Error! No such student !\n")

else

{

t=p->next

p->next=p->next->next

free(t)

}

}

}

void insert(struct stucode **r)

{

long n

char a[20]

double s

L *p,*t,*k

printf(" 请输入要插入的学生信息的学生学号 姓名 分数:\n")

scanf("%ld%s%lf",&n,a,&s)

p=(L *)malloc(sizeof(L))

p->student.num=n

p->student.score=s

strcpy(p->student.name,a)

if(!(*r))

{

*r=p

(*r)->next=NULL

return

}

if(p->student.num<(*r)->student.num)

p->next=(*r),(*r)=p

else

{

t=*r

k=t

while(t->next&&t->next->student.num<=p->student.num)

t=t->next

p->next=t->next

t->next=p

*r=k

}

}

void sort(struct stucode **r)

{

struct stucode *t,*p,*q,*z

if(!r)

{

printf("没有学生信息可排序!\n")

return

}

if(!(*r)||!(*r)->next)

return

t=*r

p=t->next

t->next=NULL

while(p)

{

q=p->next

if(p->student.score>t->student.score)

{

p->next=t

t=p

}

else

{

z=t

while(z->next&&z->next->student.score>=p->student.score)

z=z->next

p->next=z->next

z->next=p

}

p=q

}

*r=t

}

void out(struct stucode *r)

{

printf("\n\n")

if(!r)

{

printf("没有学生信息可输出!\n")

return

}

while(r)

{

printf("%ld %s %.2lf\n",r->student.num,r->student.name,r->student.score)

r=r->next

}

printf("\n\n")

}

void menu()

{

printf("\n 学生信息管理系统\n")

printf("\n 菜单\n\n")

printf("\n 1建立链表并显示\n")

printf("\n 2查找某学号的学生信息\n")

printf("\n 3查找某姓名的学生信息\n")

printf("\n 4删除某学号的学生信息\n")

printf("\n 5插入新的学生信息\n")

printf("\n 6按分数降序排列输出\n")

printf("\n 7输出\n")

printf("\n 0退出\n")

printf("\n 请选择您要执行的选项:\n")

}

很多人用到MySQL来开发一些项目,有时为了性能,我们会直接用C语言来开发相关的模块,尤其在我们的web应用中,虽然PHP、JSP等脚本均提供了MySQL的接口,但是显然直接使用C语言具有更好的安全性和性能,Michael以前用PHP开发的多个项目中就使用了C语言编写的这类接口,然后再编译到php里面,供php脚本直接使用,这方面的话题就不多说了,下面主要说一下在Linux下如何用C语言连接MySQL数据库,并且读取里面的数据返回,同时如何进行编译。

这里的大部分代码参考了MySQL发行包里面的.c源文件,大家也可以去里面找找相关的代码,下面这段代码实现了连接到本地MySQL服务器上9tmd_bbs_utf8数据库,从数据表tbb_user中根据输入的userid取得该用户的用户名并打印输出到终端。

#if defined(_WIN32) || defined(_WIN64) //为了支持windows平台上的编译

#i nclude

#endif

#i nclude

#i nclude

#i nclude "mysql.h" //我的机器上该文件在/usr/local/include/mysql下

//定义数据库 *** 作的宏,也可以不定义留着后面直接写进代码

#define SELECT_QUERY "select username from tbb_user where userid = %d"

int main(int argc, char **argv) //char **argv 相当于 char *argv[]

{

MYSQL mysql,*sock//定义数据库连接的句柄,它被用于几乎所有的MySQL函数

MYSQL_RES *res//查询结果集,结构类型

MYSQL_FIELD *fd //包含字段信息的结构

MYSQL_ROW row //存放一行查询结果的字符串数组

char qbuf[160]//存放查询sql语句字符串

if (argc != 2) { //检查输入参数

fprintf(stderr,"usage : mysql_select \n\n")

exit(1)

}

mysql_init(&mysql)

if (!(sock = mysql_real_connect(&mysql,"localhost","dbuser","dbpwd","9tmd_bbs_utf8",0,NULL,0))) {

fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(&mysql))

perror("")

exit(1)

}

sprintf(qbuf,SELECT_QUERY,atoi(argv[1]))

if(mysql_query(sock,qbuf)) {

fprintf(stderr,"Query failed (%s)\n",mysql_error(sock))

exit(1)

}

if (!(res=mysql_store_result(sock))) {

fprintf(stderr,"Couldn't get result from %s\n", mysql_error(sock))

exit(1)

}

printf("number of fields returned: %d\n",mysql_num_fields(res))

while (row = mysql_fetch_row(res)) {

printf("Ther userid #%d 's username is: %s\n", atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0]))) ? "NULL" : row[0]))

puts( "query ok !\n" )

}

mysql_free_result(res)

mysql_close(sock)

exit(0)

return 0//. 为了兼容大部分的编译器加入此行

}

编译的时候,使用下面的命令

gcc -o mysql_select ./mysql_select.c -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient (-lz) (-lm) 后面两个选项可选,根据您的环境情况

运行的时候,执行下面的命令

./mysql_select 1

将返回如下结果:

number of fields returned: 1

Ther userid #1 's username is: Michael

query ok !


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9776198.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存