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の簡略化されたパラメーターメタデータを生成する必要がありますか?

generateSimpleParameterMetadatatrueに設定する必要があります

これに似た接続文字列を使用してください

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

MySQL JDBC ドライバーは現在サポートしていません。私は同様の問題を解決しており、次の回避策を考え出しました。

  1. プロジェクトに H2 データベースを含めます (組み込みモードまたはメモリ内で実行することもできます)。
  2. MySQL データベース作成スクリプトを H2 構文に変換します (または両方と互換性があるように ANSI で記述します)。
  3. 最初に H2 データベースで準備済みステートメントをコンパイルし、それらからメタデータを取得します - 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 に答える