невозможно распечатать из ResultSet, переданного на клиент с сервера - PullRequest
0 голосов
/ 24 апреля 2011

Мне нужно создать соединение клиент-сервер (в JAVA), где сервер подключен к базе данных, и клиент может отправлять запросы и получать ответы. Я использую OCSF (доктор Тимоти С. Летбридж) и драйвер JDBC для JAVA. на стороне сервера у меня есть следующий код

ResultSetMetaData rsmd=rs.getMetaData();
int numOfCols=rsmd.getColumnCount();
String[] tuple=new String[numOfCols];
Vector result=new Vector();
while (rs.next()){
    for (int i=1;i<=numOfCols;i++)
            tuple[i-1]=rs.getString(i);
    result.addElement(tuple);
    isResultEmpty=0;
}
if (isResultEmpty==0)
    this.sendToAllClients(result);
else
        this.sendToAllClients("No appropriate results!");

пока что, похоже, работает нормально, я сделал несколько тестовых распечаток, если цикл for работает нормально.

для клиента, у меня есть следующий код:

public void handleMessageFromServer(Object msg) 
  {
    //clientUI.display(msg.toString());
    if (msg instanceof Vector){
        Vector result=(Vector)msg;
        System.out.println("The result of the query is:\n\n");
        //System.out.println((String)result.firstElement());
        System.out.println("result size is "+result.size());
        for (int i=1;i<=result.size();i++){
            System.out.println("here");
            System.out.println((String)result.get(i));
            System.out.println("here2");
        }
    }
    else
        clientUI.display(msg.toString());
  }

проблема начинается, когда я пытаюсь распечатать результаты: первое «здесь» напечатано, и больше ничего не происходит, он никогда не попадает в «here2», и, кажется, просто прекращает печать и ждет нового ввода.

есть ли проблемы с кастингом, который я делаю? я просто не могу понять, где именно проблема .... заранее большое спасибо за помощь

Ответы [ 3 ]

1 голос
/ 24 апреля 2011

У вас нет вектора String объектов.У вас есть вектор строковых массивов (String[])

Редактировать в ответ на комментарии:

System.out.println("result size is "+result.size());
for (int i = 0;i < result.size();i++){
    System.out.println("here");
    String[] array = (String[])result.get(i));
    for (int j = 0; j < array.length; j++)
        System.out.println(array[j]); 
    System.out.println("here2");
}

Это, конечно, предполагает, что серверная сторона работает.Я не смотрел на это внимательно.

Изменить для серверной части:

Это все виды разрыва:

while (rs.next()){
    for (int i=1;i<=numOfCols;i++)
        tuple[i-1]=rs.getString(i);
    result.addElement(tuple);
    isResultEmpty=0;
}

На каждой итерации цикла вы просто меняете то, чтоВаш массив строк содержит и добавляет одну и ту же ссылку снова и снова.Вам нужно:

String[] tuple;
while (rs.next()){
    tuple = new String[numOfCols];
    for (int i=1;i<=numOfCols;i++)
        tuple[i-1]=rs.getString(i);

    result.addElement(tuple);
    isResultEmpty=0;

}
0 голосов
/ 24 апреля 2011

Вы вообще не должны передавать ResultSet. Это интерфейс, который не расширяет Serializable. Это абстракция для курсора базы данных. Что вы ожидаете при передаче с одного компьютера на другой без какой-либо информации о соединении? Я не понимаю, как это может работать.

ResultSet никогда не должен передаваться из метода, в котором он был создан. Нужно загрузить его в объект или структуру данных, закрыть его в блоке finally и вернуть объект или структуру данных.

Ваш код пронизан проблемами, но я думаю, что это главный.

0 голосов
/ 24 апреля 2011

Первое, что я заметил, это то, что ваша итерация начинается с одного и проходит через размер (включительно).Вы должны начать с нуля и пройти через размер (эксклюзив).i = 0, i

В коде клиента я не понимаю цикл while.Когда вы вызываете rs.next () (я предполагаю, что здесь rs - ResultSet), вы перемещаете указатель еще раз, если больше нет записей.Тогда кажется, что вы повторяете все пункты снова.Я могу ошибаться, так как я незнаком с использованием ResultSet, хотя при просмотре JavaDoc это кажется проблематичным.

Попробуйте распечатать необработанное сообщение в вашем клиентском коде, посмотрите, что выпалоТакже продолжайте делать то же самое после приведения, посмотрите, имеет ли смысл вывод.

...