运行任意 SQL 命令 MySQL C++ (X DevAPI)?

Posted

技术标签:

【中文标题】运行任意 SQL 命令 MySQL C++ (X DevAPI)?【英文标题】:Running arbitrary SQL commands MySQL C++ (X DevAPI)? 【发布时间】:2021-02-10 04:04:21 【问题描述】:

我已将我的 C++ 项目连接到 mysql 并成功创建了一个会话。我能够创建一个模式。我的问题是,当我尝试使用 MySQL/C++ api 运行像 USE testSchema SHOW tables; 这样的简单任意查询时,我遇到了 SQL 语法错误。当我直接在 MySQL shell 中运行该函数时,查询运行得非常好。

这是完整的代码

const char* url = (argc > 1 ? argv[1] : "mysqlx://pct@127.0.0.1");
cout << "Creating session on " << url << " ..." << endl;

Session sess(url);


    cout << "Connected!" << endl;

    // Create the Schema "testSchema"; This code creates a schema without issue
    cout << "Creating Schema..." << endl;
    sess.dropSchema("testSchema");
    Schema mySchema = sess.createSchema("testSchema");
    cout << "Schema Created!" << endl;


    // Create the Table "testTable"; This code runs like normal, but the schema doesn't show
    cout << "Creating Table with..." << endl;
    SqlStatement sqlcomm = sess.sql("USE testSchema SHOW tables;");
    sqlcomm.execute();

这是控制台输出:

Creating session on mysqlx://pct@127.0.0.1 ...
Connected!
Creating Schema...
Schema Created!
Creating Table with...
MYSQL ERROR: CDK Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SHOW tables' at line 1

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SHOW tables' at line 1 错误是 MySQL 错误,这意味着我在查询中存在语法错误,但是当我仔细查看查询时,我发现它没有任何问题。

我已将代码直接从 cpp 文件复制并粘贴到 mysql shell 中,它运行良好。这告诉我在sql() 函数中输入查询的格式有问题。但是sql() 函数的文档非常简洁。

这里是对 sql() 函数的引用:https://dev.mysql.com/doc/dev/connector-cpp/8.0/class_session.html#a2e625b5223acd2a3cbc5c02d653a1426

有人可以告诉我我哪里出错了吗?这里还有完整的 cpp 代码以获取更多上下文:https://pastebin.com/3kQY8THC

Windows 10 视觉工作室 2019 MySQL 8.0 与 Connect/C++ X DevAPI

【问题讨论】:

【参考方案1】:

您可以分两步完成:

sess.sql("USE testSchema").execute();

SqlStatement sqlcomm = sess.sql("SHOW tables");
SqlResult res = sqlcomm.execute();
for(auto row : res)

   std::cout << row.get(0).get<std::string>() << std::endl;

另外,您可以使用Schema::getTables():

for(auto table : mySchema.getTables())

  std::cout << table.getName() << std::endl;

请记住,Schema::getTables() 不显示由Schema::createCollection() 创建的集合。还有一个Schema::getCollections()

for(auto collection : mySchema.getCollections())

  std::cout << collection.getName() << std::endl;

【讨论】:

谢谢。这行得通,但看起来只是因为您将查询 USE testSchema 和 SHOW 表分成两个命令...您知道为什么我的方式不起作用而您的方式起作用吗? Session::sql() 中不能使用多个命令 好的,我明白了...还有一个关于在 MySQL 中创建表而不使用 Session::sql() 的问题,但我会在另一篇文章中提问 目前,没有sql无法创建表...只有Collections(这是一个具有某些特定属性的表) 明白。感谢您的帮助

以上是关于运行任意 SQL 命令 MySQL C++ (X DevAPI)?的主要内容,如果未能解决你的问题,请参考以下文章

如何看mysql执行的sql语句

ECShop 2.x/3.x SQL注入/任意代码执行漏洞

如何使用 AWS Glue 运行任意/DDL SQL 语句或存储过程

Ecshop 2.x/3.x SQL注入/任意代码执行漏洞

在Navicat上如何停止正在运行的MYSQL语句

使用带有 JDBC 的 MySQL 运行 .sql 脚本