【问题标题】:JDBC ERROR : AbstractMethodError: com.microsoft.sqlserver.jdbc.SQLServerConnection.createArrayOf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/ArrayJDBC 错误:AbstractMethodError:com.microsoft.sqlserver.jdbc.SQLServerConnection.createArrayOf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/Array
【发布时间】:2014-12-23 12:59:57
【问题描述】:

您好,我只是从 SQL SERVER 中选择数据并将其放入结果集中。 我遇到了错误。

**JDBC ERROR : AbstractMethodError: com.microsoft.sqlserver.jdbc.SQLServerConnection.createArrayOf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/Array**

下面这行的问题

    java.sql.Array sqlarray = sqlcon.createArrayOf(null, rowValues.toArray());

我不确定为什么会出现这个问题以及我应该传递什么确切的参数 createArrayOf().. 请帮助解决以下问题

这是我的完整代码

    public void getDatafromsql(ArrayList rowValues) throws SQLException,ClassNotFoundException 
    {
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    System.out.println("SQL Server Start Connecting ");
    Connection sqlcon = DriverManager
            .getConnection(s_url, s_username, s_password);
    System.out.println("Sql server Connection valid");
    System.out.println(rowValues);
    PreparedStatement s1 = sqlcon.prepareStatement("SELECT TOP 6 myid,document,name FROM table1 where DATEMODIFIED between ? and ? and myid in (?)");
    s1.setTimestamp( 1,V_DOC_LAST_REFRESH_TIMESTAMP);
    s1.setTimestamp( 2,V_DOC_CURRENT_REFRESH_TIMESTAMP);
    //Below line throwing error
    java.sql.Array sqlarray = sqlcon.createArrayOf(null, rowValues.toArray());
    s1.setArray(3, sqlarray);
    sql_rs = s1.executeQuery();
    setdataOracle(sql_rs);
    System.out.println("SQL Server Storage Completed ");
    sqlcon.close();
    }

【问题讨论】:

  • 您使用的是哪个 JDBC 驱动程序版本。 AbstractMethodError 表示一个未实现的方法
  • SQL Server 是否支持数组?

标签: javascript java sql-server jdbc


【解决方案1】:

SQL Server JDBC 驱动程序不支持该方法:

public java.sql.Array createArrayOf(String typeName,

        Object[] elements) throws SQLException {

    // Not implemented

    throw new SQLFeatureNotSupportedException(SQLServerException.getErrString("R_notSupported"));

}

https://github.com/Microsoft/mssql-jdbc/blob/master/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerConnection.java

改为使用Table Valued Parameters,或将数据作为XMLJSONCSV 传递并在服务器上解析。

【讨论】:

    【解决方案2】:

    你试过打电话吗

    sqlcon.createArrayOf("INT", rowValues.toArray());
    

    sqlcon.createArrayOf("integer", rowValues.toArray());
    

    或您的数据库系统支持的某些数据类型。 如果没有任何效果,可能您使用的驱动程序不支持数组。 在这种情况下,创建占位符(?)“硬编码”并使用

    s1.setInt(i, intValue);
    

    在一个循环中(其中 i 是 3 到(数组大小 + 3))而不是

    s1.setArray(3, sqlarray);
    

    【讨论】:

      【解决方案3】:

      示例如何使用表值参数作为 SQL Server 的解决方案,因为 createArrayOf() 尚不支持。

      private void createTableType() throws SQLException, IOException, ClassNotFoundException {
          try(Statement stmt = DBUtils.dbConnect().createStatement()){
              stmt.executeUpdate("IF NOT EXISTS (SELECT * FROM sys.types WHERE is_table_type = 1 AND name = 'Codes' ) " +
                      "BEGIN CREATE TYPE dbo.Codes AS TABLE (Code VARCHAR(25)) END");
          }catch (ClassNotFoundException | SQLException e){
              if(e instanceof SQLException){
                  DBUtils.printSQLException((SQLException) e);}
              e.printStackTrace();
              throw e;
          }
      }
      
      public void tableValuedParamQuery(List<String> params) throws IOException, SQLException, ClassNotFoundException {
          try {
              createTypeTable();
              SQLServerPreparedStatement ssps = (SQLServerPreparedStatement) dbConnect().prepareStatement(
                      "SELECT * FROM dbo.Products p" +
                           "INNER JOIN ? AS c ON c.Code = p.Code"
              );
              SQLServerDataTable dt = new SQLServerDataTable();
              dt.addColumnMetadata("Codes", Types.VARCHAR);
              params.forEach(e -> {
                  try {
                      dt.addRow(e);
                  } catch (SQLServerException ex) {
                      ex.printStackTrace();
                  }
              });
              ssps.setStructured(1, " dbo.Codes", dt);
              ResultSet rs = ssps.executeQuery();
          }catch (ClassNotFoundException | SQLException e){
              if(e instanceof SQLException){
                  DBUtils.printSQLException((SQLException) e);}
              e.printStackTrace();
              throw e;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 2016-05-07
        相关资源
        最近更新 更多