C++ 从 SQL Server SELECT 分配变量值

标签 c++ sql sql-server

我有一个执行大量 SQL 插入的脚本,但我一直在尝试添加一个部分,将选择查询的返回值分配给一个变量。

我用来插入的代码是:

if (SQL_SUCCESS != SQLExecDirect(sqlstatementhandle, (SQLCHAR*)"BULK INSERT mytable FROM 'C:/dir/myfile.csv' WITH (FIRSTROW = 1, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n');", SQL_NTS)) {
        show_error(SQL_HANDLE_STMT, sqlstatementhandle);

一切正常,但我不知道如何使用查询的输出。输出将是单个 int 值,我想将其分配给 int 变量。

如果这是非常明显的事情,我们深表歉意。

编辑

根据下面的答案,以下内容现在对我有用。谢谢!

SQLRETURN    retcode;
SQLHSTMT     hstmt; // I use my own stmnthndl(sqlstatementhandle) below, this line left in for demonstration

retcode = SQLExecDirect(sqlstatementhandle, (SQLCHAR*)"SELECT count(*) FROM mytable;",SQL_NTS);
SQLINTEGER   sCustID;
SQLLEN cbCustID;

if (retcode == SQL_SUCCESS) {
    while (TRUE) {
        retcode = SQLFetch(sqlstatementhandle);
        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

            // get the first column
            SQLGetData(sqlstatementhandle, 1, SQL_C_ULONG, &sCustID, 0, &cbCustID);

            //You can now print it
            cout << "CustID:" << sCustID;
        }
        else {
            break;
        }
    }
}

最佳答案

您可以使用 SQLGetData获取结果集中单个列的数据。取自this example ,首先使用 SQLExecDirect 执行 SQL 查询:

SQLRETURN    retcode;
SQLHSTMT     hstmt;

retcode = SQLExecDirect(hstmt,
   (SQLCHAR*)"SELECT CUSTID, NAME, PHONE FROM CUSTOMERS ORDER BY 2, 1, 3",
   SQL_NTS);

然后就可以拿到数据了,我展示的是同样的缩小版example :

SQLINTEGER   sCustID, cbCustID;

if (retcode == SQL_SUCCESS) {
   while (TRUE) {
      retcode = SQLFetch(hstmt);
      if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
         show_error();
      }
      if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){

         // get the first column
         SQLGetData(hstmt, 1, SQL_C_ULONG, &sCustID, 0, &cbCustID);

         //You can now print it
         fprintf(out, "CustID: %-5d", sCustID);
      } else {
         break;
      }
   }
}

SQLGetData的语法是:

SQLRETURN SQLGetData(
      SQLHSTMT       StatementHandle,
      SQLUSMALLINT   Col_or_Param_Num,
      SQLSMALLINT    TargetType,
      SQLPOINTER     TargetValuePtr,
      SQLLEN         BufferLength,
      SQLLEN *       StrLen_or_IndPtr);

与:

  • StatementHandle:执行的 SQL 查询的句柄。
  • Col_or_Param_Num:列号,从1开始。
  • TargetType:数据类型,可以使用SQL_INTEGER,参见SQL data typesC data types .
  • TargetValuePtr:指向输出数据的指针。
  • BufferLength:长度,但不用于整数等定长数据。
  • StrLen_or_IndPtr:可选输出,可以返回数据的长度或错误代码。


注意:就像您评论的那样,您可能需要将 SQL 查询转换为 SQLCHAR *,因为 SQLCHAR 是一个 unsigned char,参见 the data types .

关于C++ 从 SQL Server SELECT 分配变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34066283/

相关文章:

SQL多对多查询问题

sql - 存储过程不返回任何行,但相同的查询返回正确的数据

sql - 内联函数和 View 之间的区别

sql - 外键到非主键

c++ - OpenGl翻译

c++ - 渲染网格时 C++ 中的内存泄漏

c++ - 损坏的双链表 : 0x0804d0c0 (C++)?

sql - 真的可以到处用JOINS代替SQL中的子查询吗

c++ - 因为我们有 move 语义,所以不需要为 STL 容器参数使用 const & 吗?

sql-server - 将电力查询迁移到 SSAS 或 SSIS?