JDBC的ParameterMetaData类抛java.sql.SQLException: Parameter metadata not available for the given statement错误

ParameterMetaData用于获取关于PreparedStatement对象中每个参数标记的类型和属性信息的对象。对于某些查询和驱动程序的实现,由ParameterMetaData对象返回的数据在PreparedStatement执行前可能不可用。 但是在使用MySQL通过ParameterMetaData获取关于PreparedStatement参数信息时抛出了如下异常信息:java.sql.SQLException: Parameter metadata not available for the given statement

ParameterMetaData用于获取关于PreparedStatement对象中每个参数标记的类型和属性信息的对象。对于某些查询和驱动程序的实现,由ParameterMetaData对象返回的数据在PreparedStatement执行前可能不可用。 但是在使用MySQL通过ParameterMetaData获取关于PreparedStatement参数信息时抛出了如下异常信息:java.sql.SQLException: Parameter metadata not available for the given statement

java代码如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.bug315.C;

/**
 * 测试ParameterMetaData类的功能
 * @date 2016年4月4日10:26:21
 */
public class ParameterMetaDataTest {
    
    public static void main(String[] args) throws Exception {
        Class.forName(C.DRIVER);
        /**
         * 旧地址为“jdbc:mysql://localhost:3306/java_jdbc”,
         * 由于MySQL的ParameterMetaData获取参数参数元数据信息失败,因此需要添加
         * generateSimpleParameterMetadata=true选项,默认该选项为false;
         * 详细信息见数据库驱动说明信息。
         */
        String url = C.URL + "?generateSimpleParameterMetadata=true";
        Connection conn = DriverManager.getConnection(url, C.USERNAME, C.PASSWORD);
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT n_id,c_name,n_age,c_phone,n_salary,c_email");
        sql.append(" FROM t_user WHERE n_id=? AND c_name=? AND n_age=?");
        PreparedStatement ps = conn.prepareStatement( sql.toString() );
        System.out.println( ps );
        
        // 获取参数元信息
        ParameterMetaData pm = ps.getParameterMetaData();
        int count = pm.getParameterCount();
        System.out.println("getParameterCount = " + count);
        
        for (int i = 1; i <= count; i ++ ) {
            System.out.println("getParameterClassName=" + pm.getParameterClassName(i) );
            System.out.println("getParameterMode=" + pm.getParameterMode(i) );
            System.out.println("getParameterType=" + pm.getParameterType(i) );
            System.out.println("getParameterTypeName=" + pm.getParameterTypeName(i) );
            System.out.println("getPrecision=" + pm.getPrecision(i) );
            System.out.println("getScale=" + pm.getScale(i) );
            System.out.println("isNullable=" + pm.isNullable(i) );
            System.out.println("isSigned=" + pm.isSigned(i) );
            System.out.println();
        }
        
        ps.setInt(1, 1);
        ps.setString(2, "zhangsan");
        ps.setInt(3, 27);
        ResultSet rs = ps.executeQuery();
        // 输出结果信息
        while ( rs.next() ) {
            int index = 1;
            StringBuffer buffer = new StringBuffer();
            buffer.append("n_id=").append( rs.getInt(index++) )
                .append(", c_name=").append( rs.getString(index++) )
                .append(", n_age=").append( rs.getInt(index++) )
                .append(", c_phone=").append( rs.getString(index++) )
                .append(", n_salary=").append( rs.getDouble(index++) )
                .append(", c_email=").append( rs.getString(index++) );
            System.out.println( buffer.toString() );
        }
    }
}

在默认情况下generateSimpleParameterMetadata=false,因此我们使用ParameterMetaData获取PreparedStatment参数信息时抛出了异常。因此我们需要将generateSimpleParameterMetadata设置为true。下面是MySQL驱动程序给出generateSimpleParameterMetadata属性的说明:



generateSimpleParameterMetadata

Should the driver generate simplified parameter metadata for PreparedStatements when no metadata is available either because the server couldn't support preparing the statement, or server-side prepared statements are disabled?

Default: false

Since version: 5.0.5

但是,即使我们设置了generateSimpleParameterMetadata=true,但是isNullable()方法还是将抛出异常,这就可能是MySQL驱动程序的Bug或实现缺陷吧!!!

生活总会给你答案的,但不会马上把一切都告诉你。只要你肯等一等,生活的美好,总在你不经意的时候,盛装莅临。
1 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号