1.配置ODBC数据源
Win10系统下 编译器:codeblocks 数据库:musql
连接数据库前需要先配置odbc。
1)安装MySQL的ODBC驱动程序
一般电脑上都会自带ODBC驱动程序,Win10系统下可以打开智能搜索,查看电脑上是否有odbc如果电脑上没有,附上odbc32驱动程序下载地址。
驱动程序下载地址https://dev.mysql.com/downloads/connector/odbc/。
2)添加ODBC数据源
1.打开文件:C:\Windows\SysWOW64\odbcad32.exe
2.点击添加,选择MySQL ODBC驱动程序,用户名和密码填写数据库的登录名和密码,数据源名自己自己随意起,点击测试,查看是否连接成功。
3.Codeblocks IDE执行环境配置
codeblocks需要链接如下的odbc32.dll文件才可以编译通过ODBC编程的各种函数。确保电脑里存在这个文件,否则网上下载。
4. 示例程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#include<sqltypes.h>
#define SNO_LEN 30
#define NAME_LEN 50
#define SEX_LEN 5
#define BIRTH_LEN 15
#define SDEPT_LEN 20
//插入操作
int Insert()
{
SQLRETURN ret;
SQLHENV henv; //SQLHENV henv
SQLHDBC hdbc; //SQLHDBC hdbc
SQLHSTMT hstmt; //SQLHSTMT hstmt
ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv); //申请环境句柄
ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0); //设置环境属性
SQLCHAR sno[SNO_LEN],name[NAME_LEN],sex[SEX_LEN],age[BIRTH_LEN],sdept[SDEPT_LEN];
SQLINTEGER cbsno=SQL_NTS,cbname=SQL_NTS,cbsex=SQL_NTS,cbage=SQL_NTS,cbsdept=SQL_NTS;
ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc); //申请连接数据库
ret=SQLConnect(hdbc(SQLCHAR*)"test1",SQL_NTS(SQLCHAR*)"root",SQL_NTS(SQLCHAR*)"190301",SQL_NTS);
if(!SQL_SUCCEEDED(ret))
{
return -1;
}
else
{
ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
ret=SQLExecDirect(hstmt,(SQLCHAR*)"INSERT INTO student VALUES (1,2,3,4,5);",SQL_NTS);
ret=SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,SNO_LEN,0,sno,0,&cbsno);
ret=SQLBindParameter(hstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,NAME_LEN,0,name,20,&cbname);
ret=SQLBindParameter(hstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,SEX_LEN,0,sex,10,&cbsex);
ret=SQLBindParameter(hstmt,4,SQL_PARAM_INPUT,SQL_C_LONG,SQL_CHAR,BIRTH_LEN,0,age,0,&cbage);
ret=SQLBindParameter(hstmt,5,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,SDEPT_LEN,0,sdept,20,&cbsdept);
ret=SQLExecute(hstmt);
printf("添加信息成功!\n");
}
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_STMT,hstmt);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
}
//显示
int show()
{
SQLRETURN ret;
SQLHENV henv; //SQLHENV henv
SQLHDBC hdbc; //SQLHDBC hdbc
SQLHSTMT hstmt; //SQLHSTMT hstmt
SQLCHAR sno[SNO_LEN],name[NAME_LEN],sex[SEX_LEN],age[BIRTH_LEN],sdept[SDEPT_LEN];
SQLINTEGER cbsno=SQL_NTS,cbname=SQL_NTS,cbsex=SQL_NTS,cbage=SQL_NTS,cbsdept=SQL_NTS;
ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv); //申请环境句柄
ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0); //设置环境属性
ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc); //申请连接数据库
ret=SQLConnect(hdbc,(SQLCHAR*)"test1",SQL_NTS,(SQLCHAR*)"root",SQL_NTS,(SQLCHAR*)"190301",SQL_NTS);
if(!SQL_SUCCEEDED(ret))
{
return -1;
}
else
{
ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt); //申请SQL语句句柄
SQLExecDirect(hstmt,(SQLCHAR*)"SELECT *FROM student ",SQL_NTS); //执行sql语句
SQLBindCol(hstmt,1, SQL_C_CHAR, sno,SNO_LEN, &cbsno);
SQLBindCol(hstmt,2, SQL_C_CHAR, name,NAME_LEN, &cbname);
SQLBindCol(hstmt,3, SQL_C_CHAR, sex,SEX_LEN,&cbsex);
SQLBindCol(hstmt,4, SQL_C_CHAR, age,BIRTH_LEN, &cbage);
SQLBindCol(hstmt,5, SQL_C_CHAR, sdept,SDEPT_LEN,&cbsdept);
printf("————————学生信息表——————————\n");
printf("学号 姓名 性别 年龄 所在系\n");
while((ret=SQLFetch(hstmt))!=SQL_NO_DATA_FOUND)
{
if(ret==SQL_ERROR)
printf("fetch error\n");
else
{
printf("%s %s %s %s %s\n",sno,name,sex,age,sdept);
}
}
}
SQLCloseCursor (hstmt);
//释放语句句柄
SQLFreeHandle(SQL_HANDLE_STMT,hstmt);
//断开数据库连接
SQLDisconnect(hdbc);
//释放连接句柄
QLFreeHandle(SQL_HANDLE_DBC,hdbc);
//释放环境句柄句柄
SQLFreeHandle(SQL_HANDLE_ENV,henv);
return 0;
}
int main()
{
int select;
while(1)
{
printf("欢迎来到学生信息管理系统\n");
printf("1. 显示学生信息\n");
printf("2. 插入学生信息\n");
printf("3. 删除学生信息\n");
printf("4. 退出\n");
printf("\n");
printf("请输入你的操作:\n");
scanf("%d",&select);
switch(select)
{
case 1: show();
printf("\n");
break;
case 2:Insert();
printf("\n");
break;
case 4:
exit(0);
break;
}
}
}
上面的插入功能不是很完善,只能通过修改ret=SQLExecDirect(hstmt,(SQLCHAR*)“INSERT INTO student VALUES (1,2,3,4,5);”,SQL_NTS);这条语句当中的VALUES的值进行第二次插入。
我是个新手,第一次发博客,希望能对大家有帮助。