
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 !
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)