gpt4 book ai didi

c++ - 使用 C++、Sql Server 和 ODBC 连接执行非常长的查询

转载 作者:太空狗 更新时间:2023-10-29 22:58:38 25 4
gpt4 key购买 nike

我正在使用以下代码连接到 sql-server 数据库。我可以使用相同的函数毫无困难地运行所有其他查询。但是,一个查询在 Sql management studio 和 R 中使用 RODBC 在 ~11 秒内执行,但使用 c++ 需要一个多小时(在“SQLExecDirect”函数中)。有没有其他人有这个问题,你是如何解决的?

std::string sqlQuery="[myquery]";
SQLHANDLE sqlconnectionhandle;
SQLAllocHandle(SQL_HANDLE_DBC, sqlenvhandle, &sqlconnectionhandle);
SQLCHAR retconstring[1024];
SQLDriverConnect (sqlconnectionhandle, NULL,
conn_str,
len, retconstring, 1024, NULL,SQL_DRIVER_NOPROMPT);
SQLHANDLE sqlstatementhandle;
SQLAllocHandle(SQL_HANDLE_STMT, sqlconnectionhandle, &sqlstatementhandle);
//this is where the program "hangs" for over an hour
if(SQL_SUCCESS!=SQLExecDirect(sqlstatementhandle, (SQLCHAR*)(sqlQuery.c_str()), SQL_NTS)){
show_error(SQL_HANDLE_STMT, sqlstatementhandle, errorMsg);
return;
}
int numRow=0;
while(SQLFetch(sqlstatementhandle)==SQL_SUCCESS){
for(int i=1; i<=numFields+1; ++i){
double myVal;
SQLGetData(sqlstatementhandle, i, SQL_C_DOUBLE, &myVal, 0, NULL);
cb(myVal, numRow, i-1); //callback function defined elsewhere
}
numRow++;
}
SQLFreeHandle(SQL_HANDLE_STMT, sqlstatementhandle );
SQLDisconnect(sqlconnectionhandle);
SQLFreeHandle(SQL_HANDLE_DBC, sqlconnectionhandle);

最佳答案

那是因为您的数据库上的 ArithAbort 属性已关闭。另见 http://www.sommarskog.se/query-plan-mysteries.html

您可以使用这个小脚本检查并更正

declare @value sql_variant 
select @value = SESSIONPROPERTY('ARITHABORT')
if @value <> 1
begin
USE master
ALTER DATABASE [your_database] SET ARITHABORT ON WITH NO_WAIT
use your_database
end

关于c++ - 使用 C++、Sql Server 和 ODBC 连接执行非常长的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39978488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com