0

私のコードのほとんどは機能しているようですが、スレッド「メイン」で例外が発生し続けますjava.sql.SQLException:パラメーターインデックスが範囲外です(1>パラメーターの数。0です)。これは、readDatabase()のfinallyブロックの後に発生します。印刷ステートメントSystem.out.println( "DOESN'T GET HERE");には到達しません。どうしてか分かりません。これがすべてが処理されるクラスです。メインクラスでは、このオブジェクトのオブジェクトを作成し、readDatabase()を呼び出します。

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

//static because when creating an object of it in main, you won't have to make an object of the outer class (SQLProject) first
public class MySQLAccess{
    private Connection connect = null;
    private Statement statement = null;
    private PreparedStatement preparedStatement = null;
    private ResultSet resultSet = null;

    public void readDatabase() throws Exception
    {
        try{
            Class.forName("com.mysql.jdbc.Driver");
            connect = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "");

            statement = connect.createStatement();
            System.out.println("here1");
            resultSet = statement.executeQuery("select * from test.comments");
            writeResultSet(resultSet);

            preparedStatement = connect.prepareStatement("INSERT INTO test.comments values(default, ?, ?, ?, ?, ?, ?)");
            //columsn in test.comments
            // myuser, email, webpage, datum, summary, COMMENTS
            preparedStatement.setString(1, "Test");
            preparedStatement.setString(2, "TestEmail");
            preparedStatement.setString(3, "TestWebpage");
            preparedStatement.setDate(4, new java.sql.Date(2009, 12, 11));
            preparedStatement.setString(5, "Test Summary");
            preparedStatement.setString(6, "Test Comment");
            System.out.println("here2");
            preparedStatement.executeUpdate();

            preparedStatement = connect.prepareStatement("SELECT myuser, webpage, datum, summary, comments FROM test.comments");
            System.out.println("here3");
            resultSet = preparedStatement.executeQuery();
            writeResultSet(resultSet);

            preparedStatement = connect.prepareStatement("DELETE FROM test.comments WHERE myuser='?';");
            preparedStatement.setString(1, "Test");
            preparedStatement.executeUpdate();

            resultSet = statement.executeQuery("SELECT * FROM test.comments;");
            System.out.println("Writing meta data");
            writeMetaData(resultSet);
        }
        catch (Exception e){
            throw e;
        }
        finally{ 
            close();
            System.out.println("ALMOST");
            }
        System.out.println("DOESN'T GET HERE");
    }

    private void writeMetaData(ResultSet resultSet) throws SQLException
    {
        System.out.println("The columns in the table are: ");
        System.out.println("Table: " + resultSet.getMetaData().getTableName(1));

        for(int i=1;i<=resultSet.getMetaData().getColumnCount(); i++)
        {
            System.out.println("Column " + i + " " + resultSet.getMetaData().getColumnName(i));
        }
    }

    private void writeResultSet(ResultSet resultSet) throws SQLException
    {
        while(resultSet.next())
        {
            String user = resultSet.getString("myuser");
            String website = resultSet.getString("webpage");
            String summary = resultSet.getString("summary");
            Date date = resultSet.getDate("datum");
            String comment = resultSet.getString("comments");

            System.out.println("User: " + user);
            System.out.println("website: " + website);
            System.out.println("summary: " + summary);
            System.out.println("date: " + date);
            System.out.println("comment: " + comment);
        }
    }

    private void close()
    {
        try{
            if(resultSet != null)
                resultSet.close();
            if(statement != null)
                statement.close();
            if(connect != null)
                connect.close();

        }
        catch(Exception e){
            e.printStackTrace();
            System.out.println("hello");
            System.out.println(e);
        }
    }
}//private inner class
4

1 に答える 1

3
preparedStatement = 
    connect.prepareStatement("DELETE FROM test.comments WHERE myuser='?';");
preparedStatement.setString(1, "Test");

これは問題のあるステートメントです。疑問符は引用符で囲まれているため、ステートメントパーサーは疑問符を見つけることができず、次のステートメントはエラーをスローします。

パラメータタイプは文字列ですが、対応するプレースホルダーを引用符で囲むことはできません。プリペアドステートメントプロセッサは、パラメータのデータ型に基づいて適切なSQLを生成します。?したがって、任意のデータ型のパラメーターのプレースホルダーとして使用する必要があるのは常にプレーンです。

したがって、これら2つのステートメントは単純に次のようになります。

preparedStatement = 
    connect.prepareStatement("DELETE FROM test.comments WHERE myuser=?");
preparedStatement.setString(1, "Test");
于 2012-12-08T04:23:40.787 に答える