ODBC

在 JDBC 插件的基础上,IoTDB 可以通过 ODBC-JDBC 桥来支持通过 ODBC 对数据库的操作。

1. 依赖

  • 带依赖打包的 IoTDB JDBC 插件包
  • ODBC-JDBC 桥(如 Zappy-Sys)

2. 部署方法

2.1 准备 JDBC 插件包

下载 IoTDB 源码,在根目录下执行下面的命令:

mvn clean package -pl iotdb-client/jdbc -am -DskipTests -P get-jar-with-dependencies

之后,就可以在iotdb-client/jdbc/target目录下看到iotdb-jdbc-1.3.2-SNAPSHOT-jar-with-dependencies.jar文件。

2.2 准备 ODBC-JDBC 桥

注意: 这里给出的仅仅是一种 ODBC-JDBC 桥,仅作示例。读者可以自行寻找其他的 ODBC-JDBC 桥来对接 IoTDB 的 JDBC 插件。

  1. 下载 Zappy-Sys ODBC-JDBC 桥插件: 进入 https://zappysys.com/products/odbc-powerpack/odbc-jdbc-bridge-driver/ 网站,点击下载按钮并直接安装。

    ZappySys_website.jpg

  2. 准备 IoTDB:打开 IoTDB 集群,并任意写入一条数据。

    IoTDB > insert into root.ln.wf02.wt02(timestamp,status) values(1,true)
    
  3. 部署及调试插件

    1. 打开 ODBC 数据源 32/64 位,取决于 Windows 的位数,一个示例的位置是 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools

      ODBC_ADD_CN.jpg

    2. 点击添加,选择 ZappySys JDBC Bridge。

      ODBC_CREATE_CN.jpg

    3. 填写如下配置:

      配置项填写内容示例
      Connection Stringjdbc:iotdb://<IoTDB 的 IP>:<IoTDB 的 rpc port>/jdbc:iotdb://127.0.0.1:6667/
      Driver Classorg.apache.iotdb.jdbc.IoTDBDriverorg.apache.iotdb.jdbc.IoTDBDriver
      JDBC driver file(s)IoTDB JDBC jar-with-dependencies 插件路径C:\Users\13361\Documents\GitHub\iotdb\iotdb-client\jdbc\target\iotdb-jdbc-1.3.2-SNAPSHOT-jar-with-dependencies.jar
      User nameIoTDB 的用户名root
      User passwordIoTDB 的密码root

      ODBC_CONNECTION.png

    4. 点击 Test Connection 按钮,应该显示连接成功。

      ODBC_CONFIG_CN.jpg

    5. 点击上方的 Preview, 将查询文本换为 select * from root.**,点击 Preview Data,应该正确显示查询结果。

      ODBC_TEST.jpg

  4. 使用 ODBC 操作数据:正确部署后,就可以使用 Windows 的 ODBC 库,对 IoTDB 的数据进行操作。 这里给出 C# 语言的代码示例:

    using System.Data.Odbc;
    
    // Get a connection
    var dbConnection = new OdbcConnection("DSN=ZappySys JDBC Bridge");
    dbConnection.Open();
    
    // Execute the write commands to prepare data
    var dbCommand = dbConnection.CreateCommand();
    dbCommand.CommandText = "insert into root.Keller.Flur.Energieversorgung(time, s1) values(1715670861634, 1)";
    dbCommand.ExecuteNonQuery();
    dbCommand.CommandText = "insert into root.Keller.Flur.Energieversorgung(time, s2) values(1715670861634, true)";
    dbCommand.ExecuteNonQuery();
    dbCommand.CommandText = "insert into root.Keller.Flur.Energieversorgung(time, s3) values(1715670861634, 3.1)";
    dbCommand.ExecuteNonQuery();
    
    // Execute the read command
    dbCommand.CommandText = "SELECT * FROM root.Keller.Flur.Energieversorgung";
    var dbReader = dbCommand.ExecuteReader();
    
    // Write the output header
    var fCount = dbReader.FieldCount;
    Console.Write(":");
    for(var i = 0; i < fCount; i++)
    {
        var fName = dbReader.GetName(i);
        Console.Write(fName + ":");
    }
    Console.WriteLine();
    
    // Output the content
    while (dbReader.Read())
    {
        Console.Write(":");
        for(var i = 0; i < fCount; i++) 
        {
            var fieldType = dbReader.GetFieldType(i);
            switch (fieldType.Name)
            {
                case "DateTime":
                    var dateTime = dbReader.GetInt64(i);
                    Console.Write(dateTime + ":");
                    break;
                case "Double":
                    if (dbReader.IsDBNull(i)) 
                    {
                        Console.Write("null:");
                    }
                    else 
                    {
                        var fValue = dbReader.GetDouble(i);
                        Console.Write(fValue + ":");
                    }   
                    break;
                default:
                    Console.Write(fieldType.Name + ":");
                    break;
            }
        }
        Console.WriteLine();
    }
    
    // Shut down gracefully
    dbReader.Close();
    dbCommand.Dispose();
    dbConnection.Close();
    

    运行该程序可以向 IoTDB 内写入数据,并且查询并打印写入的数据。