使用C编程操作MSSQL数据库

介绍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 数据库。

数据库标签