ODBC连接数据库

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的值进行第二次插入。

 我是个新手,第一次发博客,希望能对大家有帮助。
发布了2 篇原创文章 · 获赞 5 · 访问量 154

猜你喜欢

转载自blog.csdn.net/shadiao_boy/article/details/93924133
今日推荐