17

我想获取给定准备语句的参数名称和参数类型。我正在使用 MySQL 数据库。但是当我运行我的程序时,它会抛出一个错误:

Exception in thread "main" java.sql.SQLException: Parameter metadata not available for the   given statement

在这条线上

String paramTypeName = paramMetaData.getParameterTypeName(param);

我不知道为什么会这样。如果可能的话,请任何人帮助我。

这是我的代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.Statement;

public class Main {
  public static void main(String[] args) throws Exception {
    Connection conn = getMySqlConnection();
    Statement st = conn.createStatement();

    String query = "select * from survey where id > ? and name = ?";
    PreparedStatement pstmt = conn.prepareStatement(query);
    ParameterMetaData paramMetaData = pstmt.getParameterMetaData();
    if (paramMetaData == null) {
      System.out.println("db vendor does NOT support ParameterMetaData");
    } else {
      System.out.println("db vendor supports ParameterMetaData");
      // find out the number of dynamic parameters
      int paramCount = paramMetaData.getParameterCount();
      System.out.println("paramCount=" + paramCount);
      System.out.println("-------------------");
      for (int param = 1; param <= paramCount; param++) {
        System.out.println("param number=" + param);
        String paramTypeName = paramMetaData.getParameterTypeName(param);
        System.out.println("param SQL type name=" + paramTypeName);
      }
    }
    pstmt.close();
    conn.close();
  }

public static Connection getMySqlConnection() throws Exception {
    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/mydb";
    String username = "root";
    String password = "";
    Class.forName(driver);
    Connection conn = DriverManager.getConnection(url, username, password);
    return conn;
  }

}
4

3 回答 3

13

据此_

当由于服务器不支持准备语句或服务器端准备语句被禁用而没有可用的元数据时,驱动程序是否应该为 PreparedStatements 生成简化的参数元数据?

你必须设置generateSimpleParameterMetadata为真

使用与此类似的连接字符串

jdbc:mysql://localhost:3306/mydb?generateSimpleParameterMetadata=true
于 2013-01-28T09:05:26.440 回答
2

MySQL JDBC 驱动程序目前不支持它。我正在解决类似的问题,并提出了以下解决方法:

  1. 在您的项目中包含 H2 数据库(它也可以在嵌入式模式或内存中运行)
  2. 将您的 MySQL 创建数据库脚本转换为 H2 语法(或用 ANSI 编写,以便与两者兼容)
  3. 先在H2数据库上编译prepared statements并从中获取元数据-H2数据库支持此功能,大多数情况下SQL查询语法相似-然后将获取的元信息保存以备后用
  4. 数据类型等方面可能存在差异,但总的来说,这应该让您与 MySQL 有大约 80% 的匹配,而不会有太多麻烦

我知道它有很多警告,但它可能适用于某些用例。

还可以考虑将 MySQL 数据库升级到 5.7,有一些与准备好的语句相关的增强功能可能会有所帮助,但我对这些不是很了解:

于 2015-01-14T10:47:01.793 回答
1

您尚未将参数设置为准备好的语句,否则您将无法获取参数元数据。所以首先设置参数

pstmt.setInt(val)
pstmt.setString(val)

添加参数后,您可以获得有关参数的元数据。

希望这可以帮助。

于 2013-01-28T09:07:08.333 回答