2015-12-03 48 views
0

我有一个脚本可以执行一堆SQL插入,但我一直试图添加一个将选择查询的返回值赋值给变量的节。C++从SQL Server分配变量值SELECT

的代码我一直用做插件是:

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; 
     } 
    } 
} 

回答

1

您可以使用SQLGetData获取数据的ResultSet中的一列。从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); 

With:

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


注意:喜欢你的评价,你可能需要将SQL查询转换为SQLCHAR *因为SQLCHARunsigned char,看到the data types

+0

非常感谢,不得不作出一个改变 - 我不知道这是否与我的代码的其余部分是如何布置的?我不得不在查询前添加(SQLCHAR *) – dailygrind