21xrx.com
2024-11-05 14:39:40 Tuesday
登录
文章检索 我的文章 写文章
使用C++调用SQL Server存储过程
2023-07-01 09:22:08 深夜i     --     --
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,并调用存储过程。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复