介绍MSSQL数据库
Microsoft SQL Server,简称 MSSQL,是由 Microsoft 计算机公司推出的一款关系型数据库管理系统,用于存储、处理和管理数据,可广泛应用于数据分析、企业级应用和 Web 应用等领域。
连接MSSQL数据库
安装ODBC Driver for SQL Server
在连接 MSSQL 数据库之前,需要先安装 ODBC Driver for SQL Server,它是用于客户端连接 MSSQL 数据库的驱动程序。可以从 Microsoft 下载中心下载并安装它。
下载链接:https://docs.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server
使用C程序连接MSSQL数据库
C 程序连接 MSSQL 数据库的基本步骤如下:
包含 Microsoft ODBC API 头文件 <sql.h> 和 <sqlext.h>。
使用 SQLAllocHandle 函数分配连接句柄和语句句柄。
使用 SQLConnect 函数连接数据库。
使用 SQLExecDirect 函数执行 SQL 语句。
使用 SQLFetch 函数获取查询结果。
使用 SQLDisconnect 函数断开与数据库的连接。
使用 SQLFreeHandle 函数释放句柄。
示例程序
下面是一个简单的 C 程序示例,展示了如何连接 MSSQL 数据库并查询数据。
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#define SQL_RESULT_LEN 240
#define SQL_STATEMENT_LEN 1000
int main(void){
SQLHENV henv = NULL;
SQLHDBC hdbc = NULL;
SQLHSTMT hstmt = NULL;
SQLRETURN retcode;
SQLCHAR sqlStatement[SQL_STATEMENT_LEN];
SQLCHAR sqlResult[SQL_RESULT_LEN];
SQLSMALLINT sqlResultLen;
// 分配环境句柄
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error allocating SQL environment handle\n");
return 1;
}
// 设置环境句柄属性
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error setting SQL environment attribute\n");
return 1;
}
// 分配连接句柄
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error allocating SQL connection handle\n");
return 1;
}
// 连接数据库
SQLCHAR* dsnName = "myDSN";
SQLCHAR* userId = "myUser";
SQLCHAR* password = "myPassword";
retcode = SQLConnect(hdbc, (SQLCHAR*)dsnName, SQL_NTS, (SQLCHAR*)userId, SQL_NTS, (SQLCHAR*)password, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error connecting to the database\n");
return 1;
}
// 分配语句句柄
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error allocating SQL statement handle\n");
return 1;
}
// 执行 SQL 语句
SQLCHAR* sql = "SELECT * FROM myTable";
retcode = SQLExecDirect(hstmt, (SQLCHAR*)sql, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error executing SQL statement\n");
return 1;
}
// 获取查询结果
while (SQLFetch(hstmt) == SQL_SUCCESS) {
SQLGetData(hstmt, 1, SQL_C_CHAR, sqlResult, SQL_RESULT_LEN, &sqlResultLen);
printf("%s\n", sqlResult);
}
// 断开与数据库的连接
SQLDisconnect(hdbc);
// 释放句柄
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
操作MSSQL数据库
查询数据
查询 MSSQL 数据库的基本步骤如下:
使用 SQLPrepare 函数准备 SQL 语句。
使用 SQLBindParameter 函数绑定参数(如果有参数)。
使用 SQLExecute 函数执行 SQL 语句。
使用 SQLBindCol 函数绑定结果(如果有结果)。
使用 SQLFetch 函数获取查询结果。
使用 SQLCloseCursor 函数关闭游标。
示例代码
下面是一个简单的 C 程序示例,展示了如何查询 MSSQL 数据库并输出结果。
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#define SQL_RESULT_LEN 240
#define SQL_STATEMENT_LEN 1000
int main(void){
SQLHENV henv = NULL;
SQLHDBC hdbc = NULL;
SQLHSTMT hstmt = NULL;
SQLRETURN retcode;
SQLCHAR sqlStatement[SQL_STATEMENT_LEN];
SQLCHAR sqlResult[SQL_RESULT_LEN];
SQLSMALLINT sqlResultLen;
// 分配环境句柄
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error allocating SQL environment handle\n");
return 1;
}
// 设置环境句柄属性
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error setting SQL environment attribute\n");
return 1;
}
// 分配连接句柄
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error allocating SQL connection handle\n");
return 1;
}
// 连接数据库
SQLCHAR* dsnName = "myDSN";
SQLCHAR* userId = "myUser";
SQLCHAR* password = "myPassword";
retcode = SQLConnect(hdbc, (SQLCHAR*)dsnName, SQL_NTS, (SQLCHAR*)userId, SQL_NTS, (SQLCHAR*)password, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error connecting to the database\n");
return 1;
}
// 分配语句句柄
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error allocating SQL statement handle\n");
return 1;
}
// 准备 SQL 语句
SQLCHAR* sql = "SELECT * FROM myTable WHERE id = ?";
SQLLEN id = 1;
retcode = SQLPrepare(hstmt, (SQLCHAR*)sql, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error preparing SQL statement\n");
return 1;
}
// 绑定参数
retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 0, NULL);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error binding parameter\n");
return 1;
}
// 执行 SQL 语句
retcode = SQLExecute(hstmt);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error executing SQL statement\n");
return 1;
}
// 绑定结果
SQLBindCol(hstmt, 1, SQL_C_CHAR, sqlResult, SQL_RESULT_LEN, &sqlResultLen);
// 获取查询结果
while (SQLFetch(hstmt) == SQL_SUCCESS) {
printf("%s\n", sqlResult);
}
// 关闭游标
SQLCloseCursor(hstmt);
// 断开与数据库的连接
SQLDisconnect(hdbc);
// 释放句柄
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
插入/更新/删除数据
插入/更新/删除 MSSQL 数据库的基本步骤如下:
使用 SQLPrepare 函数准备 SQL 语句。
使用 SQLBindParameter 函数绑定参数(如果有参数)。
使用 SQLExecute 函数执行 SQL 语句。
使用 SQLRowCount 函数获取影响的行数。
使用 SQLCloseCursor 函数关闭游标。
示例代码
下面是一个简单的 C 程序示例,展示了如何插入/更新/删除 MSSQL 数据库。
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#define SQL_RESULT_LEN 240
#define SQL_STATEMENT_LEN 1000
int main(void){
SQLHENV henv = NULL;
SQLHDBC hdbc = NULL;
SQLHSTMT hstmt = NULL;
SQLRETURN retcode;
SQLCHAR sqlStatement[SQL_STATEMENT_LEN];
SQLLEN rowsAffected;
// 分配环境句柄
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error allocating SQL environment handle\n");
return 1;
}
// 设置环境句柄属性
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error setting SQL environment attribute\n");
return 1;
}
// 分配连接句柄
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error allocating SQL connection handle\n");
return 1;
}
// 连接数据库
SQLCHAR* dsnName = "myDSN";
SQLCHAR* userId = "myUser";
SQLCHAR* password = "myPassword";
retcode = SQLConnect(hdbc, (SQLCHAR*)dsnName, SQL_NTS, (SQLCHAR*)userId, SQL_NTS, (SQLCHAR*)password, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error connecting to the database\n");
return 1;
}
// 分配语句句柄
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error allocating SQL statement handle\n");
return 1;
}
// 准备 SQL 语句
SQLCHAR* sql = "INSERT INTO myTable VALUES(?, ?)";
SQLLEN id = 1;
SQLCHAR* name = "test";
retcode = SQLPrepare(hstmt, (SQLCHAR*)sql, SQL_NTS);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error preparing SQL statement\n");
return 1;
}
// 绑定参数
retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &id, 0, NULL);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error binding parameter\n");
return 1;
}
retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0, name, 0, NULL);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error binding parameter\n");
return 1;
}
// 执行 SQL 语句
retcode = SQLExecute(hstmt);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
printf("Error executing SQL statement\n");
return 1;
}
// 获取影响的行数
SQLRowCount(hstmt, &rowsAffected);
printf("%ld rows affected\n", rowsAffected);
// 关闭游标
SQLCloseCursor(hstmt);
// 断开与数据库的连接
SQLDisconnect(hdbc);
// 释放句柄
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
总结
本文介绍了如何使用 C 程序操作 MSSQL 数据库。您可以使用示例代码作为模板,根据自己的需要进行修改和开发。注意安装 ODBC Driver for SQL Server,并正确配置 DSN,才能成功连接 MSSQL 数据库。