C++ MySQL OTL 入门。ODBC 配置和错误

C++ MySQL OTL Getting Started. ODBC Configuration & Errors

提问人:Ilya 提问时间:11/7/2023 更新时间:11/8/2023 访问量:43

问:

我正在尝试使用 C++ 连接到 MySQL 数据库。在此之前,我从未使用C++与数据库进行过交互。

我选择的武器是OTL。我的测试项目由一个 OTL 头文件和 main.c 组成。没有别的了。

我遇到了无法连接到数据库的问题(字面意思是与数据库交互的第一行示例代码)。不幸的是,关于入门的信息不是很有帮助,因为它假设了很多以前的知识,并向我抛出了很多话。基本上没有零到英雄的解释,没有“入门”的解释(至少我没有找到任何解释),密集的互联网搜索几乎让我无处可去。

我的最终目标是:使用@username @password连接到本地数据库,运行几个查询,断开连接。就是这样。

当前设置:开发人员Windows 10计算机上的本地XAMPP MySQL服务器,服务器正在运行,我可以通过PHPMyAdmin访问它,对于C++,我正在使用Visual Studio。


我目前的经验:

尝试使用示例代码连接到本地数据库:

otl_connect db; // connect object
otl_connect::otl_initialize();
//db.rlogon("Server = localhost; Port = 3306; Database = testdb; Uid = testuser; Pwd = testpass;");
db.rlogon("[email protected]");

两个连接函数都无法连接,并出现异常:

[Microsoft][ODBC驱动程序管理器]未找到数据源名称,并且没有 指定的默认驱动程序

我注意到这是一个常见的错误,我在 StackOverflow 上发现了多个带有该错误的帖子。不幸的是,他们的解决方案要么对我不起作用,要么我不理解他们。

这篇 StackOverflow 帖子中,我似乎可以使用一种叫做 ODBC 的东西(这是一种跨平台的中间件来与各种数据库交互?),或者(或者?我可以使用 connectionstrings.com 中的字符串。在上面提供的代码中,注释掉的行实际上是从那里获取的。它给出了相同的例外。


我决定我可能需要一个DSN(是吗?我不知道这是否是严格要求的)。因此,我进入了 Windows ODBC 数据源管理(64 位)(在我得知存在一个叫做 ODBC 的东西后 10 分钟)。在那里,我尝试创建一个系统DSN。驱动程序列表是 Microsoft Access 的 3 倍,一个 Microsoft Excel 和一个 SQL Server。我选择了 SQL Server。然后,它需要填写“名称”、“描述”和“服务器”文本字段。

enter image description here

我不确定在那里写什么,所以我分别使用了 MyName、MyDescription 和 127.0.0.1。

接下来,我决定通过显式指定端口来配置数据库登录(这是正确的)。我无法使用任何登录名,因为当我单击“下一步”时,窗口冻结了 3 秒钟并出现网络错误:
authentication options port selection

如果我指定登录,则会弹出以下错误:
enter image description here

所以我没有登录,因为这是在此配置中继续的唯一方法。之后,有 2 个带有附加设置的窗口。我决定除了写我的数据库名称之外不做任何更改。

enter image description here enter image description here

最终结果如下所示:
enter image description here

测试结果是一个一般的网络错误,不管它意味着什么:
enter image description here


问题:

  1. 我是否甚至需要 ODBC 中的 DSN 用于我正在编写的应用程序(用于在本地数据库上运行查询的本地应用程序)?
  2. 正确的入门方法是什么,如何使用 C++ 首次连接到数据库,运行查询并使用 OTL 断开连接?我需要的东西的完整清单是什么?
C++ MySQL SQL服务器、 ODBC OTL

评论

1赞 drescherjm 11/8/2023
[email protected]我不希望您在 MSWindows 上拥有用户root
4赞 Dan Guzman 11/8/2023
Microsoft SQL Server ODBC驱动程序不适用于MySQL。首先,您需要安装MySQL ODBC驱动程序。然后,您可以在连接字符串中指定驱动程序名称 ('Server = localhost;Driver = {MySQL ODBC 8.0 Unicode Driver}...') 或使用驱动程序创建 DSN,并在连接字符串中指定 DSN,而不是服务器名称 ()。DSN=YourDSN; ...
0赞 Ilya 11/8/2023
@DanGuzman 因此,DSN 类似于数据库连接配置实例,因此我可以将配置另存为 DSN(用于重用或其他内容),也可以“在运行时”配置连接。这种说法正确吗?
0赞 siggemannen 11/8/2023
通常有人已经做过这些事情了。我只是搜索,这是MySQL的一个:gist.github.com/tomov3/764a6d0ff4904a29d5ebdddd7f19d4fclanguage database gist
0赞 Dan Guzman 11/8/2023
是的,DSN 基本上封装了连接设置,因此不需要在连接字符串中指定它们。

答:

0赞 Ilya 11/8/2023 #1

在评论中其他人的帮助下,我终于第一次设法使用我的 C++ 应用程序连接到数据库。因此,如果有人正在寻找如何使用 C++ 建立他们的第一个数据库连接,以下是我的情况:

在 C++ 测试项目中,我有和来自 OTL,没有别的。main.cppotlv4.h

main.cpp:

#include <iostream>

#define OTL_ODBC // Compile OTL 4.0/ODBC
// The following #define is required with MyODBC 3.51.11 and higher
#define OTL_ODBC_SELECT_STM_EXECUTE_BEFORE_DESCRIBE
// #define OTL_ODBC_UNIX // uncomment this line if UnixODBC is used
#include "otlv4.h"


int main()
{
    //from example code
    otl_connect db; // connect object
    otl_connect::otl_initialize();


    try {
        db.rlogon("Driver={MySQL ODBC 8.2 ANSI Driver};Server=localhost;Port=3306;Database=my_db;User=db_user;Password=db_user_password;");
    }
    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
    }

    db.logoff(); // disconnect from ODBC

    std::cout << "Hello World!\n";
}

这基本上是从示例代码中获取的,但连接字符串 () 除外,下面将详细介绍它。db.rlogon()

要使连接字符串正常工作,我需要专门为我的数据库提供正确的 ODBC 驱动程序,因为 ODBC 充当使用相同 API 连接到各种数据库的通用驱动程序(基本上,它抽象出不同的数据库接口,使 ODBC 在数据库是什么以及谁尝试连接到它方面几乎与平台无关)。就我而言,我已经下载并安装了适用于 Windows 的 MySQL 的 ODBC 驱动程序。在窗口的“ODBC数据源管理(64位)”实用程序中,如果我尝试添加新的系统DSN,我现在可以选择MySQL ODBC 8.2 ANSI驱动程序(并且还有一个unicode选项)。在安装此驱动程序之前,那里没有这样的选项。

现在驱动程序已安装在系统上,有两个选项可以连接。要么在系统上的 ODCB 配置中创建一个 DSN,它几乎是一个连接配置文件(包含连接详细信息 - 服务器地址和端口、数据库名称、数据库用户名等),要么直接在程序中编写包含所有连接详细信息的连接配置字符串,而无需使用 DSN(我选择这样做)。唯一需要做的是通过在连接字符串中显式指定驱动程序来绑定新安装的 MySQL 驱动程序:

db.rlogon("Driver={MySQL ODBC 8.2 ANSI Driver};Server=localhost;Port=3306;Database=my_db;User=db_user;Password=db_user_password;");

驱动程序的名称必须与 ODBC 管理器实用程序中的名称完全相同。{MySQL ODBC 8.2 ANSI Driver}

非常重要:单词 Driver= 的等号之前不能有空格(但是对于我拥有的任何其他参数,等号周围可以有空格,即使该参数的值封装为 )。我已经测试了所有:{val}

//This WORKS
db.rlogon("Driver= {MySQL ODBC 8.2 ANSI Driver};"
        "Server = {localhost};"
        "Port=3306;"
        "Database =my_db;"
        "User= db_user;"
        "Password=db_user_password;");

//This does NOT work  
db.rlogon("Driver = {MySQL ODBC 8.2 ANSI Driver};" //this line ruins it
        "Server = {localhost};"
        "Port=3306;"
        "Database =my_db;"
        "User= db_user;"
        "Password=db_user_password;");

为了避免不必要的麻烦,连接字符串中的等号周围不要有空格。

有效的最终连接字符串:

db.rlogon("Driver={MySQL ODBC 8.2 ANSI Driver};"
            "Server=localhost;"
            "Port=3306;"
            "Database=my_db;"
            "User=db_user;"
            "Password=db_user_password;");