C++接口

1.概述

以下通过一个简单的示例来介绍C++客户端程序通过libuxsql库访问UXDB实例的方法和步骤。

2.开发环境

这里的开发环境是指C++客户端的开发环境,对数据库服务端的运行环境不做要求。 OS:Windows10 X64 tool chain:VS2010&SP1

3.启动服务

Database server运行在linux环境下,数据库集群testlocal连接信息:IP为192.168.1.82,端口为5432,用户名为uxdb,密码为123456。

4.连接示例

  1. 在VS2010中新建“Win32控制台应用程序”, 附加选项选择“空项目”。选择“文件”=>“新建项目”=>“Visual C++”=>“Win32 控制台应用程序”,自定义名称(例:testc),单击“确定”=>“下一步”=>“附加选项中选择空项目”=>单击“完成”。

  2. 右键“源文件”=>“添加”=>“新建项”=>“C++文件(.cpp)”,名称自定义输入(例:main)。代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    /*
    *	UXDB客户端头文件
    */
    #include "libuxsql-fe.h"
    static void
    exit_nicely(UXconn *conn)
    {
        UXSQLfinish(conn);
        exit(1);
    }
    int main(int argc, char **argv)
    {    
      const char *conninfo;
        UXconn     *conn;
        UXresult   *res;
        int         nFields;
        int         i,
                    j;
        /*
        * 如果用户在命令行上提供了一个参数,则拿它当作 conninfo 字串使用;
        * 否则缺省为 dbname=uxdb 并且使用环境变量或者所有其它连接参数
        * 都使用缺省值。
        */
        if (argc > 1)
            conninfo = argv[1];
        else
            conninfo = "host=192.168.1.82 port=5432 dbname=uxdb user=uxdb password=123456";
        /* 连接数据库 */
        conn = UXSQLconnectdb(conninfo);
        /* 检查后端连接成功建立 */
        if (UXSQLstatus(conn) != CONNECTION_OK)
        {
            fprintf(stderr, "Connection to database failed: %s",
                    UXSQLerrorMessage(conn));
            exit_nicely(conn);
        }
        /*
        * 我们的测试实例涉及游标的使用,这个时候我们必须使用事务块。
        * 我们可以把全部事情放在一个  "select * from ux_database"
        * UXSQLexec() 里,不过那样太简单了,不是个好例子。
        */
    
        /* 开始一个事务块 */
        res = UXSQLexec(conn, "BEGIN");
        if (UXSQLresultStatus(res) != UXRES_COMMAND_OK)
        {
            fprintf(stderr, "BEGIN command failed: %s", UXSQLerrorMessage(conn));
            UXSQLclear(res);
            exit_nicely(conn);
        }
        /*
        * 应该在结果不需要的时候 UXSQLclear UXresult,以避免内存泄漏
        */
        UXSQLclear(res);
        /*
        * 从系统表 ux_database(数据库的系统目录)里抓取数据
        */
        res = UXSQLexec(conn, "DECLARE myportal CURSOR FOR select * from ux_database");
        if (UXSQLresultStatus(res) != UXRES_COMMAND_OK)
        {
            fprintf(stderr, "DECLARE CURSOR failed: %s", UXSQLerrorMessage(conn));
            UXSQLclear(res);
            exit_nicely(conn);
        }
        UXSQLclear(res);
        res = UXSQLexec(conn, "FETCH ALL in myportal");
        if (UXSQLresultStatus(res) != UXRES_TUPLES_OK)
        {
            fprintf(stderr, "FETCH ALL failed: %s", UXSQLerrorMessage(conn));
            UXSQLclear(res);
            exit_nicely(conn);
        }
        /* 首先,打印属性名称 */
        nFields = UXSQLnfields(res);
        for (i = 0; i < nFields; i++)
            printf("%-15s", UXSQLfname(res, i));
        printf("\n\n");
        /* 然后打印行 */
        for (i = 0; i < UXSQLntuples(res); i++)
        {
            for (j = 0; j < nFields; j++)
                printf("%-15s", UXSQLgetvalue(res, i, j));
            printf("\n");
        }
        UXSQLclear(res);
        /* 关闭入口 ... 我们不用检查错误 ... */
        res = UXSQLexec(conn, "CLOSE myportal");
        UXSQLclear(res);
        /* 结束事务 */
        res = UXSQLexec(conn, "END");
        UXSQLclear(res);
        /* 关闭数据库连接并清理 */
        UXSQLfinish(conn);
        return 0;
    }
    
  3. 根据UXDB服务端的安装目录指定项目头文件和链接库文件目录。

    右键“项目”=>“属性”=>“配置属性”=>“VC++目录”,分别选择包含目录和库目录,进行编辑,分别添加uxdb\dbsql下的include目录和lib目录(编辑目录时勾选从父级或项目默认设置继承,目录根据实际路径编辑)。

  4. 右键“项目”=>“属性”=>“配置属性”=>“链接器”=>“输入”,编辑附加依赖项,输入libuxsql.lib,单击确定。

  5. 右键“项目”=>“属性”=>“配置管理器”,配置选择Debug,平台选择x64,单击确定。

  6. 右键“项目”=>“添加”=>“现有项”,添加“ssleay32.dll”、“_int.dll”、“libeay32.dll”、“libuxsql.dll”到创建的项目文件夹下,根据实际路径添加。

  7. 将uxdb\dbsql\bin目录添加到系统环境变量Path中。

    提示

    如果执行过程中有关于缺少某个dll文件的报错,需要根据实际情况将文件所在的目录添加到系统环境变量Path中。

  8. 右键“项目”=>“生成”,成功之后,进行刷新,也可以使用快捷键Ctrl+F5。

5.运行结果

重要

  1. 头文件和libuxsql连接依赖于Windows服务端的安装,主要是include和lib子目录下的头文件和DLL库。

  2. 连接字符串:host=192.168.1.82 port=5432 dbname=uxdb user=uxdb password=123456。