如何使用C++连接mySQL数据库

lep*_*100 34 c++ mysql

我正在尝试从我的网站连接数据库并使用C++显示一些行.所以基本上我正在尝试创建一个应用程序,从我的站点数据库中的表中执行选择查询.现在,这必须是可能的,因为我已经看到大量应用程序在做这件事.

我该怎么做呢?有人可以举例说明我应该使用哪些库?

hd1*_*hd1 33

这里找到:

/* Standard C++ includes */
#include <stdlib.h>
#include <iostream>

/*
  Include directly the different
  headers from cppconn/ and mysql_driver.h + mysql_util.h
  (and mysql_connection.h). This will reduce your build time!
*/
#include "mysql_connection.h"

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>

using namespace std;

int main(void)
{
cout << endl;
cout << "Running 'SELECT 'Hello World!' »
   AS _message'..." << endl;

try {
  sql::Driver *driver;
  sql::Connection *con;
  sql::Statement *stmt;
  sql::ResultSet *res;

  /* Create a connection */
  driver = get_driver_instance();
  con = driver->connect("tcp://127.0.0.1:3306", "root", "root");
  /* Connect to the MySQL test database */
  con->setSchema("test");

  stmt = con->createStatement();
  res = stmt->executeQuery("SELECT 'Hello World!' AS _message"); // replace with your statement
  while (res->next()) {
    cout << "\t... MySQL replies: ";
    /* Access column data by alias or column name */
    cout << res->getString("_message") << endl;
    cout << "\t... MySQL says it again: ";
    /* Access column fata by numeric offset, 1 is the first column */
    cout << res->getString(1) << endl;
  }
  delete res;
  delete stmt;
  delete con;

} catch (sql::SQLException &e) {
  cout << "# ERR: SQLException in " << __FILE__;
  cout << "(" << __FUNCTION__ << ") on line " »
     << __LINE__ << endl;
  cout << "# ERR: " << e.what();
  cout << " (MySQL error code: " << e.getErrorCode();
  cout << ", SQLState: " << e.getSQLState() << " )" << endl;
}

cout << endl;

return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

  • 所有的嗡嗡声只是因为一个例子,我很确定没有人建立一个好的应用程序将嵌入访问登录信息的代码. (9认同)
  • 这不安全.从二进制文件中提取所有字符串以获取密码很容易.一个知识渊博的攻击者可以看到你在哪里调用`driver_connect()`然后再回到二进制文件中的密码.但这不是安全应该发生的水平.*服务器*是唯一可以强制执行安全性的人.您应该为每个人创建单独的帐户,而不是在启动时询问用户名和密码.如果这不是一个选项,则将用户的访问权限限制为只读,或者创建自己的服务器进程,该进程仅支持应该允许的任务. (6认同)
  • 我需要libarys吗?那是安全的吗?因为有人说你不应该把密码存储在文件中. (4认同)
  • @ hd1它将用于字符串常量和其他数据部分内容,上面示例中的密码属于该内容.如果你静态链接它,你可能不会得到`driver_connect()`本身,但是在某些时候你会调用系统dylib,并且很容易从一个调用回拨到例如socket上的`connect()`.事实的问题是:如果计算机可以提取密码以将其提供给`driver_connect()`,那么计算机的用户也可以.因此,如果您的某个用户是恶意用户或受到攻击,则此方法并不安全.这就是您需要每用户密码的原因.限制伤害. (2认同)

mun*_*ali 10

最后,我可以在Ubuntu 12.04中使用C++连接器成功编译程序.我已使用此命令安装了连接器

'apt-get install libmysqlcppconn-dev'
Run Code Online (Sandbox Code Playgroud)

最初我遇到了同样的问题"未定义引用`get_driver_instance'"来解决这个问题我声明了MySQL_Driver类型的驱动程序实例变量.对于准备参考,此类型在mysql_driver.h文件中定义.这是我在程序中使用的代码片段.

sql::mysql::MySQL_Driver *driver;
try {     
    driver = sql::mysql::get_driver_instance();
}
Run Code Online (Sandbox Code Playgroud)

我用-l mysqlcppconn链接器选项编译了程序

并且不要忘记包含此标题

#include "mysql_driver.h" 
Run Code Online (Sandbox Code Playgroud)

  • 作为替代方案,我建议: https://packages.ubuntu.com/bionic/libmariadb3 这是 mariadb 连接器 (2认同)

Ala*_*all 6

是的,您将需要mysql c ++连接器库.请继续阅读下面的内容,在这里我将解释如何让mysql开发人员给出的示例.

注意(和解决方案):IDE: 我尝试使用Visual Studio 2010,但仅仅几秒钟之前,这一切都工作,似乎我在手册中错过了它,但它建议使用Visual Studio 2008.我下载并安装VS2008 Express for c ++,按照手册第5章中的步骤进行操作,错误消失了!有用.我很高兴,问题解决了.除了如何让它在更新版本的visual studio上工作之外.您应该尝试使用Visual Studio插件的mysql,这可能会获得vs2010或更高版本以成功连接.它可以从mysql网站下载

虽然试图让上面提到的例子起作用,但我发现自己因为mysql开发网站的变化而遇到困难.我为写这个作为答案而道歉,因为我还没有发表评论,并且会在我发现该做什么并找到解决方案时进行编辑,以便未来的开发人员可以得到帮助.(因为这已经变得如此之大,所以不会无论如何都适合作为评论,哈哈)

@ hd1链接到"一个例子"不再有效.在链接之后,最终会在页面上显示链接到主要手册的页面.主要手册是一个很好的参考,但似乎相当陈旧和过时,新开发人员很难,因为我们没有经验,特别是如果我们丢失某个文件,然后添加什么.

@ hd1的链接已经移动了,可以通过删除url组件快速搜索找到,只保留文章名称,不管怎么说: http ://dev.mysql.com/doc/connector-cpp/en/connector -cpp-例子完成-示例-1.HTML

获取7.5 MySQL Connector/C++完成示例1工作

下载:

- 获取mysql c ++连接器,即使它更大,选择安装程序包,而不是zip.

- 从boost.org获取boost库,因为boost用于connection.h,而mysql_connection.h来自mysql c ++连接器

现在继续:

- 将连接器安装到c驱动器,然后转到mysql服务器安装文件夹/ lib并复制所有libmysql文件,并粘贴到连接器安装文件夹/ lib/opt中

- 将boost库提取到c驱动器

下一个:

可以从示例中复制代码(上面链接,并且当然是新的c ++项目).您会注意到错误:

- 第一:改变

cout << "(" << __FUNCTION__ << ") on line " »
 << __LINE__ << endl;
Run Code Online (Sandbox Code Playgroud)

cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
Run Code Online (Sandbox Code Playgroud)

不确定那个微小的双箭头是什么,但我不认为它是c ++的一部分

-Second:通过阅读sql手册的第5章来修正它们的其他错误,请注意我关于下面第5章的段落

[注1]:第5章使用Microsoft Visual Studio构建MySQL Connector/C++ Windows应用程序 如果您按照本章使用最新的c ++连接器,您可能会看到连接器文件夹中的内容和图像中显示的内容完全不同.无论你是在mysql服务器上安装include和lib文件夹,还是在mysql c ++连接器文件夹'include和lib文件夹中,它都不会完全匹配,除非他们更新手册,或者你有神奇的下载,但对我来说他们没有与2014年3月发起的连接器下载相匹配.

按照第5章,

- 但是对于c/c ++,常规,附加包含目录包括您安装的连接器中的"include"文件夹,而不是服务器安装文件夹

- 尽管如此,还包括您的boost文件夹,请参阅下面的注释2

- 对于Linker,General ..等使用connector/lib/opt中的opt文件夹

*[注2]*第二个包含需要发生,你需要包括来自boost库variant.hpp,这与上面相同,添加你从boost zip下载中提取的主文件夹,而不是boost或lib或在boostmainfolder/boost中找到的子文件夹"variant".只是作为第二个包含的主文件夹

下一个:

接下来我认为是静态构建,这也是我所做的.跟着它.

然后构建/编译.出现LNK错误(编辑:将ide更改为visual studio 2008后消失).我认为这是因为我应该自己构建连接器(如果你在visual studio 2010中这样做,那么链接错误应该会消失),但是自从周四以来我一直试图让它工作,看看我是否有动力看到这一点在一个良好的睡眠后(并做了,现在完成:)).


Nic*_*erg 5

我必须将 -lmysqlcppconn 包含到我的构建中才能使其正常工作。