无法从ResultSet打印转移到客户端从服务器

时间:2011-04-23 23:00:26

标签: java jdbc resultset

我需要创建一个客户端 - 服务器连接(在JAVA中),其中服务器连接到数据库,客户端可以发送查询并获得答案。 我使用OCSF(Timothy C. Lethbridge博士)和JAVA的JDBC驱动程序。 在服务器端,我有以下代码

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 个答案:

答案 0 :(得分:1)

您没有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;

}

答案 1 :(得分:0)

我注意到的第一件事是你的迭代从一开始,然后经过大小(包括)。你必须从零开始并通过大小(独家)。 I = 0,I

在客户端代码中,我不理解while循环。当你调用rs.next()(我假设这里的rs是一个ResultSet)时,你再移动一个指针,除非没有更多的条目。然后,您似乎再次遍历所有项目。我可能不正确,因为我不熟悉ResultSet的用法,但是从浏览JavaDoc来看,它似乎有问题。

尝试在客户端代码中打印原始消息,查看吐出的内容。在演员表之后继续做同样的事情,看看输出是否有意义。

答案 2 :(得分:0)

你根本不应该传递ResultSet。它是一个不扩展Serializable的接口。它是数据库游标的抽象。当您将它从一台机器传递到另一台机器时,没有任何关于连接的信息,您期望发生什么?我不知道它是如何起作用的。

不应该从创建它的方法中传递ResultSet。正确的做法是将其加载到对象或数据结构中,在finally块中关闭它,然后返回对象或数据结构。

你的代码充满了问题,但我认为这是主要代码。