运用C轻松调用SQLServer

介绍

在我们开发中,数据库作为存储数据的基础设施,其重要性及不可替代性可谓是体现无余。而在选择数据库的过程中,传统的关系型数据库(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这样的框架,它帮助我们把关系型数据库的数据映射成对象,从而避免了我们直接和数据库打交道的情况,更加方便了我们程序员的开发。这篇文章就到这里结束,希望对读者有所帮助。

数据库标签