介绍
在我们开发中,数据库作为存储数据的基础设施,其重要性及不可替代性可谓是体现无余。而在选择数据库的过程中,传统的关系型数据库(SQLServer、MySQL、Oracle等)应用非常广泛,而对于其与程序代码之间的通信,我们都会使用一种技术,该技术即为ORM(对象关系映射)。ORM作为一种框架,是帮助我们把关系型数据库的数据映射成对象的一种工具,由此,我们就不用直接与数据库打交道了。这篇文章主要是介绍如何利用C来优雅的调用SQLServer
环境设置
1. 安装SQLServer
要使用SQLServer,首先需要在本地的电脑上安装它。下面是安装过程:
下载SQLServer,并启动安装文件
根据提示进行设置,并按照最终指示完成安装
//检查SQLServer是否正确安装
SELECT @@VERSION
当您看到版本信息后,证明已经成功安装SQLServer。
2. 安装ODBC驱动
接下来,安装ODBC驱动,这是和SQLServer的交互的桥梁:
下载ODBC驱动,我下载的是ODBC驱动 for SQLServer,官网链接https://docs.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver15
启动安装文件,按照提示进行设置,并将ODBC驱动设置为系统的环境变量
编写代码
1. 准备工作
在编写代码前,首先需要准备一下我们需要的头文件和引用库:
#include "stdafx.h"
#include
#include
#include
#include
#pragma comment(lib,"odbc32.lib") //odbc驱动库
2. 连接数据库
连接数据库的过程如下:
// 创建一个 SQL 连接句柄
SQLHENV hEnv;
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
SQLHDBC hDbc;
SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
// 连接字符串
// 新建“初始目录”为master,或者其他config为连接的数据库初始目录
const std::string CONNECT_STRING = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=test;UID=sa;PWD=123456;";
// 连接数据库,指定错误处理函数
ret = SQLDriverConnectA(hDbc, NULL, (SQLCHAR*)CONNECT_STRING.c_str(), SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);
// 检查连接是否成功
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
{
std::cout << "连接成功!" << std::endl;
}
else
{
std::cout << "连接失败!" << std::endl;
}
3. 执行SQL语句
接下来,我们可以开始执行 SQL 语句。SQL 语句的执行过程如下:
// 创建一个 SQL 语句句柄
SQLHSTMT hStmt;
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
// 绑定 SQL 语句
const std::string SQL = "SELECT * FROM testtable WHERE id = ?";
SQLINTEGER param = 2;
SQLBindParameter(hStmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 5, 0, ¶m, 0, NULL);
// 执行 SQL 语句
ret = SQLExecDirectA(hStmt, (SQLCHAR*)SQL.c_str(), SQL_NTS);
// 显示查询结果
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
{
int id, age, salary;
char name[20];
while (SQLFetch(hStmt) == SQL_SUCCESS)
{
SQLGetData(hStmt, 1, SQL_C_SLONG, &id, 0, NULL);
SQLGetData(hStmt, 2, SQL_C_CHAR, name, sizeof(name), NULL);
SQLGetData(hStmt, 3, SQL_C_SLONG, &age, 0, NULL);
SQLGetData(hStmt, 4, SQL_C_SLONG, &salary, 0, NULL);
std::cout << "ID:" << id << "\t";
std::cout << "Name:" << name << "\t";
std::cout << "Age:" << age << "\t";
std::cout << "Salary:" << salary << std::endl;
}
}
else
{
std::cout << "查询失败!" << std::endl;
}
4. 断开数据库
当数据库操作完成后,我们需要断开数据库的连接:
// 断开连接
SQLDisconnect(hDbc);
// 释放 SQL 连接句柄
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
总结
至此,我们完成了C程序调用SQLServer数据库的全部过程。感谢ORM这样的框架,它帮助我们把关系型数据库的数据映射成对象,从而避免了我们直接和数据库打交道的情况,更加方便了我们程序员的开发。这篇文章就到这里结束,希望对读者有所帮助。