关于ODBC的一些内容

ODBC 是“开放数据库互联”的简称  英文全称Open Database Connectivity。  

odbc是微软公司开放服务结构中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API。这些API利用SQL来完成大部分任务。

ODBC的优点


这里有一个很好的ODBC API博客 http://www.cnblogs.com/kzloser/archive/2012/11/29/2794815.html 大家可以看一下


ODBC连接数据库的方法一般分为几个步骤

1. 申请环境句柄

2. 设置环境句柄

3. 申请连接句柄

4. 连接数据源

5. 设置连接属性

以上是几个连接的步骤

#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include <sqlext.h>
#include <sql.h>
#include <iostream>


SQLHENV hEnv; // 声明环境句柄
SQLHDBC hDbc; // 声明连接句柄
SQLHSTMT hStmt; // 声明语句句柄


int main()
{
// 申请环境句柄
SQLRETURN ret;
/*
SQLAllocHandle 功能是分配需要的句柄
函数原型是:
SQLAllocHandle(SQLSMALLINT HandleType,
SQLHANDLE InputHandle,
SQLHANDLE *OutputHandlePtr);
@HandleType:  定义通过该接口要分配的句柄类型,取值可能有四个
SQL_HANDLE_ENV:  定义分配环境句柄
SQL_HANDLE_DBC:  定义分配连接句柄
SQL_HANDLE_STMT: 定义分配语句句柄
SQL_HANDLE_DESC: 这个暂时不知道什么意思, 但根据字面意思应该是描述句柄吧
@InputHandle:  它定义分配新句柄时使用的上下文句柄,它的取值有对应关系的
如果HandleType值为SQL_HANDLE_DBC, 则应该取值为SQL_HANDLE_ENV
如果HandleType值为SQL_HANDLE_STMT,则参数取SQL_HANDLE_DBC
如果HandleType值为SQL_HANDLE_DESC,则参数取SQL_HANDLE_DBC
@OutputHandlePtr: 存储分配的句柄
返回值的类型是SQLRETURN
既一个数字 既一个枚举  SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_INVALID_HANDLE, SQL_ERROR
意思也就是字面的意思了
*/
ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &hEnv);
if (ret != SQL_SUCCESS ) return SQL_ERROR;




/*
设置环境句柄
函数原型:
SQLRETURN SQLSetEnvAttr( SQOHENV EnvironmentHandle,
SQLINTEGER Attribute,
SQLPOINTER ValuePtr,
SQLINTEGER StringLength );
@EnvironmentHandle 输入参数,指定获得环境属性的环境句柄
@Attribute 输入参数, 制定要获得的环境属性
@ValuePtr 输入参数, 指定要设置的环境属性值
@StringLength 输入参数,指定ValuePtr指向字符串或二进制缓冲区的数据的长度,如果ValuePtr指向其他数据类型,则忽略此参数


*/
// 设置环境句柄
ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC2, SQL_IS_INTEGER);
if (ret != SQL_SUCCESS) return SQL_ERROR;


// 申请连接句柄
ret = SQLAllocHandle( SQL_HANDLE_DBC, hEnv, &hDbc );
if (ret != SQL_SUCCESS) return  SQL_ERROR;


// 连接数据源
/*
函数原型为
SQLRETURN SQLDriverConnect( SQLHDBC ConnectionHandle,
SQLHWND WindowHandle,
SQLCHAR* InConnectionString ,
SQLSMALLINT StringLength1,
SQLCHAR* OutConnectionString,
SQLSMALLINT BufferLength,
SQLSMALLINT* StringLength2Ptr,
SQLUSMALLINT DriverCompletion ); 
@ConnectionHandle输入参数,指定建立连接的连接句柄
@WindowHandle 输入参数,指定建立数据连接的父窗口句柄
@InConnectionString输入参数,指定了连接字符串,该字符串可以为完全连接串,部分连接串或空字符串
@StringLength1输入参数,指定InConnectionString指向的缓冲区的字节长度
@OutConnectionString输出参数,返回存放字符串的缓冲区的指针
@BufferLength 输入参数指定了OutConnectionString指向的缓冲区的字节长度
@StringLength2Ptr输出参数,返回指向OutConnectionString缓冲区实际的长度
@DriverCompletion输入参数,指定函数执行的标志
•SQL_DRIVER_PROMPT 如果连接字符串未包括 Driver,DSN,FileDSN 关键字,系统会自动弹出 Data Source 窗口
•SQL_DRIVER_COMPLETE 和 SQL_DRIVER_COMPLETE_REQUIRED 如果指定数据源,则应用程序使用此数据源,否则,系统弹出 Data Source 窗口
•SQL_DRIVER_NOPROMPT使用指定的数据源,不弹出Data Source窗口 


*/
char ConnStr[200] = { 0 };
char szBuffer[1024] = { 0 };
char * pservername = "localhost";
char * pdbname = "mcftest";
char * pId = "root";
char * pPassword = "123456";
SWORD swStrLen;
sprintf(ConnStr, "DRIVER={MySQL ODBC 5.1 Driver};SERVER=%s;PORT=3306;UID=%s;PWD=%s;DATABASE=%s", pservername, pId, pPassword, pdbname);
ret = SQLDriverConnect(hDbc, NULL, (SQLCHAR*)ConnStr, (SQLSMALLINT)strlen(ConnStr),
(SQLCHAR *)szBuffer, (SQLSMALLINT)strlen(szBuffer), &swStrLen, SQL_DRIVER_COMPLETE_REQUIRED);
if (ret != SQL_SUCCESS) return SQL_ERROR;
// 上面的语句如果没有执行成功的话 你先查一下自己的电脑是否安装了mysql odbc的驱动 如果没有就去安装一个。
// 在百度上搜索  odbc驱动mysql-connector-odbc-5.1.1-win32.msi  你下载的什么版本的  就填什么版本的


// 连接成功  创建语句句柄
ret = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
if (ret != SQL_SUCCESS) return SQL_ERROR;


// 插入多个数据  插入成功
for (int i = 0; i < 100; ++i )
{
char szstr[200] = { 0 };
sprintf(szstr, "insert into mcfbiao(id) values (%d)", i);
ret = SQLExecDirectA(hStmt, (SQLCHAR*)szstr, SQL_NTS);

}

// 开始查找数据
ret = SQLExecDirect(hStmt, (SQLCHAR*)"select * from mcfbiao", SQL_NTS);
if (ret != SQL_SUCCESS) return SQL_ERROR;
// 查询之后获得数据,  这些数据都存在某一个表里面, 具体在哪我暂时也不知道就当做是存在一块内存里吧
short a = 0;
ret = SQLNumResultCols(hStmt, &a );
if (ret != SQL_SUCCESS) return SQL_ERROR;



/*
服务器游标检索特定行
函数原型
SQLRETURN SQLFetch(SQLHSTMT StatementHandle); 
StatementHandleSTMT句柄
在调用SQLExecDirect执行sql语句后, 你需要遍历结果集来的到数据,StatementHandle是STMT句柄,此句柄必须是被执行过
当调用SQLFetch函数后,光标会被移动到下一条记录处,当光标移动到记录集的最后一条,函数将返回SQL_NO_DAT
*/
// 指定游标
SQLFetch(hStmt);


int nData;
// 获得数据
/*
函数原型是
SQLRETURN SQLGetData(      SQLHSTMT     StatementHandle,
SQLUSMALLINT     ColumnNumber,
SQLSMALLINT     TargetType,
SQLPOINTER     TargetValuePtr,
SQLINTEGER     BufferLength,
SQLINTEGER *     StrLen_or_IndPtr );
@StatementHandleSTMT句柄
@ClumnNumber 列号,以1开始
@TargetType 数据缓冲区的C语言数据类型
@TargetValuePtr获得此列数据的数据存放的地址
@BufferLength 数据缓冲区(TargetValuePtr)的长度
@StrLen_or_indPtr返回当前得到的字段的字节长度
*/
ret = SQLGetData(hStmt, 1, SQL_INTEGER, &nData, 8, 0);
if (ret != SQL_SUCCESS) return SQL_ERROR;


getchar();


return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值