21xrx.com
2025-03-28 04:20:33 Friday
文章检索 我的文章 写文章
使用C++调用SQL Server存储过程
2023-07-01 09:22:08 深夜i     31     0
C++ SQL Server 存储过程 调用 编程

在C++编程中,使用SQL Server存储过程可以提高数据处理效率和安全性,以及减少代码复杂度。本文将介绍如何使用C++调用SQL Server存储过程。

首先,在C++中使用SQL Server需要安装ODBC驱动程序。可以从Microsoft官网下载ODBC驱动程序,也可以从SQL Server安装光盘中获取。

接着,需要在SQL Server中创建一个存储过程。可以使用SQL Server Management Studio(SSMS)创建存储过程,也可以使用SQL脚本语言创建。下面是一个简单的SQL脚本示例,创建一个存储过程,接受一个参数,返回该参数的平方值:

CREATE PROCEDURE square_proc
  @num int,
AS
BEGIN
  SELECT POWER(@num,2) as result
END

创建存储过程后,需要在C++中连接到SQL Server,并调用存储过程。下面是一个C++示例,使用ODBC API连接到SQL Server,并调用上面创建的存储过程:

#include <iostream>
#include <windows.h>
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>
void print_odbc_error(SQLHANDLE handle, SQLSMALLINT handle_type) {
  SQLCHAR sqlstate[6], message[SQL_MAX_MESSAGE_LENGTH];
  SQLINTEGER sqlcode;
  SQLSMALLINT length;
  SQLRETURN ret;
  std::cerr << "ODBC Error: " << std::endl;
  ret = SQLGetDiagRec(handle_type, handle, 1, sqlstate, &sqlcode, message, SQL_MAX_MESSAGE_LENGTH, &length);
  while (ret == SQL_SUCCESS) {
    std::cerr << sqlstate << " (" << sqlcode << "): " << message << std::endl;
    ret = SQLGetDiagRec(handle_type, handle, 1, sqlstate, &sqlcode, message, SQL_MAX_MESSAGE_LENGTH, &length);
  }
}
int main() {
  SQLHENV henv;
  SQLHDBC hdbc;
  SQLHSTMT hstmt;
  SQLRETURN ret;
  SQLINTEGER num;
  SQLINTEGER sq;
  // Allocate environment handle
  ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
  if (ret != SQL_SUCCESS) {
    print_odbc_error(henv, SQL_HANDLE_ENV);
    return 1;
  }
  // Set ODBC version
  ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
  if (ret != SQL_SUCCESS) {
    print_odbc_error(henv, SQL_HANDLE_ENV);
    return 1;
  }
  // Allocate connection handle
  ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
  if (ret != SQL_SUCCESS) {
    print_odbc_error(henv, SQL_HANDLE_DBC);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
    return 1;
  }
  // Connect to SQL Server
  SQLCHAR* dsn = (SQLCHAR*)"Driver={SQL Server Native Client 11.0};Server=(local);Database=example_db;Trusted_Connection=yes;";
  ret = SQLDriverConnect(hdbc, NULL, dsn, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);
  if (ret != SQL_SUCCESS) {
    print_odbc_error(hdbc, SQL_HANDLE_DBC);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
    return 1;
  }
  // Allocate statement handle
  ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
  if (ret != SQL_SUCCESS) {
    print_odbc_error(hdbc, SQL_HANDLE_STMT);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
    return 1;
  }
  // Bind input parameter
  num = 5;
  ret = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &num, 0, NULL);
  if (ret != SQL_SUCCESS) {
    print_odbc_error(hstmt, SQL_HANDLE_STMT);
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
    return 1;
  }
  // Execute stored procedure
  ret = SQLExecDirect(hstmt, (SQLCHAR*)"EXECUTE square_proc @num=?", SQL_NTS);
  if (ret != SQL_SUCCESS) {
    print_odbc_error(hstmt, SQL_HANDLE_STMT);
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
    return 1;
  }
  // Bind output parameter
  ret = SQLBindCol(hstmt, 1, SQL_C_LONG, &sq, 0, NULL);
  if (ret != SQL_SUCCESS) {
    print_odbc_error(hstmt, SQL_HANDLE_STMT);
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
    return 1;
  }
  // Fetch result
  ret = SQLFetch(hstmt);
  if (ret != SQL_SUCCESS) {
    print_odbc_error(hstmt, SQL_HANDLE_STMT);
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
    return 1;
  }
  std::cout << "Result: " << sq << std::endl;
  // Free resources
  SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
  SQLDisconnect(hdbc);
  SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
  SQLFreeHandle(SQL_HANDLE_ENV, henv);
  return 0;
}

该示例中,首先连接到SQL Server,并分配了环境、连接和声明句柄。然后绑定输入参数,执行存储过程,并绑定输出参数。最后,通过SQLFetch函数获取结果,并释放资源。

需要注意的是,编译时需要链接ODBC库(如odbc32.lib、odbccp32.lib等)。

使用C++调用SQL Server存储过程可以方便地处理复杂的数据操作。通过以上示例,可以更好地理解如何在C++中使用ODBC API连接到SQL Server,并调用存储过程。

  
  

评论区

请求出错了