我有一个执行大量 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 types和 C 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/