c++的ODBC数据库模型讲解

通过本篇的认证阅读,你可以了解数据库的基本工作模式,程序对数据库操作的基本模型
一,什么是数据库?

数据库通俗的理解就是存放数据的地方,不同的程序可以向数据库中插入删除查询数据。
其中包含很多表,这些表的表列由开发者设计,在对数据库进行操作时主要就是进行:
插入一行数据,删除一行数据,更新一行数据
比如在word文档里
我们定义一个表头在这里插入图片描述
当我们进行插入操作时:
在这里插入图片描述
插入ID为1001的数据,且姓名为张三,学号为1712563
在数据库中也同理但是与word不同的是:
进行插入数据时必须插入一行数据
删除时也必须删除一行数据
更新时也是对一行数据进行更新
当进行插入删除操作时,我们知道进行插入删除操作,但是我们怎么给数据库发送这个命令呢?
这时候就用到了sql查询语言
二,sql查询语言
这里以sqlserver为例:

在这里插入图片描述
在图中,我的电脑上的sqlserver中,共有三个数据库,分别为:
chengyangkj,FashAndBearPow,Students,三个数据库,
数据库由不同表组成。
在Students数据库下,有两个表,分别为Information表,这里面存放学生的信息,
Math表,存放学生数学成绩表。
让我们来看Information表:
在这里插入图片描述
他的表头我们设计为:ID,Name,Math,English,Chinese,Img
其中Img列可以为空,其他不可以为空
怎么使用sql语言进行插入操作呢?
1,查询数据
点击新建查询:

在这里插入图片描述
写下如下sql语言:

select * from Information 

*代表所有,这句查询语言也非常容易理解:
select(选出)*(所有的) from(从 )Information(information表)
执行效果:

在这里插入图片描述
可以看出查询出了所有数据
那么怎么查询特定数据呢?

select * from Information where Name='zhangshan'

在这里插入图片描述
此时查询到了Name为zhangshan的行数据
接下来把*改为ID:

select ID from Information where Name='zhangshan'

在这里插入图片描述
这时候就在Name等于zhangshan的行,查询出ID号,非常简单易懂
2,插入数据
执行下面查询语句:

insert  into Information (ID,Name,Math,English,Chinese) values (1006,'test',36,60,80)

也非常容易理解,
在这里插入图片描述
查看表中的数据:

select * from Information

发现已经多了一条数据
在这里插入图片描述
这只是一些基本的sql语句,还有更多复杂的语句,可以在下面链接学习:
http://www.w3school.com.cn/sql/index.asp
三,数据库操作模型
上面我们那样操作可以看得出效率非常低下,在实际操作中可以使用不同编程语言,去执行sql语言,操作数据库:
在c++中使用ODBC操作数据库,即ODBC相当于桥梁,搭建数据库与c++语言之间的关系:
在这里插入图片描述
四,配置ODBC
①、在控制面板找到“管理工具”——“数据源(ODBC)”。如图:
在这里插入图片描述

②、在“ODBC数据库管理器”窗口中,选择“用户DSN”,点击“添加”按钮,选择“SQL Server”,这是会出现创建SQL Server的新数据源的对话框,以“IEC”为名建立名称,选择SQL登陆的服务器:“SQLSERVER”,再点击下一步,选择登陆方式:“使用用户输入登陆ID和密码的SQL Server验证”,,用户名:sa, 密码:12345678。点击“下一步”。

在这里插入图片描述
在这里插入图片描述

记好这个创建的名称IEC
③、选择数据库“StudentDB”,然后点“下一步”、“完成”,再点“测试数据源”。最后显示测试成功。

在这里插入图片描述

在这里插入图片描述
第二步:建立数据库的表和添加数据。

五,c++配置链接数据库

#include<stdio.h> 
#include<windows.h> 
#include<sql.h> 
#include<sqlext.h> 
#include<sqltypes.h> 

下面是SQl操作一些常用的操作:

SQLINTEGER   定义一个整型变量,相当于C语言中的int。
SQLCHAR      定义一个字符变量,相当于C语言中的char。
ret=SQLConnect(hdbc,(SQLCHAR*)"IEC",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"12345678",SQL_NTS);//连接数据库,IEC是刚才建立的odbc的数据源,sa是用户名,12345678是密码。

具体代码如下:

#include<stdio.h> 
#include<windows.h> 
#include<sql.h> 
#include<sqlext.h> 
#include<sqltypes.h> 
#include<string.h>
#define MAXSTRSIZE 1024

SQLINTEGER age;   //定义一个整型的数据库操作变量age
SQLCHAR xh[12],xm[20],sex[4],dept[50];    //定义char类型得三个数值
SQLINTEGER len_xh,len_xm,len_sex,len_age,len_dept; //定义5个nt型变量
void fuzhi()    //自定义函数
{
	int i;
    SQLRETURN ret;      //定义一个sqlreturn型的变量ret,用来接收执行sql查询语句返回的数据
    SQLHENV henv;//SQLHANDLE henv   定义SQLHEnv变量  固定语句,不要问为什么 记好
    SQLHDBC hdbc;//SQLHANDLE hdbc 固定语句,不要问为什么 记好
    SQLHSTMT hstmt;//SQLHANDLE hstmt 固定语句,不要问为什么 记好
 ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);//申请环境句柄 固定语句,不要问为什么 记好
 ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
	//设置环境属性 固定用法 不要问为什么
	  ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//申请数据库连接句柄 
ret=SQLConnect(hdbc,(SQLCHAR*)"IEC",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"12345678",SQL_NTS);
	//连接数据库 第一个IEC为创建的ODBC名称 第三个为用户名 第五个填入密码
if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){ 
    ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);//申请SQL语句句柄 
//当数据库连接正常时 申请SQL语句句柄,为后期执行sql查询做准备
  SQLCHAR sql[]="SELECT * FROM Student";   //写一个查询语句 存入字符数组内
    ret=SQLExecDirect(hstmt,sql,SQL_NTS);//直接执行SQL语句 并且将返回值存入ret中 ret中存储是否查询成功的信息  hstmt中存储查询到的数据
      if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){   //判断ret的返回内容是否正确,正确表示查询成功,进入if语句
    
	i=0;       
    while(SQLFetch(hstmt)!=SQL_NO_DATA){//遍历结果集   对hstmt的数据进行遍历
    /*************************数据库整型赋值***************/
        SQLGetData(hstmt,1,SQL_C_CHAR,xh,12,&len_xh);
        /*****************************************************/
        SQLGetData(hstmt,2,SQL_C_CHAR,xm,20,&len_xm);
        SQLGetData(hstmt,3,SQL_C_CHAR,sex,4,&len_sex);
        SQLGetData(hstmt,4,SQL_C_ULONG,&age,0,&len_age);
        SQLGetData(hstmt,5,SQL_C_CHAR,dept,50,&len_dept);
        printf("%s %s %s %d %s\n",xh,xm,sex,age,dept);
    } 
SQLSMALLINT num_column;   //定义短整型变量
    ret=SQLNumResultCols(hstmt,&num_column);//查询结果集列数 并将查询到的列数数据数存入 num_column变量中
    if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO) 
    printf("结果集共有%d列。\n",num_column); 
    else printf("查询结果集列数失败!\n"); 
    SQLINTEGER num_row;     //整型变量 
    ret=SQLRowCount(hstmt,&num_row);//查询被影响的行数 
    if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO) 
    printf("结果集共有%d行记录。\n",num_row); 
    else printf("查询结果集记录个数失败!\n"); 
 
    SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//释放语句句柄 
    }else printf("查询数据库操作失败!\n"); 
  SQLDisconnect(hdbc);//断开与数据库的连接 
    } 
    else printf("连接数据库失败!\n");    
    SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//释放连接句柄 
    SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄
}
int main(){   //主函数,在主函数中调用上面的函数
	fuzhi();
	return 0; 
}

    
  

结果如下

在这里插入图片描述
基本的功能就在上面了,其中有很多都是固定的用法,也不要问为什么,因为这是人为规定的,开始学习可能会感觉生疏,多多练习,
上面的功能主要就是查询数据库中的数据,及获得结果集的行数和列数

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值