介绍
在计算机领域中,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语句的示例,供大家参考。读者可以根据自己的需要和实际情况作出相应的修改,以适应不同的应用场景。