首页 / 浏览问题 / 组件GIS / 问题详情
Objects C++ 连接达梦数据库
2EXP 2024年03月07日

连接达梦数据库失败?代码如下,返回的 DataSource 为空

   UGDsConnection *connection = new UGDsConnection;

    connection->m_nType = UGint(UGEngineType::DMPlus);
    connection->m_strAlias = _T("dameng");
    connection->m_strServer = _T("192.168.1.126");
    connection->m_strUser = _T("SUPERMAP");
    connection->m_strPassword = _T("dameng888");
    connection->m_strDatabase = _T("");

    UGDataSource* pDataSource = NULL;

    UGWorkspace *pUGWorkspace = new UGWorkspace;
    if(pUGWorkspace==NULL)
    {
        AfxMessageBox(L"pUGWorkspace false");
    }

    pDataSource = pUGWorkspace->OpenDataSource(*connection);
    if(pDataSource==NULL)
    {
        AfxMessageBox(L"pDataSource false");
    }

1个回答

您好,iObjects C++ 组件打开达梦数据源,需注意以下几点:

  1. 达梦客户端环境配置成功,已添加到系统环境变量,且通过 iDesktopX 或 iServer 可正常连接达梦数据源;
  2. 若 iDesktopX 或 iServer 可以正常连接达梦数据源,而 iObjects C++ 组件无法连接,则可以把达梦客户端的依赖库(特别是 dmoci.dll),全部拷贝到 iObjects C++ 的依赖库目录下,再尝试连接达梦数据源;
  3. 注意 iObjects C++ 组件接口的使用方式,打开达梦数据源可参考 SuperMap iObjects C++ 之工作空间、数据源、数据集管理_supermap ioobject c++ appenddatasettomap(dataset);-CSDN博客 教程,对打开数据源的代码参数进行微调,改成达梦数据源的参数即可,可参考以下代码示例:
// 构建数据源信息
UGDataSource* datasource = UGDataSourceManager::CreateDataSource(UGEngineType::DMPlus);
UGDsConnection& dsConn = datasource->GetConnectionInfo();
dsConn.m_strServer = _U("");
dsConn.m_strAlias = _U("");
dsConn.m_strUser = _U("");
dsConn.m_strPassword = _U("");
dsConn.m_strDatabase = _U("");
dsConn.m_nType = UGEngineType::DMPlus;

// 打开数据源
if (!datasource->Open())
{
  datasource->Close();
  delete datasource;
}
else
{
  // 数据源打开成功,添加到当前工作空间中
  if (!m_workspace->m_DataSources.Insert(dsConn.m_strAlias, datasource) || !m_workspace->Save()) {}
}

希望可以帮到您。

2,163EXP 2024年03月07日
运行环境:LInux+QT

已将达梦客户端的依赖库libdmoci.so放入执行目录下。但是执行下面代码后,datasource 依然为空。

UGDataSource* datasource = UGDataSourceManager::CreateDataSource(UGEngineType::DMPlus);
不止是拷贝 libdmoci.so 一个库文件,把达梦客户端安装目录下的依赖库文件全部拷贝过去试试呢

如果还是失败的话,就把 iObjects C++ 组件的 log 目录下的日志文件内容贴出来看下,应该在您的程序输出目录下能找到日志文件
日志文件为空,没有任何内容。
建议您在 iObjects C++ 组件的 bin 目录下找对 SuperMap.xml 文件,打开编辑,找到 <LogLevel> 标签,将标签值从 error 修改为 debug 并保存。

保存后再重新执行您的程序,若依然打开达梦数据源失败,再看 log 目录下的异常日志输出内容。
2024-03-07 16:23:12 [info] Compact File open: /data/超图/supermap-iobjectscpp/bin/bin/Marker.sym, ThreadID: 2706426880, Timespan(ms): 0, ResourceID: -100, SourceCode: ../../../Src/CompactFile/UGCompactFile.cpp(108)
2024-03-07 16:23:12 [warning] Index corresponding to ID not exist, ThreadID: 2706426880, Timespan(ms): 3, ResourceID: EDd003, SourceCode: ../../../Src/Symbol/UGSymbolGroup.cpp(281)
2024-03-07 16:23:12 [warning] Failed to remove the symbol of the appointed ID., ThreadID: 2706426880, Timespan(ms): 0, ResourceID: EGa022, SourceCode: ../../../Src/Symbol/UGSymbolGroup.cpp(360)
2024-03-07 16:23:12 [info] Compact File open: /data/超图/supermap-iobjectscpp/bin/bin/Line.lsl, ThreadID: 2706426880, Timespan(ms): 0, ResourceID: -100, SourceCode: ../../../Src/CompactFile/UGCompactFile.cpp(108)
2024-03-07 16:23:12 [warning] Index corresponding to ID not exist, ThreadID: 2706426880, Timespan(ms): 0, ResourceID: EDd003, SourceCode: ../../../Src/Symbol/UGSymbolGroup.cpp(281)
2024-03-07 16:23:12 [warning] Failed to remove the symbol of the appointed ID., ThreadID: 2706426880, Timespan(ms): 0, ResourceID: EGa022, SourceCode: ../../../Src/Symbol/UGSymbolGroup.cpp(360)
2024-03-07 16:23:12 [info] Compact File open: /data/超图/supermap-iobjectscpp/bin/bin/Fill.bru, ThreadID: 2706426880, Timespan(ms): 1, ResourceID: -100, SourceCode: ../../../Src/CompactFile/UGCompactFile.cpp(108)
2024-03-07 16:23:12 [warning] Index corresponding to ID not exist, ThreadID: 2706426880, Timespan(ms): 1, ResourceID: EDd003, SourceCode: ../../../Src/Symbol/UGSymbolGroup.cpp(281)
2024-03-07 16:23:12 [warning] Failed to remove the symbol of the appointed ID., ThreadID: 2706426880, Timespan(ms): 0, ResourceID: EGa022, SourceCode: ../../../Src/Symbol/UGSymbolGroup.cpp(360)
建议私信我您的联系方式,我远程调试看下
最终处理方案:客户环境使用的达梦客户端依赖库有问题,重新发给客户可用的达梦客户端依赖库后,客户使用 iObjects C++ 11.0.1 官网版本组件可正常连接达梦数据源
...