C++ app MySQL odbc database connection error: terminate called after throwing an instance of 'otl_tmpl_exception<>

C++ app MySQL odbc database connection error: terminate called after throwing an instance of 'otl_tmpl_exception<>

我目前正在调试一个容器化的 C++ 应用程序,它似乎抛出异常并抱怨数据库连接,错误:

terminate called after throwing an instance of 'otl_tmpl_exception<odbc::otl_exc, odbc::otl_conn, odbc::otl_cur>'
Aborted

main()中的代码如下:

int main(int ac, char *av[])
{
        auto otl_connect = std::make_unique<odbc::otl_connect>("Driver={/usr/local/lib/libmyodbc8a.so};server=xxx.x.x.x;port=xxxx;database=xxxx;user=xxx;password=xxx");
        std::stringstream query;
        query << "SELECT x FROM xxx.xxxs;";
        odbc::otl_stream the_stream(1000, query.str().c_str(), *otl_connect);

        std::string
        int val;
        while(!the_stream.eof())
        {
            the_stream >> xxx >> val;
            std::cout << xxx << " " << val << "\n";
        }
        the_stream.close();
}

我是 C++ 的新手,谁能解释一下 main() 中的代码在做什么以及如何修复异常错误消息,我已经为此工作了一个下午,筋疲力尽... .help!!!!

我对 Oracle、ODBC 和 DB2-CLI 模板库不是很熟悉,但我在 Ubuntu Linux 上尝试将其与 MySql 数据库一起使用。

这就是我如何能够 运行 一个简单的查询。我认为下面的代码相当 self-explanatory.

如您所见,它与您的代码完全不同。 driver 是 mysql。您必须将 ... 替换为您数据库的真实数据库名称、用户名和密码。您还必须先初始化 ODBC 环境并使用 rlogon().

连接到您的数据库
#include <iostream>
#define OTL_ODBC // Compile OTL 4.0/ODBC
#define OTL_ODBC_UNIX
#include "otlv4.h"

int main()
{
    otl_connect db; // connect object
    otl_connect::otl_initialize(); // initialize ODBC environment
    try {
        db.rlogon("DRIVER=mysql;DB=...;UID=...;PWD=..."); // connect to ODBC

        otl_stream os(50, "SELECT id FROM task", db);

        int id;
        // SELECT automatically executes when all input variables are assigned
        while (!os.eof())
        {
            os >> id;
            std::cout << "id=" << id << std::endl;
        }
    }
    catch(otl_exception& p) {       // intercept OTL exceptions
        std::cerr << p.msg << std::endl;      // print out error message
        std::cerr << p.stm_text << std::endl; // print out SQL that caused the error
        std::cerr << p.sqlstate << std::endl; // print out SQLSTATE message
        std::cerr << p.var_info << std::endl; // print out the variable that caused the error
    }

    return 0;
}

确保对于要从查询结果中读取的每个字段都有一个变量。您似乎无法将值提取到 std::string 变量中;您必须改用字符数组(例如 char name[20])。

希望这对您有所帮助。