使用 C/C++ 连接MySQL数据库

MySQL 连接器C/C++

这是 MySQL Connector/C++ 的一个版本,它是用于与 MySQL 服务器通信的 C++ 接口

有关详细信息,请访问官方MySQL 连接器C/C++ 文档

许可

有关详细信息,请参阅此存储库中提供的文件 README 和 LICENSE,以及文档中的法律声明

下载并安装

MySQL Connector/C++ 可以从可以从MySQL 下载页面下载的预编译包安装。MySQL 在线手册中描述了从二进制分发安装 Connector/C++ 的过程

从源头构建

MySQL Connector/C++ 可以从源代码安装。请查看MySQL 在线手册

GitHub 存储库

此存储库包含最新发布版本的 MySQL 连接器/C++ 源代码。您应该期望在此处和最新发布的 Connector/C++ 包中看到相同的内容。

示例代码

#include <iostream>
#include <mysqlx/xdevapi.h>

using ::std::cout;
using ::std::endl;
using namespace ::mysqlx;


int main(int argc, const char* argv[])
try {

  const char   *url = (argc > 1 ? argv[1] : "mysqlx://root@127.0.0.1");

  cout << "Creating session on " << url
       << " ..." << endl;

  Session sess(url);

  cout <<"Session accepted, creating collection..." <<endl;

  Schema sch= sess.getSchema("test");
  Collection coll= sch.createCollection("c1", true);

  cout <<"Inserting documents..." <<endl;

  coll.remove("true").execute();

  {
    DbDoc doc(R"({ "name": "foo", "age": 1 })");

    Result add =
      coll.add(doc)
          .add(R"({ "name": "bar", "age": 2, "toys": [ "car", "ball" ] })")
          .add(R"({ "name": "bar", "age": 2, "toys": [ "car", "ball" ] })")
          .add(R"({
                 "name": "baz",
                  "age": 3,
                 "date": { "day": 20, "month": "Apr" }
              })")
          .add(R"({ "_id": "myuuid-1", "name": "foo", "age": 7 })")
          .execute();

    std::list<string> ids = add.getGeneratedIds();
    for (string id : ids)
      cout <<"- added doc with id: " << id <<endl;
  }

  cout <<"Fetching documents..." <<endl;

  DocResult docs = coll.find("age > 1 and name like 'ba%'").execute();

  int i = 0;
  for (DbDoc doc : docs)
  {
    cout <<"doc#" <<i++ <<": " <<doc <<endl;

    for (Field fld : doc)
    {
      cout << " field `" << fld << "`: " <<doc[fld] << endl;
    }

    string name = doc["name"];
    cout << " name: " << name << endl;

    if (doc.hasField("date") && Value::DOCUMENT == doc.fieldType("date"))
    {
      cout << "- date field" << endl;
      DbDoc date = doc["date"];
      for (Field fld : date)
      {
        cout << "  date `" << fld << "`: " << date[fld] << endl;
      }
      string month = doc["date"]["month"];
      int day = date["day"];
      cout << "  month: " << month << endl;
      cout << "  day: " << day << endl;
    }

    if (doc.hasField("toys") && Value::ARRAY == doc.fieldType("toys"))
    {
      cout << "- toys:" << endl;
      for (auto toy : doc["toys"])
      {
        cout << "  " << toy << endl;
      }
    }

    cout << endl;
  }
  cout <<"Done!" <<endl;
}
catch (const mysqlx::Error &err)
{
  cout <<"ERROR: " <<err <<endl;
  return 1;
}
catch (std::exception &ex)
{
  cout <<"STD EXCEPTION: " <<ex.what() <<endl;
  return 1;
}
catch (const char *ex)
{
  cout <<"EXCEPTION: " <<ex <<endl;
  return 1;
}

文档

https://github.com/mysql/mysql-connector-cpp

https://dev.mysql.com/doc/connector-cpp/1.1/en/connector-cpp-examples-complete-example-1.html

https://learn.microsoft.com/en-us/azure/mysql/single-server/connect-cpp

使用 C/C++ 的数据库连接

SQL(结构化查询语言)是第四代语言 (4GL),用于定义、操作和控制 RDBMS(关系数据库管理系统)。

在开始正文之前,让我们熟悉使用的工具。

编译器:带有 MinGW 编译器的 Code::Blocks IDE

下载链接: Binary Download Code::Blocks 是一个交叉编译器(它可以在任何平台上运行,如 Windows、Linux 和 Mac),并且可以免费下载。此 IDE 专为 C 和 C++ 设计,易于使用。

API:我们将使用 SQLAPI++ 库

下载链接: SQLAPI下载

SQLAPI++ 是一个 C++ 库(基本上是一组头文件),用于访问多个 SQL 数据库(Oracle、SQL Server、DB2、Sybase、Informix、InterBase、SQLBase、MySQL、PostgreSQL、SQLite、SQL Anywhere 和 ODBC)。它易于实现且简单。

OCCI: Oracle C++ 调用接口

下载链接:OCCI C++ 下载 OCCI 是由数据库公司 ORACLE 定义的接口,它为 C++ 程序员定义了一个舒适的接口,可以使用类似于 SQL 语句的参数访问 Oracle 数据库。该接口适用于 ORACLE 9i、ORACLE 10,并随 Oracle 一起提供。

我们必须下载并安装以上三个(如果我们没有的话)。现在我们几乎可以开始了。

  开始前的一些设置: -> 打开 code::blocks IDE 并转到或点击设置->编译器和调试器设置(您现在将看到全局编译器设置) -> 现在点击链接器设置中的“链接器设置”点击在添加按钮上并添加以下对于Windows 操作系统代码:
C:\SQLAPI\lib\libsqlapiddll.a C:\Program Files\CodeBlocks\MinGW\lib\libuser32.a C:\Program Files\CodeBlocks\MinGW\lib\libversion.a C:\Program Files\CodeBlocks\MinGW\ lib\liboleaut32.a C:\Program Files\CodeBlocks\MinGW\lib\libole32.a
这些将在您的 SQLAPI++ 中找到(如果您尚未在 C: 驱动器中提取,则选择适当的位置并将提到的文件添加到链接器设置)。上述代码用于添加库文件以连接 C/C++ 程序与 SQLAPI。基本上,有2个步骤:

  1. 连接到数据库(和错误处理) C++代码: 
// C++ program for connecting to database (and error handling)
#include<stdio.h>
#include<SQLAPI.h>		 // main SQLAPI++ header

int main(int argc, char* argv[])
{
	// create connection object to connect to database
	SAConnection con;
	try
	{
		// connect to database
		// in this example, it is Oracle,
		// but can also be Sybase, Informix, DB2
		// SQLServer, InterBase, SQLBase and ODBC
		con.Connect ("test", // database name
					"tester", // user name
					"tester", // password
					SA_Oracle_Client); //Oracle Client
		printf("We are connected!\n");

		// Disconnect is optional
		// autodisconnect will occur in destructor if needed
		con.Disconnect();
		printf("We are disconnected!\n");
	}

	catch(SAException & x)
	{
		// SAConnection::Rollback()
		// can also throw an exception
		// (if a network error for example),
		// we will be ready
		try
		{
			// on error rollback changes
			con.Rollback ();
		}
		catch(SAException &)
		{
		}
		// print error message
		printf("%s\n", (const char*)x.ErrText());
	}
	return 0;
}
  1. 输出:
We are Connected!
We are Disconnected!
  1. 执行一个简单的 SQL 命令现在,我们将执行一个简单的 SQL 查询。首先,为数据库创建一个表:create table tb1(id number, name varchar(20);

现在,在您的 con.connect 之后建立与数据库的连接;方法你应该使用 cmd.setCommandText 方法将查询传递给数据库,如下所示:

con.Connect("test", "tester", "tester", SA_Oracle_Client);
cmd.setCommandText("create table tb1(id number, name varchar(20));”);
  1. 现在,要执行查询,我们必须使用以下命令: cmd.Execute(); 完整代码: 
#include<stdio.h>
#include <SQLAPI.h> // main SQLAPI++ header
int main(int argc, char* argv[])
{
	SAConnection con; // connection object to connect to database
	SACommandcmd; // create command object
	try
	{
		// connect to database (Oracle in our example)
		con.Connect("test", "tester", "tester", SA_Oracle_Client);

		// associate a command with connection
		// connection can also be specified in SACommand constructor
		cmd.setConnection(&con);

		// create table
		cmd.setCommandText("create table tbl(id number, name varchar(20));");
		cmd.Execute();

		// insert value
		cmd.setCommandText("Insert into tbl(id, name) values (1,”Vinay”)");
		cmd.setCommandText("Insert into tbl(id, name) values (2,”Kushal”)");
		cmd.setCommandText("Insert into tbl(id, name) values (3,”Saransh”)");
		cmd.Execute();

		// commit changes on success
		con.Commit();
		printf("Table created, row inserted!\n");
	}

	catch(SAException &x)
	{
		// SAConnection::Rollback()
		// can also throw an exception
		// (if a network error for example),
		// we will be ready
		try
		{
			// on error rollback changes
			con.Rollback();
		}
		catch(SAException &)
		{
		}
		// print error message

		printf("%s\n", (const char*)x.ErrText());
	}
	return 0;
}

正如我们所知,Oracle 不是自动提交的(提交是在数据库中永久反映数据),所以我们必须提交它。

con.Commit();

同样,我们可以在发生异常时回滚事务,因此我们使用:

con.Rollback();

为了删除一行,我们使用这个命令。

cmd.setCommandText("delete from tb1 where id= 2");

因此,在本文结束时,我们已经学习了如何将 C/C++ 程序连接到数据库并执行操作。