C语言如何读取MSSQL数据库

介绍

在计算机领域中,C语言是一种历史悠久且广泛应用的编程语言。而MSSQL数据库则是较为常用的一种数据库之一,所以在一些需要与数据库交互的程序中,用C语言读取MSSQL数据库就非常有必要了。

本文将详细介绍如何在C语言中读取MSSQL数据库,同时也会给出一些常用的MSSQL查询语句的示例。读者可以根据自己的需要和实际情况作出相应的修改。

1. 准备工作

1.1 安装MSSQL ODBC驱动程序

在使用C语言读取MSSQL数据库之前,需要先安装MSSQL ODBC驱动程序。这个驱动程序可以帮助C语言程序连接MSSQL数据库,然后读取和修改其中的数据。

用户可以在Microsoft官网上下载SQL Server ODBC驱动程序。如果用户使用的是Linux操作系统,那么可以使用unixODBC驱动程序。

1.2 配置ODBC数据源

在使用MSSQL ODBC驱动程序之前,还需要先配置ODBC数据源。这个数据源可以帮助C语言程序找到MSSQL数据库,并连接上它。

下面是一个ODBC数据源配置的示例:

[ODBC Data Sources]

TestDB=SQL Server

[TestDB]

Driver=/usr/local/lib/libtdsodbc.so

Description=TestDB

Trace=Yes

Server=192.168.1.100

Database=TestDB

Port=1433

TDS_Version=7.0

其中,Driver选项是ODBC驱动程序的路径;Server选项是MSSQL服务器的地址;Database选项是MSSQL数据库的名称;Port选项是MSSQL服务器的端口号;TDS_Version选项是TDS协议的版本号。

2. 连接MSSQL数据库

在配置好ODBC数据源后,C语言程序就可以连接MSSQL数据库了。下面是示例代码:

#include <stdio.h>

#include <windows.h>

#include <sql.h>

#include <sqlext.h>

int main(void)

{

//定义数据库连接句柄和语句句柄

SQLHDBC hdbc;

SQLHSTMT hstmt;

//定义一个SQLCHAR型数组,用于保存ODBC数据源的名称

SQLCHAR szDSN[] = "TestDB";

//定义一个SQLRETURN型变量,用于获取ODBC API的返回值

SQLRETURN retcode;

//连接ODBC数据库

retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);

retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

retcode = SQLConnect(hdbc, szDSN, SQL_NTS, "username", SQL_NTS, "password", SQL_NTS);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)

{

printf("Connect database success!\n");

//释放连接资源

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, henv);

}

else

{

printf("Connect database failed!\n");

}

return 0;

}

这段程序主要是通过ODBC API来连接MSSQL数据库。如果连接成功,就会在命令行中输出"Connect database success!"。如果连接失败,则会输出"Connect database failed!"。

3. 查询数据

连接上数据库后,就可以读取其中的数据了。下面是一个实现在MSSQL数据库中查询数据的示例程序:

#include <stdio.h>

#include <windows.h>

#include <sql.h>

#include <sqlext.h>

int main(void)

{

//定义数据库连接句柄和语句句柄

SQLHDBC hdbc;

SQLHSTMT hstmt;

//定义一个SQLCHAR型数组,用于保存ODBC数据源的名称

SQLCHAR szDSN[] = "TestDB";

//定义一个SQLRETURN型变量,用于获取ODBC API的返回值

SQLRETURN retcode;

//连接ODBC数据库

retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);

retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

retcode = SQLConnect(hdbc, szDSN, SQL_NTS, "username", SQL_NTS, "password", SQL_NTS);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)

{

printf("Connect database success!\n");

//定义一个SQLCHAR型数组,用于保存查询语句

SQLCHAR szSql[] = "SELECT name, age, gender FROM student";

//用SQLAllocHandle函数创建语句句柄

SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

//用SQLExecDirect函数执行查询语句

SQLExecDirect(hstmt, szSql, SQL_NTS);

//用SQLBindCol函数绑定查询结果的变量

char szName[32];

int nAge;

char szGender[10];

SQLBindCol(hstmt, 1, SQL_CHAR, szName, sizeof(szName), NULL);

SQLBindCol(hstmt, 2, SQL_INTEGER, &nAge, 0, NULL);

SQLBindCol(hstmt, 3, SQL_CHAR, szGender, sizeof(szGender), NULL);

//用SQLFetch函数列出所有查询结果

while (SQLFetch(hstmt) == SQL_SUCCESS)

{

printf("Name: %s, Age: %d, Gender: %s\n", szName, nAge, szGender);

}

//释放语句句柄

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

//释放连接资源

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, henv);

}

else

{

printf("Connect database failed!\n");

}

return 0;

}

这段程序主要是利用ODBC API执行查询SQL语句,并将结果打印出来。程序中使用了SQLAllocHandle函数来创建语句句柄,SQLExecDirect函数来执行查询语句,SQLBindCol函数来绑定查询结果的变量,SQLFetch函数来列出所有查询结果。

4. 更新和插入数据

在读取MSSQL数据库之后,有时还需要对其中的数据进行更新或插入。下面是一段用于在MSSQL数据库中插入数据的示例程序:

#include <stdio.h>

#include <windows.h>

#include <sql.h>

#include <sqlext.h>

int main(void)

{

//定义数据库连接句柄和语句句柄

SQLHDBC hdbc;

SQLHSTMT hstmt;

//定义一个SQLCHAR型数组,用于保存ODBC数据源的名称

SQLCHAR szDSN[] = "TestDB";

//定义一个SQLRETURN型变量,用于获取ODBC API的返回值

SQLRETURN retcode;

//连接ODBC数据库

retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);

retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

retcode = SQLConnect(hdbc, szDSN, SQL_NTS, "username", SQL_NTS, "password", SQL_NTS);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)

{

printf("Connect database success!\n");

//定义一个SQLCHAR型数组,用于保存插入语句

SQLCHAR szSql[] = "INSERT INTO student (name, age, gender) VALUES ('Zhang San', 20, 'Male')";

//用SQLAllocHandle函数创建语句句柄

SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

//用SQLExecDirect函数执行插入语句

SQLExecDirect(hstmt, szSql, SQL_NTS);

//释放语句句柄

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

//释放连接资源

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, henv);

}

else

{

printf("Connect database failed!\n");

}

return 0;

}

这段程序通过ODBC API执行插入SQL语句,将一条新的学生记录插入到MSSQL数据库中。

5. 删除数据

在读取MSSQL数据库之后,有时还需要删除其中的某些数据。下面是一段用于在MSSQL数据库中删除数据的示例程序:

#include <stdio.h>

#include <windows.h>

#include <sql.h>

#include <sqlext.h>

int main(void)

{

//定义数据库连接句柄和语句句柄

SQLHDBC hdbc;

SQLHSTMT hstmt;

//定义一个SQLCHAR型数组,用于保存ODBC数据源的名称

SQLCHAR szDSN[] = "TestDB";

//定义一个SQLRETURN型变量,用于获取ODBC API的返回值

SQLRETURN retcode;

//连接ODBC数据库

retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);

retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

retcode = SQLConnect(hdbc, szDSN, SQL_NTS, "username", SQL_NTS, "password", SQL_NTS);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)

{

printf("Connect database success!\n");

//定义一个SQLCHAR型数组,用于保存删除语句

SQLCHAR szSql[] = "DELETE FROM student WHERE name='Zhang San'";

//用SQLAllocHandle函数创建语句句柄

SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

//用SQLExecDirect函数执行删除语句

SQLExecDirect(hstmt, szSql, SQL_NTS);

//释放语句句柄

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

//释放连接资源

SQLDisconnect(hdbc);

SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

SQLFreeHandle(SQL_HANDLE_ENV, henv);

}

else

{

printf("Connect database failed!\n");

}

return 0;

}

这段程序通过ODBC API执行删除SQL语句,删除名为"Zhang San"的学生记录。

结论

本文详细介绍了如何在C语言中读取和修改MSSQL数据库。MSSQL数据库是非常流行的数据库之一,比如一些企业级系统中会采用这种数据库。此外,本文中也给出了一些常用的SQL语句的示例,供大家参考。读者可以根据自己的需要和实际情况作出相应的修改,以适应不同的应用场景。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

数据库标签