Решение ошибки набора результатов SQL с помощью JDBC / Spring - PullRequest
0 голосов
/ 01 января 2012

Я пишу приложение, используя Spring Framework.

Описание упражнения: Напишите программу, которая позволит мне создать базу данных.База данных будет содержать информацию о юридических школах.Я могу использовать это для добавления юридических факультетов, запросов и т. Д. Я получаю сообщение об ошибке, в котором говорится, что мои заявления не генерируют набор результатов.Мой код кажется правильным в соответствии с моими знаниями, но мои знания явно ошибочны.Я полностью убежден, что мой файл application.xml был написан правильно, поэтому я не буду включать его здесь.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.sears.domain.School;

public class SchoolDaoImplementation implements SchoolDao
{
private static final String USERNAME = "sa";
private static final String PASSWORD = "";

private static final String CREATE_TABLE = "CREATE TABLE lawschools (name VARCHAR(15) NOT NULL PRIMARY KEY, city VARCHAR(15), state VARCHAR(2), rank INTEGER)";
private static final String INSERT_SCHOOL = "INSERT INTO lawschools (name, city, state, rank) VALUES (?, ?, ?, ?)";
private static final String SELECT_ALL_SCHOOLS = "GET * FROM lawschools";

private static final String DATABASE_URL = "jdbc:hsqldb:file:database.dat;shutdown=true";
private static final String DRIVER_NAME = "org.hsqldb.jdbcDriver";

public SchoolDaoImplementation()
{
    try
    {
        Class.forName(DRIVER_NAME);
        createTable();
    }
    catch (Exception e)
    {
        throw new RuntimeException(e);
    }
    System.out.println("School DAO implementation instantiated.");
}

private static void createTable()
{
    try
    {
        Connection con = null;
        PreparedStatement createTable = null;
        try
        {
            con = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);
            createTable = con.prepareStatement(CREATE_TABLE);
            createTable.executeUpdate();
            System.out.println("Creted Table.");
        }
        finally
        {
            if (con != null)
                con.close();
            if (createTable != null)
                createTable.close();
        }
    }
    catch (SQLException e)
    {
        System.out.println("Assuming table has been created.");
    }
    System.out.println("Table created successfully.");
}

public School getSchool(String name)
{
    return null;
}

public List<School> getSchools()
{
    try 
    {
        Connection con = null;
        PreparedStatement selectAllSchools = null;
        ResultSet allSchools = null;
        List<School> schools = new ArrayList<School>();
        try
        {
            con = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);
            selectAllSchools = con.prepareStatement(SELECT_ALL_SCHOOLS);
            allSchools = selectAllSchools.executeQuery();
            while (allSchools.next())
            {
                String name = allSchools.getString(1);
                String city = allSchools.getString(2);
                String state = allSchools.getString(3);
                int rank = allSchools.getInt(4);
                schools.add(new School(name, city, state, rank));
            }
            return schools;
        }
        finally
        {
            if (con != null)
                con.close();
            if (selectAllSchools != null)
                selectAllSchools.close();
            if (allSchools != null)
                allSchools.close();
        }
    }
    catch (SQLException e)
    {
        throw new RuntimeException(e);
    }
}

public List<School> getByRank(int rank)
{
    return null;
}

public List<School> getByState(String state)
{
    return null;
}

public void addSchool(School newSchool)
{
    try
    {
        Connection con = null;
        PreparedStatement insertSchool = null;
        try
        {
            con = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);
            insertSchool = con.prepareStatement(INSERT_SCHOOL);
            insertSchool.executeUpdate();
        }
        finally
        {
            if (con != null)
                con.close();
            if (insertSchool != null)
                insertSchool.close();
        }
    }
    catch (SQLException e)
    {
        System.out.println("An error has occured.");
    }
}
}

Проверка клиента:

public class ClientTest 
{
    public static void main(String[] args)
    {
    ApplicationContext container = new ClassPathXmlApplicationContext("application.xml");
    RankingService service = (RankingService) container.getBean("rankingServiceProduction");

    System.out.println("Welcome to the LawSchool Ranking Service\n");

    service.addNewSchool(new LawSchool("Duke", "Durham", "NC", 11));
    service.addNewSchool(new LawSchool("Northwestern", "Chicago", "IL", 11));
    service.addNewSchool(new LawSchool("Cornell", "Ithaca", "NY", 13));
    service.addNewSchool(new LawSchool("Georgetown", "District of Columbia", "DC", 14));        

    List<School> allLawSchools = service.getAllSchools();
    for (School school : allLawSchools)
        System.out.println(school);
}
}

Сообщение об ошибке:

Exception in thread "main" java.lang.RuntimeException: java.sql.SQLException: Statement does not generate a result set
at com.sears.data.SchoolDaoImplementation.getSchools(SchoolDaoImplementation.java:107)
at com.sears.services.RankingServiceProduction.getAllSchools(RankingServiceProduction.java:24)
at com.sears.client.ClientTest.main(ClientTest.java:22)
Caused by: java.sql.SQLException: Statement does not generate a result set
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.checkIsRowCount(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.executeQuery(Unknown Source)
at com.sears.data.SchoolDaoImplementation.getSchools(SchoolDaoImplementation.java:84)
    ... 2 more

1 Ответ

1 голос
/ 01 января 2012

Попробуйте заменить строку

private static final String SELECT_ALL_SCHOOLS = "GET * FROM lawschools";

с

private static final String SELECT_ALL_SCHOOLS = "SELECT * FROM lawschools";

или, еще лучше,

private static final String SELECT_ALL_SCHOOLS = "SELECT name, city, state, rank FROM lawschools";

РЕДАКТИРОВАТЬ : ваши школы не заполнены, потому что вы не отправляете значения имени, города, штата и ранга в базу данных. Ваш код для вставки должен выглядеть примерно так (у меня нет вашего LawSchool класса, поэтому я не могу быть уверен в названиях get... методов):

    insertSchool = con.prepareStatement(INSERT_SCHOOL);
    insertSchool.setString(1, newSchool.getName());
    insertSchool.setString(2, newSchool.getState());
    insertSchool.setString(3, newSchool.getCity());
    insertSchool.setInt(4, newSchool.getRank());
    insertSchool.executeUpdate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...