发现sqlserver的一个大bug

wobushigl 2003-10-18 07:40:44
我用的是resin+sqlserver2000,发现在用select * from tree_menu这种句式时。
int id=RS.getInt("menu_id");
String menu_name=RS.getString("menu_name");
这种赋值必须严格按照字段在表中排列顺序,颠倒即告错。还不如access。
如String menu_name=RS.getString("menu_name");
int id=RS.getInt("menu_id");
就是错的。请高手解答其中缘故。会不会是我resin服务器的问题。
另外
out.println("aux["+id+"]"+" = appendChild("+foldersTree+", folderNode('<a href=main.jsp?menuid="+id+"&loc="+loc+" target=folderFrame>"+RS.getString("menu_name")+"</a>'));");
这句也是在access中毫无问题。但到了sqlserver中立即告错。
请一并解答
...全文
67 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
fft123 2003-11-27
  • 打赏
  • 举报
回复
这个是sqlserver的jdbc驱动程序的bug
下面这个是别人总结的结论
http://www.csdn.net/develop/Read_Article.asp?Id=21651
guangqin 2003-11-27
  • 打赏
  • 举报
回复
(1)如果采用jdbc-odbc驱动,那么就必须按照查询顺序来一次读取(不论有没有image或text类型)
(2)如果采用微软提供的ms sql server jdbc driver,如果查询语句中,不存在image或text类型字段,那么可以按照无序获取
(3)如果采用微软提供的ms sql server jdbc driver,如果查询语句中,存在image或text类型字段,那么就必须按照顺序读取,否则就会报告Driver]ResultSet can not re-read row data for column之类的错误
(4)如果想不查询语句中有没有image或text类型字段,都可以不按照顺序获取,或重复获取。那么就必须更换驱动,改用第三方的。
lirig 2003-11-27
  • 打赏
  • 举报
回复
我也发现这个问题,可是你做个视图或者多表查询,可没有这个问题!就是查询一个表的时候出现这种情况!
Unicorn008 2003-11-27
  • 打赏
  • 举报
回复
我用的是ORACLE..没这样的问题..蛮好的....呵呵
qukmei 2003-11-27
  • 打赏
  • 举报
回复
在asp中其实也有,不过可以解决的
conn.open sql---------就会出现问题
conn.open sql,1,1--------就没有问题

关键在于你在jsp中如何处理
ligenlee 2003-11-27
  • 打赏
  • 举报
回复
java的ResultSet有问题啊
好象不关blob或者clob的事
yupingping 2003-11-27
  • 打赏
  • 举报
回复
up
sunmingdong 2003-11-27
  • 打赏
  • 举报
回复
如果你采用MS自己的JDBC驱动。那么在查询语句中不包含blob或clob字段(就是Image和Text类型)的时候,查询是支持re-read方式的,可以非顺序查询。但是一旦包含的blob或clob字段。那么就必须按照顺序查询,且不支持重复查询

问题是你的tree_menu表中有blob或clob类型的字段,问题出在sql server 2000 for jdbc上,而且确实是一个bug,只有变通的方法解决了比如按顺序取出,放到vector中,再对vector操作
wobushigl 2003-10-20
  • 打赏
  • 举报
回复
多谢各位。
凋零的老树 2003-10-20
  • 打赏
  • 举报
回复
不是sqlserver的bug,你用ASP就没有这个问题,是java的ResultSet的问题,不灵活,算不上什么bug
truezerg 2003-10-20
  • 打赏
  • 举报
回复
PreparedStatement StatementRecordset1 = conn.prepareStatement("sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
^<- 不好意思,这里我多写了一个引号,去掉它
truezerg 2003-10-20
  • 打赏
  • 举报
回复
把你的public ResultSet executeQuery(String sql)方法中的这二句

Statement stmt=conn.createStatement();
rs=stmt.executeQuery(sql);

换成这二句就可以了
PreparedStatement StatementRecordset1 = conn.prepareStatement("sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet Rs = StatementRecordset1.executeQuery();

-------------------------------
我试了一下,确实有楼主说的问题,但只要将结果集改成可前后移动的就可以了。这可能是ODBC-JDBC桥的问题
baggio785 2003-10-19
  • 打赏
  • 举报
回复
icecloud(冰云) 说的正确,绝对不是sqlserver的问题
wobushigl 2003-10-19
  • 打赏
  • 举报
回复
但这是为什么呢,有没有人能解答一下原因啊。最好详细一点。
hajavaor 2003-10-19
  • 打赏
  • 举报
回复
jdbc-odbc桥不是万能的。
我也发现过jdbc-odbc连接其他数据库时,执行一些untion等语句报错。
还有,有的只支持索引读取,有的只能按顺序读一次值。
如果在开发环境中,最好使用相应的jdbc。
streetgrass 2003-10-19
  • 打赏
  • 举报
回复
这个我也遇到过,是用jsp+javabean+sqlserver的时候,后来查资料才知道本来就是建议按字段顺序取值。
wobushigl 2003-10-19
  • 打赏
  • 举报
回复
就在下面这一段里出问题了,我试着一条条删除,发现了int loc=RS.getInt("menu_location");
不能提前,因为在我的sqlserver中他是最后一个字段。这种类似的问题我告诉同学,他也不信,但随便拿了个程序一试就出了类似的错。也是不能颠倒记录字段赋值的顺序。你们也可以试试啊。
icecloud(冰云) 能不能说的更清楚详细一点啊。最好能上升到原理的高度上。我正在苦苦寻找原因。在线等答案。


function generateTree()
{
//var aux1, aux2, aux3, aux4
var aux
aux=new Array

foldersTree = folderNode("我的网站")
<%
//menu_id,menu_name,parent_menu_id,folder_or_file,menu_location
String sql="select * from tree_menu ";
ResultSet RS;
RS=executeQuery(sql);
try
{

while(RS.next())
{
String foldersTree;
int id=RS.getInt("menu_id");

String menuname=RS.getString("menu_name");
String name=getStr(menuname);
int parent=RS.getInt("parent_menu_id");
int folder_or_file=RS.getInt("folder_or_file");
int loc=RS.getInt("menu_location");
if(loc==1){
foldersTree="foldersTree";
}else{
//foldersTree="aux"+(int)(loc-1);
foldersTree="aux["+parent+"]";
}
//if(folder_or_file==1){
//out.println("aux"+loc+" = appendChild("+foldersTree+", folderNode('<a href=main.jsp?menuid="+id+"&loc="+loc+" target=folderFrame>"+RS.getString("menu_name")+"</a>'));");
out.println("aux["+id+"]"+" = appendChild("+foldersTree+", folderNode('<a href=main0.jsp?menuid="+id+"&menuname="+menuname+"&loc="+loc+" target=folderFrame>"+menuname+"</a>'));");
//}else{
//aux[id]=appendchild(foldersTree, folderNode("<a href=main.jsp?menuid="+id+"&loc="+loc+" target=folderFrame>"+RS.getString("menu_name")+"</a>"))
//out.println("appendChild("+foldersTree+", generateDocEntry(0, '"+RS.getString("menu_name")+"', 'sample1.htm', ''));");
//}
}

}
catch(Exception e)
{
out.println(e.toString());
}
%>

}
wobushigl 2003-10-19
  • 打赏
  • 举报
回复
这是真的,我让其他同学试试,确实也出了这样的问题。
我用的是jdbc—odbc桥。然后用不同的数据库时转换数据源就行了啊。
相关的代码如下
<%@page contentType="text/html;charset=gb2312"%>
<%@page language="java" import="java.sql.*"%>
<%//设置session,提供用户登陆接口
session.setAttribute("userName","blueriver");
String topMenu;
topMenu=(String)session.getAttribute("userName");
%>
<%!
public String getStr(String str)
{
try
{
String temp_p=str;
byte[] temp_t=temp_p.getBytes("GBK");
String temp=new String(temp_t,"ISO8859_1");
return temp;
}
catch(Exception e)
{

}
return "null";
}
%>
<%
String sDBDriver="sun.jdbc.odbc.JdbcOdbcDriver";
try
{
Class.forName(sDBDriver);
}
catch(java.lang.ClassNotFoundException e)
{
System.err.println(e.getMessage());
}
%>
<%!
public ResultSet executeQuery(String sql)
{
String sConnStr="jdbc:odbc:tree";
Connection conn=null;
ResultSet rs=null;
rs=null;
try
{
conn=DriverManager.getConnection(sConnStr);
Statement stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
}
catch(SQLException ex)
{
System.err.println(ex.getMessage());
}

return rs;
}
%>
icecloud 2003-10-19
  • 打赏
  • 举报
回复
下次用conn建立stmt的时候,
记得加上游标滚动参数即可
Yssss1980 2003-10-18
  • 打赏
  • 举报
回复
不可能有这种bug的
真的是不可能
加载更多回复(2)

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧