用C语言连接MSSQL:一步一步学习

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数据库是一项非常重要的技能,在实际开发中十分常见。

数据库标签