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

时间:2015-12-03 12:35:47

标签: c++ sql sql-server

我有一个执行大量SQL插入的脚本,但我一直在尝试添加一个将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 个答案:

答案 0 :(得分:1)

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

using System.Web.Script.Serialization;

var jss = new JavaScriptSerializer();
var dict = jss.Deserialize<Dictionary<string,dynamic>>(jsonText);

Console.WriteLine(dict["Brands"]); /
Console.WriteLine(dict["Products"]); 

然后您可以获取数据,我会显示相同example的简化版本:

SQLRETURN    retcode;
SQLHSTMT     hstmt;

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

SQLGetData的语法是:

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

使用:

  • SQLRETURN SQLGetData( SQLHSTMT StatementHandle, SQLUSMALLINT Col_or_Param_Num, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLLEN BufferLength, SQLLEN * StrLen_or_IndPtr); :执行的SQL查询的句柄。
  • StatementHandle:列号,从1开始。
  • Col_or_Param_Num:数据类型,您可以使用TargetType,请参阅SQL data typesC data types
  • SQL_INTEGER:指向输出数据的指针。
  • TargetValuePtr:长度,但不用于整数等固定长度数据。
  • BufferLength:可选的输出,可以返回数据长度或错误代码。


注意:就像您评论的那样,您可能需要将SQL查询转发给StrLen_or_IndPtr,因为SQLCHAR *SQLCHAR,请参阅the data types