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

📅  最后修改于: 2021-10-21 05:17:57             🧑  作者: Mango

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

在开始主要文章之前,让我们熟悉一下使用的工具。

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

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

  2. API:我们将使用 SQLAPI++ 库

    下载链接: SQLAPI下载

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

  3. 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++ pgroram for connecting to database (and error handling)
      #include
      #include         // 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;
      }
      

      输出:

      We are Connected!
      We are Disconnected!
      
  1. 执行简单的 SQL 命令
    现在,我们将执行一个简单的 SQL 查询。首先,为数据库创建一个表:

    创建表 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));”);

    现在,要执行查询,我们必须使用以下命令:

    cmd.执行();

    完整代码:

    #include
    #include  // 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++ 程序连接到数据库并执行操作。