1. 简介
在开发中,有时需要连接数据库来存储和读取数据。MSSQL是一个关系型数据库管理系统,可以使用多种编程语言来连接它。在本文中,我们将使用C语言连接MSSQL数据库,实现数据的读取和写入,通过一步步的演示让您了解连接MSSQL数据库的整个流程。
2. 准备工作
在开始连接MSSQL数据库之前,需要安装ODBC驱动程序。ODBC是Microsoft提供的一种为各种数据库提供统一的接口的标准。在Windows操作系统中,ODBC驱动程序是自带的,所以我们只需要安装MSSQL的ODBC驱动程序即可。
在安装完ODBC驱动程序之后,我们需要创建MSSQL数据库和表。这里我们以创建名为“test”的数据库,表名为“userinfo”的表为例:
CREATE DATABASE test;
USE test;
CREATE TABLE userinfo
(
id INT PRIMARY KEY NOT NULL,
name CHAR(50) NOT NULL,
age INT NOT NULL
);
3. 连接MSSQL数据库
3.1 引入头文件
我们需要引入头文件“sql.h”和“sqlext.h”,它们用于连接MSSQL数据库。
#include <sql.h>
#include <sqlext.h>
3.2 定义数据源和连接对象
定义数据源和连接对象是连接MSSQL数据库的第一步。
SQLHENV henv;
SQLHDBC hdbc;
henv:是一个环境句柄,用于连接MSSQL数据库。
hdbc:是一个连接句柄,用于执行MSSQL数据库操作。
3.3 连接数据库
连接数据库的过程通过以下四个步骤完成:
1.分配环境句柄
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
2.设置环境属性
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
3.分配连接句柄
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
4.连接数据库
SQLRETURN ret;
ret = SQLConnect(hdbc, (SQLTCHAR*) "test", SQL_NTS, (SQLTCHAR*) "username", SQL_NTS, (SQLTCHAR*) "password", SQL_NTS);
其中,“test”是数据库名称,“username”和“password”是连接数据库的用户名和密码。
4. 数据库操作
4.1 插入数据
以下是向表“userinfo”中插入数据的代码:
SQLHSTMT hstmt;
char* strSql = "INSERT INTO userinfo VALUES (?, ?, ?)";
SQLRETURN ret;
ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (ret == SQL_SUCCESS && hstmt)
{
int id = 1;
char* name = "张三";
int age = 20;
SQLINTEGER cbId = sizeof(SQLINTEGER);
SQLINTEGER cbName = strlen(name);
SQLINTEGER cbAge = sizeof(SQLINTEGER);
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 0, &cbId);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, cbName, 0, name, 0, &cbName);
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &age, 0, &cbAge);
ret = SQLExecDirect(hstmt, (SQLTCHAR*)strSql, SQL_NTS);
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
{
printf_s("Insert Success!\n");
}
else
{
printf_s("Insert Error!\n");
}
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
1.创建语句句柄
语句句柄用于执行SQL语句,需要通过“SQLAllocHandle”函数创建:
SQLHSTMT hstmt;
SQLRETURN ret;
ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
2.绑定参数
通过“SQLBindParameter”函数绑定SQL语句中的参数:
SQLINTEGER cbId = sizeof(SQLINTEGER);
SQLINTEGER cbName = strlen(name);
SQLINTEGER cbAge = sizeof(SQLINTEGER);
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 0, &cbId);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, cbName, 0, name, 0, &cbName);
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &age, 0, &cbAge);
3.执行SQL语句
通过“SQLExecDirect”函数执行SQL语句:
ret = SQLExecDirect(hstmt, (SQLTCHAR*)strSql, SQL_NTS);
执行成功后将在控制台输出“Insert Success!”。
4.2 查询数据
以下是从表“userinfo”中查询数据的代码:
SQLHSTMT hstmt;
SQLRETURN ret;
char* strSql = "SELECT * FROM userinfo";
ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (ret == SQL_SUCCESS && hstmt)
{
ret = SQLExecDirect(hstmt, (SQLTCHAR*)strSql, SQL_NTS);
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
{
SQLINTEGER id;
SQLCHAR name[50];
SQLINTEGER age;
SQLINTEGER cbId = sizeof(SQLINTEGER);
SQLINTEGER cbName = sizeof(name);
SQLINTEGER cbAge = sizeof(SQLINTEGER);
ret = SQLBindCol(hstmt, 1, SQL_C_LONG, &id, sizeof(id), &cbId);
ret = SQLBindCol(hstmt, 2, SQL_C_CHAR, name, sizeof(name), &cbName);
ret = SQLBindCol(hstmt, 3, SQL_C_LONG, &age, sizeof(age), &cbAge);
while ((ret = SQLFetch(hstmt)) == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
{
printf_s("%d %s %d\n", id, name, age);
}
}
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
1.绑定列
通过“SQLBindCol”函数绑定SQL语句中查询的列,这里我们查询的是表中所有的列:
SQLINTEGER id;
SQLCHAR name[50];
SQLINTEGER age;
SQLINTEGER cbId = sizeof(SQLINTEGER);
SQLINTEGER cbName = sizeof(name);
SQLINTEGER cbAge = sizeof(SQLINTEGER);
ret = SQLBindCol(hstmt, 1, SQL_C_LONG, &id, sizeof(id), &cbId);
ret = SQLBindCol(hstmt, 2, SQL_C_CHAR, name, sizeof(name), &cbName);
ret = SQLBindCol(hstmt, 3, SQL_C_LONG, &age, sizeof(age), &cbAge);
2.执行SQL语句
通过“SQLExecDirect”函数执行SQL语句:
ret = SQLExecDirect(hstmt, (SQLTCHAR*)strSql, SQL_NTS);
3.获取查询结果
通过“SQLFetch”函数获取查询结果:
while ((ret = SQLFetch(hstmt)) == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
{
printf_s("%d %s %d\n", id, name, age);
}
执行成功后将在控制台输出表中所有的数据。
4.3 关闭数据库连接
在结束程序之前需要关闭数据库连接:
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
其中,“SQLDisconnect”函数用于关闭数据库连接,“SQLFreeHandle”函数用于释放句柄。
5. 总结
本文中我们介绍了如何用C语言连接MSSQL数据库,通过创建数据源和连接对象、执行SQL语句等步骤实现了数据的插入和查询。使用C语言连接MSSQL数据库是一项非常重要的技能,在实际开发中十分常见。