C++数据库编程简介

C++数据库编程 ODBC简介

C++数据库编程 ODBC连接SQL Server数据库

C++数据库编程 ODBC插入数据

C++数据库编程 ODBC查询数据

C++数据库编程 ODBC删除数据

C++数据库编程 ODBC修改数据

C++数据库编程 ODBC连接MySQL增删改查数据

C++数据库编程 MySQL Connecttor C++简介

C++数据库编程 MySQL Connecttor C++增删改查

文章目录

  • 1. ODBC编程一般步骤
  • 2. 连接步骤
  • 3. 代码示例

1. ODBC编程一般步骤

  • 配置数据源
  • 初始化环境
  • 拼接SQL语句
  • 执行SQL语句遍历结果集
  • 释放ODBC连接

官方文档:Microsoft 开放式数据库连接 (ODBC) - SQL Server | Microsoft Docs

2. 连接步骤

  • 头文件

需要包含以下头文件

#include<Windows.h>
#include <sql.h> 
#include <sqlext.h> 
#include<sqltypes.h>
  • 分配环境句柄

连接到数据源的第一步是加载驱动程序管理器并使用 SQLAllocHandle分配环境句柄。

SQLHENV     hEnv = NULL; 
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv); 
if (SQL_SUCCESS == ret)
{
   wcout << _T("环境句柄分配成功!") << endl; 
}
else
{
   return -1;
}
  • 设置环境属性

应用程序通过使用 SQL_ATTR_APP_ODBC_VER环境属性调用SQLSetEnVAttr:注册其符合的ODBC版本。

ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, 	(SQLPOINTER)SQL_OV_ODBC3, 0);
  • 分配连接句柄

应用程序可以连接到数据源或驱动程序之前,它必须分配一个连接句柄。

SQLHDBC     hDbc = NULL;
ret = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
  • 连接数据库

分配环境和连接句柄并设置所有连接属性后,应用程序即可连接到数据源或驱动程序。

//根据DSN ,连接数据库
ret = SQLConnect(hDbc, (SQLTCHAR*)_T("SQLServerODBC"), SQL_NTS, (SQLTCHAR*)_T("sa"), SQL_NTS, (SQLTCHAR*)_T("Sa123"), SQL_NTS);
if ((ret == SQL_SUCCESS) || (ret == SQL_SUCCESS_WITH_INFO))
{
   wcout << _T("数据库连接成功!")<<endl;
}

SQLConnect 函数 - SQL Server | Microsoft Docs

  • 获取错误信息

SQLConnect 函数 - SQL Server | Microsoft Docs

else if (ret == SQL_ERROR)
{
   SQLTCHAR   state[128] = { 0 };
   SQLTCHAR   msg[128] = { 0 };
   //获取错误信息
   ret = SQLError(hEnv, hDbc, NULL, state, NULL, msg, sizeof(msg), NULL);
   wcout << state <<"   "<<  msg << endl;
}
  • 关闭数据库
//关闭数据库连接
ret = SQLDisconnect(hDbc);
if (ret == SQL_SUCCESS)
{
   wcout << _T("关闭数据库连接成功!") << endl;
}

//释放连接句柄
if (hDbc)
{ 
   ret = SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
}
//释放环境句柄
if (hEnv)
{
   ret = SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
}

3. 代码示例

//包含头文件
#include<Windows.h>
#include <sql.h> 
#include <sqlext.h> 
#include<sqltypes.h>
#include <tchar.h>

#include <iostream>
using namespace std;


int main()
{
   //设置为中文  
   _wsetlocale(LC_ALL, L"chs");

   SQLRETURN  ret = SQL_ERROR;


   //分配ODBC环境句柄
   SQLHENV     hEnv = NULL; 
   ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv); 
   if (SQL_SUCCESS == ret)
   {
   	wcout << _T("环境句柄分配成功!") << endl; 
   }
   else
   {
   	return -1;
   }

   //设定ODBC的版本
   ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, 	(SQLPOINTER)SQL_OV_ODBC3, 0);

   //分配数据库连接句柄
   SQLHDBC     hDbc = NULL;
   ret = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);

   //根据DSN ,连接数据库
   ret = SQLConnect(hDbc, (SQLTCHAR*)_T("SQLServerODBC"), SQL_NTS, (SQLTCHAR*)_T("sa"), SQL_NTS, (SQLTCHAR*)_T("Sa123"), SQL_NTS);
   if ((ret == SQL_SUCCESS) || (ret == SQL_SUCCESS_WITH_INFO))
   {
   	wcout << _T("数据库连接成功!")<<endl;
   }
   else if (ret == SQL_ERROR)
   {
   	SQLTCHAR   state[128] = { 0 };
   	SQLTCHAR   msg[128] = { 0 };
   	//获取错误信息
   	ret = SQLError(hEnv, hDbc, NULL, state, NULL, msg, sizeof(msg), NULL);
   	wcout << state <<"   "<<  msg << endl;
   }


   //关闭数据库连接
   ret = SQLDisconnect(hDbc);
   if (ret == SQL_SUCCESS)
   {
   	wcout << _T("关闭数据库连接成功!") << endl;
   }

   //释放连接句柄
   if (hDbc)
   { 
   	ret = SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
   }
   //释放环境句柄
   if (hEnv)
   {
   	ret = SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
   }
    
   return 0;
}

更多推荐

C++数据库编程 ODBC连接SQL Server数据库