非常长的查询执行使用c++, Sql Server和ODBC连接
Very long query execution using C++, Sql Server and ODBC connection
我使用以下代码连接到sql-server数据库。我可以使用相同的函数毫无困难地运行所有其他查询。然而,使用RODBC在Sql管理工作室和R中执行一个查询只需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
我弄清楚了:我的连接字符串的默认数据库与我在SSMS中作为默认数据库的数据库不同。切换此选项使查询以与SSMS相同的速度运行。
相关文章:
- 使用 SQLConfig数据源创建 SQL Server DSN 失败:关键字-值对无效
- 如何将QTime保存在SQL Server Express表中并读回?
- 无法从 SQL Server 检索数据
- 如何在将Visual Studio C++控制台应用程序连接到Microsoft SQL Server时修复"
- SQL Server-未找到数据源名称,也未指定默认驱动程序
- 我应该如何使用SQL Server CLR来使用由C++ / C编译的UDT
- 如何在C++代码中连接 SQL Server 数据库
- SQL Server 2017 C++ ODBC 连接在 Linux 上不起作用
- 从适用于 SQL Server 的 Azure 帐户获取 IP
- 通过 ODBC C++将带有日期时间的记录插入 SQL Server 2014 的问题
- SQL Server 2016 CLR 存储过程错误:"A system assertion check has failed"
- MFC 使用 ODBC 连接到 SQL Server
- 从.Net访问SQL Server与从Qt
- QODBC连接到SQL Server,但无法执行查询
- 如何在C 中连接到SQL Server
- ODBC 错误"String data, right truncation State code: 22001"与 SQL Server 数据库
- 在C++中通过SOCI/ODBC实现SQL Server存储过程
- 以编程方式连接到远程 SQL Server C++
- 如何与SQL Server 2008建立稳定的连接,并在C 中编码我的第一个CRUD操作
- Microsoft如何保护SQL Server二进制文件免受反向工程的影响