我需要创建一个客户端 - 服务器连接(在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”,似乎只是终止打印并等待新的输入。
我的演员有什么问题吗? 我只是无法弄清楚确切的问题在哪里.... 非常感谢您提前帮助
答案 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块中关闭它,然后返回对象或数据结构。
你的代码充满了问题,但我认为这是主要代码。