使用C语言操作SQL Server,实现快速开发
1. SQL Server简介
SQL Server是由微软公司开发的一款基于关系型数据库管理系统的软件。它支持在Windows操作系统上运行,并提供了一种高效、安全以及可扩展的数据管理方式。SQL Server可以轻松地应对高容量数据的存储、管理和安全等应用场景。
2. C语言操作SQL Server
在C语言中,我们可以通过ODBC(Open Database Connectivity)协议来连接和操作SQL Server数据库。ODBC是一种通用的接口,它可以通过各种语言来操作多种数据库系统。在使用ODBC时,我们需要安装ODBC驱动程序,在Windows中可以安装SQL Server自带的ODBC驱动程序。
2.1 创建ODBC连接
要连接SQL Server数据库,我们需要先创建ODBC连接。下面是一个示例代码,演示如何创建ODBC连接:
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN ret;
SQLCHAR *dsn = (SQLCHAR *)"mydsn";
SQLCHAR *user = (SQLCHAR *)"myuser";
SQLCHAR *pass = (SQLCHAR *)"mypassword";
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
SQLSetConnectAttr(dbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
ret = SQLConnect(dbc, dsn, SQL_NTS, user, SQL_NTS, pass, SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
// 打印连接失败的原因
SQLCHAR sqlstate[1024];
SQLCHAR message[1024];
SQLSMALLINT message_len;
SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, sqlstate, NULL, message, sizeof(message), &message_len);
printf("ODBC Connect Error: %s %s\n", sqlstate, message);
} else {
printf("ODBC Connect Success!\n");
// 连接成功,可以执行SQL语句了
}
SQLAllocHandle函数是一个ODBC API函数,用于分配和管理ODBC的句柄。在创建ODBC连接时,需要先分配一个环境句柄(SQL_HANDLE_ENV),然后设置ODBC版本号,接着分配连接句柄(SQL_HANDLE_DBC),最后调用SQLConnect函数连接到数据库。
2.2 执行SQL语句
在成功连接到SQL Server数据库后,我们可以执行SQL语句。下面是一个示例代码,演示如何执行SQL语句并获取结果:
SQLExecDirect(stmt, (SQLCHAR *)sql, SQL_NTS);
SQLINTEGER val;
while (SQLFetch(stmt) == SQL_SUCCESS) {
SQLGetData(stmt, 1, SQL_C_LONG, &val, sizeof(val), NULL);
printf("Result = %d\n", val);
}
SQLExecDirect函数是一个ODBC API函数,用于执行SQL语句。执行成功后,可以通过SQLFetch、SQLGetData等函数获取结果。需要注意的是,在使用ODBC操作SQL Server时,必须指定SQL语句以及SQL语句的长度(可以使用SQL_NTS表示字符串以NULL结尾)。
3. 示例代码
下面是一个完整的C语言示例代码,实现了从SQL Server数据库中查询数据的功能:
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <stdio.h>
SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN ret;
SQLCHAR *dsn = (SQLCHAR *)"mydsn";
SQLCHAR *user = (SQLCHAR *)"myuser";
SQLCHAR *pass = (SQLCHAR *)"mypassword";
void print_error(SQLHANDLE handle, SQLSMALLINT type) {
SQLCHAR sqlstate[1024];
SQLCHAR message[1024];
SQLSMALLINT message_len;
SQLGetDiagRec(type, handle, 1, sqlstate, NULL, message, sizeof(message), &message_len);
printf("%s %s\n", sqlstate, message);
}
int main() {
// 分配环境句柄
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("ODBC Env Alloc Error!\n");
return -1;
}
// 设置ODBC版本号
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
// 分配连接句柄
ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("ODBC Connect Alloc Error!\n");
return -1;
}
// 设置登录超时时间
SQLSetConnectAttr(dbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
// 连接数据库
ret = SQLConnect(dbc, dsn, SQL_NTS, user, SQL_NTS, pass, SQL_NTS);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("ODBC Connect Error!\n");
print_error(dbc, SQL_HANDLE_DBC);
return -1;
}
printf("ODBC Connect Success!\n");
// 分配语句句柄
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
// 执行SQL语句
SQLCHAR *sql = (SQLCHAR *)"SELECT COUNT(*) FROM mytable";
SQLExecDirect(stmt, sql, SQL_NTS);
// 处理查询结果
SQLINTEGER val;
if (SQLFetch(stmt) == SQL_SUCCESS) {
SQLGetData(stmt, 1, SQL_C_LONG, &val, sizeof(val), NULL);
printf("Result = %d\n", val);
}
// 关闭ODBC连接
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 0;
}
在本示例代码中,我们首先分配环境句柄,然后设置ODBC版本号,接着分配连接句柄并设置登录超时时间,最后连接到数据库。连接成功后,我们分配语句句柄并通过SQLExecDirect函数执行SQL语句,接着调用SQLFetch以及SQLGetData函数获取查询结果。最后,我们关闭ODBC连接并释放各种句柄。