ODBC 是“开放数据库互联”的简称 英文全称Open Database Connectivity。
odbc是微软公司开放服务结构中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API。这些API利用SQL来完成大部分任务。
ODBC的优点
这里有一个很好的ODBC API博客 大家可以看一下
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;
}