使用 JDBC 在 KDB 数据库中执行查询

Posted

技术标签:

【中文标题】使用 JDBC 在 KDB 数据库中执行查询【英文标题】:Executing queries in KDB database using JDBC 【发布时间】:2016-04-09 06:28:18 【问题描述】:

我可以执行以下代码从表中选择所有数据:-

package com.jdbc;
import java.sql.*;
//in kdb+3.x and above
//init table with
//\p 5001
//Employees:([]id:0 1 2;firstName:`Charlie`Arthur`Simon;lastName:`Skelton`Whitney`Garland;age:10 20 30;timestamp:.z.p+til 3)
public class Selection

  static final String JDBC_DRIVER="jdbc";
  static final String DB_URL="jdbc:q:localhost:5001";
  static final String USER="";
  static final String PASS="";
  public static void main(String[] args)
    Connection conn=null;
    Statement stmt=null;
    try
      Class.forName(JDBC_DRIVER);
      System.out.println("Connecting to database...");
      conn=DriverManager.getConnection(DB_URL,USER,PASS);
      System.out.println("Creating statement...");
      stmt=conn.createStatement();
      ResultSet rs=stmt.executeQuery("SELECT id, firstName, lastName, age,timestamp FROM Employees");
      while(rs.next())
        long id=rs.getLong("id");
        long age=rs.getLong("age");
        String first=rs.getString("firstName");
        String last=rs.getString("lastName");
        Timestamp timestamp=rs.getTimestamp("timestamp");
        System.out.print("ID: "+id);
        System.out.print(", Age: "+age);
        System.out.print(", FirstName: "+first);
        System.out.println(", LastName: "+last);
        System.out.println(", Timestamp: "+timestamp);
      
      rs.close();
      stmt.close();
      conn.close();
    catch(SQLException se)
      se.printStackTrace();
    catch(Exception e)
      e.printStackTrace();
    finally
      try
        if(stmt!=null)
          stmt.close();
      catch(SQLException se2)
      
      try
        if(conn!=null)
          conn.close();
      catch(SQLException se)
        se.printStackTrace();
      
    
  

但是每当我尝试运行其他查询时,代码都会给我错误,例如,对于以下代码:-

package com.jdbc;
import java.sql.*;

//in kdb+3.x and above
//init table with
//\p 5001
//Employees:([]id:0 1 2;firstName:`Charlie`Arthur`Simon;lastName:`Skelton`Whitney`Garland;age:10 20 30;timestamp:.z.p+til 3)

public class Insertion 

  static final String JDBC_DRIVER="jdbc";
  static final String DB_URL="jdbc:q:localhost:5001";
  static final String USER="";
  static final String PASS="";

  public static void main(String[] args)
    Connection conn=null;
    Statement stmt=null;
    try
      Class.forName(JDBC_DRIVER);

      System.out.println("Connecting to database...");
      conn=DriverManager.getConnection(DB_URL,USER,PASS);

      System.out.println("Creating statement...");
      stmt=conn.createStatement();
      stmt.executeUpdate("INSERT INTO Employees VALUES(9, 10, 'X', 'Y', " + new java.sql.Timestamp(0) + ")");

      stmt.close();
      conn.close();
    catch(SQLException se)
      se.printStackTrace();
    catch(Exception e)
      e.printStackTrace();
    finally
      try
        if(stmt!=null)
          stmt.close();
      catch(SQLException se2)
      
      try
        if(conn!=null)
          conn.close();
      catch(SQLException se)
        se.printStackTrace();
      
    
  

对于此代码,我收到以下错误:-

正在连接数据库...正在创建语句... java.sql.SQLException: 在 jdbc.q(jdbc.java:22) 在 jdbc$co.ex(jdbc.java:26) 在 jdbc$st.executeUpdate(jdbc.java:89) 在 com.jdbc.Insertion.main(Insertion.java:27)

当我尝试使用聚合函数进行选择查询时,我经常会遇到类似的错误。总而言之,我只能做简单的数据选择。

有什么线索吗?

是否有任何研究;关于如何使用 JDBC 对 KDB 数据库进行复杂查询的链接?

我也尝试过使用准备好的语句(代码如下),但仍然没有运气:-

package com.jdbc;
import java.sql.*;

//in kdb+3.x and above
//init table with
//\p 5001
//Employees:([]id:0 1 2;firstName:`Charlie`Arthur`Simon;lastName:`Skelton`Whitney`Garland;age:10 20 30;timestamp:.z.p+til 3)

public class Insertion 

  static final String JDBC_DRIVER="jdbc";
  static final String DB_URL="jdbc:q:localhost:5001";
  static final String USER="";
  static final String PASS="";

  public static void main(String[] args)
    Connection conn=null;
    PreparedStatement stmt=null;
    try
      Class.forName(JDBC_DRIVER);

      System.out.println("Connecting to database...");
      conn=DriverManager.getConnection(DB_URL,USER,PASS);

      System.out.println("Creating statement...");
      stmt=conn.prepareStatement("INSERT INTO Employees(id,firstName,lastName,age,timestamp) VALUES(?, ?, ?, ?, ?)");
  stmt.setInt(1, 10);
  stmt.setString(2, "X");
  stmt.setString(3, "Y");
  stmt.setInt(4, 5);
  stmt.setTimestamp(5, new Timestamp(0));
      stmt.executeUpdate();

      stmt.close();
      conn.close();
    catch(SQLException se)
      se.printStackTrace();
    catch(Exception e)
      e.printStackTrace();
    finally
      try
        if(stmt!=null)
          stmt.close();
      catch(SQLException se2)
      
      try
        if(conn!=null)
          conn.close();
      catch(SQLException se)
        se.printStackTrace();
      
    
  

【问题讨论】:

使用准备好的语句:docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html 我也用过,还是遇到同样的错误。 更新了帖子以包含代码。 糟糕,我的错。我已经更新了更正的代码。我也尝试过执行,但错误仍然相同。 这是完整的堆栈跟踪。 【参考方案1】:

尝试使用原生 API 而不是 JDBC。

【讨论】:

【参考方案2】:

我一直在努力解决同样的 INSERT 问题。纯属偶然,发现如果将 'VALUES' 更改为小写的 'values' ,则 static INSERT 语句开始工作。尽管如此,PreparedStatement 执行仍然没有运气。 (就我而言,不幸的是,不能使用原生 API。)

【讨论】:

以上是关于使用 JDBC 在 KDB 数据库中执行查询的主要内容,如果未能解决你的问题,请参考以下文章

KDB:聚合查询结果的类型转换不当

gdb调试工具常用命令 && kdb

JDBC查询数据实例

我想在 Java Eclipse 中使用 JDBC 对上一个查询的 ResultSet 执行另一个 SQL 查询

在 VBA 中使用 KDB+/qodbc.dll 的 ADO

MSSQL 查询执行计划缓存和 JDBC