Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MySql DB获取java中prepared语句的元数据_Java_Mysql_Metadata_Sqlexception - Fatal编程技术网

使用MySql DB获取java中prepared语句的元数据

使用MySql DB获取java中prepared语句的元数据,java,mysql,metadata,sqlexception,Java,Mysql,Metadata,Sqlexception,我想获取给定准备语句的参数名和参数类型。我正在使用MySQL数据库。但当我运行程序时,它会抛出一个错误: Exception in thread "main" java.sql.SQLException: Parameter metadata not available for the given statement 在这条线上 String paramTypeName = paramMetaData.getParameterTypeName(param); 我不知道为什么会这样。如果可

我想获取给定准备语句的参数名和参数类型。我正在使用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;
  }

}
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.ParameterMetaData;
导入java.sql.PreparedStatement;
导入java.sql.Statement;
公共班机{
公共静态void main(字符串[]args)引发异常{
连接conn=getMySqlConnection();
语句st=conn.createStatement();
String query=“从调查中选择*,其中id>和name=?”;
PreparedStatement pstmt=conn.prepareStatement(查询);
ParameterMetaData paramMetaData=pstmt.getParameterMetaData();
if(paramMetaData==null){
System.out.println(“db供应商不支持ParameterMetaData”);
}否则{
System.out.println(“db供应商支持ParameterMetaData”);
//找出动态参数的数量
int paramCount=parammadata.getParameterCount();
System.out.println(“paramCount=“+paramCount”);
System.out.println(“------------------------”;
对于(int-param=1;param根据

如果没有,驱动程序是否应该为PreparedStatements生成简化的参数元数据 元数据可用,原因可能是服务器无法支持准备语句,或者 服务器端准备的语句被禁用?

您必须将
generateSimpleParameterMetadata
设置为true

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

jdbc:mysql://localhost:3306/mydb?generateSimpleParameterMetadata=true

您尚未将参数设置为准备好的语句,如果没有这些语句,则无法获取参数元数据。因此,请先设置参数

pstmt.setInt(val)
pstmt.setString(val)
添加参数后,可以获得有关参数的元数据


希望这有帮助。

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

  • 在项目中包括H2数据库(它也可以在嵌入式模式或内存中运行)
  • 将MySQL创建数据库脚本转换为H2语法(或者用ANSI编写,以便两者兼容)
  • 首先在H2数据库上编译准备好的语句并从中获取元数据-H2数据库支持此功能,SQL查询语法在大多数情况下类似-然后保存获取的元数据信息以供以后使用
  • 在数据类型等方面可能会有差异,但通常情况下,这会让您与MySQL的匹配率达到80%左右,而不会有太多麻烦
  • 我知道它有很多警告,但在某些用例中可能会起作用

    还考虑将MySQL数据库升级到5.7,有一些与准备好的语句相关的改进可能会有帮助,但是我对那些:


    哪一行抛出该
    SQLException
    ?字符串paramTypeName=paramMetaData.getParameterTypeName(param);顺便说一句,这一行是无用的
    语句st=conn.createStatement();
    为哪个参数获得该异常(
    param
    值)?嗨,Bhesh Gurung…我已经试过了,执行得很好。谢谢Bhavik…我的代码在URL中添加了“generateSimpleParameterMetadata=true”后仍在工作,但它给出的参数类型是“VARCHAR”,在我的例子中,参数是“INTEGER”。当我给出这个查询时:-“select*from test1 where age>?”。它给出的参数类型是“VARCHAR”。但在我的例子中,参数是“age”,这是“INTEGER”类型。请使用数据库再次检查它。不应该发生这种情况。请使用
    getParameterClassName(int-param)
    检查您得到的值是多少?