我试图使用OCCI将我的程序连接到oracle数据库,但是当我尝试使用SQLException 32104函数时,我得到了一个createEnvironment 32104。
我的代码:
#include <OpenXLSX.hpp>
#include <occi.h>
#include <string>
using namespace OpenXLSX;
using namespace oracle::occi;
int main() {
std::string user = "";
std::string pass = "";
std::string conn_str = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.2.159)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=test)))";
std::cout << "Initializing Database Connection ......" << std::endl;
try {
Environment* env = Environment::createEnvironment(Environment::DEFAULT);
//Connection *conn = env->createConnection(user, pass ,conn_str);
} catch(SQLException &e) {
std::cout << "Error Message: " << e.getErrorCode() << std::endl;
std::cout << e.getMessage() << std::endl;
}
std::cout << "Initializing Database Connection ......";
std::cout << " OK" << std::endl;
XLDocument doc;
doc.open("Template.xlsx");
auto wks = doc.workbook().worksheet("Extruder Data Log");
int row_number = 4;
char column_letter = 'A';
char column_letter2 = 'A';
std::string loc;
loc = column_letter;
loc += std::to_string(4);
wks.cell(loc).value() = "Hello, OpenXLSX!";
doc.save();
//env->terminateConnection(conn);
//Environment::terminateEnvironment(env);
std::cout << "Program Terminated: Press Enter ...";
std::string wait;
std::cin >> wait;
return 0;
}我使用CMake编译:
cmake_minimum_required(VERSION 3.15)
project(Atlas)
set(CMAKE_CXX_STANDARD 17)
# Set the build output location to a common directory
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output)
set(CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/include/lib)
add_subdirectory(OpenXLSX)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/include/OpenXLSX/headers)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/include/OpenXLSX)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/include/OCCI)
link_directories(${CMAKE_PREFIX_PATH})
find_package(OpenXLSX REQUIRED)
find_library(OCCI NAMES oraocci21.lib oci.lib oramysql.lib oraocci21d.lib ociw32.lib)
add_executable(Atlas Atlas.cpp)
target_link_libraries(Atlas OpenXLSX::OpenXLSX)
target_link_libraries(Atlas ${OCCI})输出目录中有dll,可执行文件和库最终输出到这个目录中。我认为它应该运行,但是我得到了一个Microsoft C++异常:oracle::SQLException,在调试时它显示了消息32104,我知道这意味着它无法获得错误。
Debug窗口显示它加载oraocci21.dll,但没有加载任何其他OCCI dll。
如果有人能让我知道我做错了什么,我会非常感激,因为我已经搜索了互联网,试图找出这一点。
编辑
发现这个错误后,我并没有从即时客户端移出所有的dll。我只包括与图书馆名称相对应的dll。我用我的可执行文件将ocijdbc21.dll、orannzsbb.dll和oraociicus.dll包含到文件夹中,它现在通过createEnvironment(Environment::DEFAULT)部分运行。
但是,使用此编辑,我现在遇到了错误24960,它说OCI_ATTR_USERNAME长度大于255,而它不是。如果有人能帮忙,请让我知道,但我希望其他遇到这个需要帮助的人看到关于dlls的部分。
如果这有助于回答我的问题,我正在使用即时客户端21_3和sdk 21_3,我也使用MSVC 16 2019年编译C++17作为C++的版本。我的Oracle数据库运行在19c上,我可以远程连接到它。
发布于 2022-04-08 17:31:21
所以我想明白了。我在cmake中使用了这个命令:
cmake --build . --target ALL_BUILD --config Debug
这个release命令应该可以工作,因为我已经调试了程序:
cmake --build . --target ALL_BUILD --config Release
由于某些原因,我只能假设OCCI不喜欢我的调试器版本或类似的东西。如果有人能评论为什么会发生这种情况,我想知道。
https://stackoverflow.com/questions/71784639
复制相似问题