【送分求教】 关于执行表单的SQL逻辑选择

vonreynard 2013-09-18 01:59:58
代码结构如下

求教

try
{

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test";
//你的数据库的
String user="sa";
String password="1234
Connection con= DriverManager.getConnection(url,user,password);
Statement stmt2=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
Statement stmt1=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
String sql5="select * from dbo.t_OCMS where f_contractNO='"+f_contractNO+"' ";
ResultSet rs5=stmt2.executeQuery(sql5);
out.print(rs5.next());
if(rs5.next())
{
stmt2.executeUpdate(sqlString);
out.print(rs5.next());
}
else
{
stmt2.executeUpdate(sqlString2);
}

con.close();
}
catch(SQLException e1)
{
out.print("SQL异常");
}



其中 String1是一句insert 语句
String2 是一句UPDATE语句


用rs5语句来查找是否有和输入的contractNO变量一样的记录,如果有的话(rs5.next())一定是true;
这样执行INSERT,否则为修改

执行过程中该值一直为false,不明白什么原因,请教该如何写

另外请教一个问题,SQL08,用UTF-8的编码JSP写入中文怎么都是乱码,请教如何查看数据库的编码类型,和解决方法




...全文
220 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
vonreynard 2013-09-18
  • 打赏
  • 举报
回复
引用 17 楼 crazypandariy 的回复:
一般jsp写入中文乱码都是使用过滤器处理,这个网上一搜一大堆。 如果是insert报错,那么报的什么异常呢。没有异常信息,分析不出到底是什么原因导致的错误。 可能是sql语句语法有问题,也可能是不能为空的字段插入了空值...原因不少。
好的,我去检查一下,贴出代码的逻辑没问题吧上
疯狂熊猫人 2013-09-18
  • 打赏
  • 举报
回复
一般jsp写入中文乱码都是使用过滤器处理,这个网上一搜一大堆。 如果是insert报错,那么报的什么异常呢。没有异常信息,分析不出到底是什么原因导致的错误。 可能是sql语句语法有问题,也可能是不能为空的字段插入了空值...原因不少。
vonreynard 2013-09-18
  • 打赏
  • 举报
回复
遍历的目的是,通过一个不重复的关键值 f_contractNO,来查找数据库内有无重复的记录, 如果有,那取得数据的行为就是更新该条数据 如果没有,那就要INSERT插入一条 所以使用 if(rs5.next()) {}来判断条件 不过,还有INSERT无法执行这个问题,很奇怪
tony4geek 2013-09-18
  • 打赏
  • 举报
回复
引用 10 楼 crazypandariy 的回复:
[quote=引用 2 楼 rui888 的回复:] 如果只有一条数据 ,if(rs5.next()) 这个就不会走了。
不要误人子弟好不好?看过api吗?照你这么说,那岂不是只有一行数据的时候就无法取值了? 看看API怎么说的: boolean next() throws SQLException将光标从当前位置向前移一行。ResultSet 光标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。 当调用 next 方法返回 false 时,光标位于最后一行的后面。任何要求当前行的 ResultSet 方法调用将导致抛出 SQLException。如果结果集的类型是 TYPE_FORWARD_ONLY,则其 JDBC 驱动程序实现对后续 next 调用是返回 false 还是抛出 SQLException 将由供应商指定。 如果对当前行开启了输入流,则调用 next 方法将隐式关闭它。读取新行时,将清除 ResultSet 对象的警告链。 返回: 如果新的当前行有效,则返回 true;如果不存在下一行,则返回 false 抛出: SQLException - 如果发生数据库访问错误或在关闭的结果集上调用此方法
     ResultSet rs5=stmt2.executeQuery(sql5);out.print(rs5.next());
       if(rs5.next()) 
{         stmt2.executeUpdate(sqlString);         out.print(rs5.next());        }        else        {            stmt2.executeUpdate(sqlString2);        }         
出现楼主这种情况,问题原因在于out.print(rs5.next()); 如果只有一行,那么这句代码将会使游标下移。再进行if(rs5.next())判断时,因为前一句代码已经使游标移到最后一行,所以这里始终是false。 这才是根本原因。[/quote] 大哥还帮api 翻译了一遍,说的不错。我理解是只有一条数据,游标上面一个out 之后,rs5就会false走到下面的去了。
vonreynard 2013-09-18
  • 打赏
  • 举报
回复
引用 13 楼 crazypandariy 的回复:
jsp如果传递中文到后台,服务器是tomcat,那么,默认编码是iso8859-1,这时,在后台你需要进行转码
new String(param.getBytes("iso8859-1"), "UTF-8")
多谢,每个变量都是使用这个函数变更? public String codeToString(String str) {//处理中文字符串的函数   String s=str;   try     {     byte tempB[]=s.getBytes("utf-8");     s=new String(tempB);     return s;    }   catch(Exception e)    {     return s;    }   } 这个函数应该如何改写?
疯狂熊猫人 2013-09-18
  • 打赏
  • 举报
回复
jsp如果传递中文到后台,服务器是tomcat,那么,默认编码是iso8859-1,这时,在后台你需要进行转码
new String(param.getBytes("iso8859-1"), "UTF-8")
vonreynard 2013-09-18
  • 打赏
  • 举报
回复
多谢诸位指导,目前困惑中,嘿嘿
vonreynard 2013-09-18
  • 打赏
  • 举报
回复
现在去掉那条out.print(rs5.next()); 状态是UPDATE不报错,INSERT就报错 catch(SQLException e1) { out.print("SQL异常"); } 直接抓到这条SQL异常
疯狂熊猫人 2013-09-18
  • 打赏
  • 举报
回复
引用 2 楼 rui888 的回复:
如果只有一条数据 ,if(rs5.next()) 这个就不会走了。
不要误人子弟好不好?看过api吗?照你这么说,那岂不是只有一行数据的时候就无法取值了? 看看API怎么说的: boolean next() throws SQLException将光标从当前位置向前移一行。ResultSet 光标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。 当调用 next 方法返回 false 时,光标位于最后一行的后面。任何要求当前行的 ResultSet 方法调用将导致抛出 SQLException。如果结果集的类型是 TYPE_FORWARD_ONLY,则其 JDBC 驱动程序实现对后续 next 调用是返回 false 还是抛出 SQLException 将由供应商指定。 如果对当前行开启了输入流,则调用 next 方法将隐式关闭它。读取新行时,将清除 ResultSet 对象的警告链。 返回: 如果新的当前行有效,则返回 true;如果不存在下一行,则返回 false 抛出: SQLException - 如果发生数据库访问错误或在关闭的结果集上调用此方法
     ResultSet rs5=stmt2.executeQuery(sql5);out.print(rs5.next());
       if(rs5.next()) 
{         stmt2.executeUpdate(sqlString);         out.print(rs5.next());        }        else        {            stmt2.executeUpdate(sqlString2);        }         
出现楼主这种情况,问题原因在于out.print(rs5.next()); 如果只有一行,那么这句代码将会使游标下移。再进行if(rs5.next())判断时,因为前一句代码已经使游标移到最后一行,所以这里始终是false。 这才是根本原因。
vonreynard 2013-09-18
  • 打赏
  • 举报
回复
引用 8 楼 rui888 的回复:
ResultSet rs5=stmt2.executeQuery(sql5); 这个有数据吗
这个有,依据是sqlstring2 的update语句 stmt2.executeUpdate(sqlString2) 可以执行,有返回值写到数据库内
tony4geek 2013-09-18
  • 打赏
  • 举报
回复
ResultSet rs5=stmt2.executeQuery(sql5); 这个有数据吗
vonreynard 2013-09-18
  • 打赏
  • 举报
回复
使用以上代码的时候,仍然无法执行 if(rs5.next()) { stmt2.executeUpdate(sqlString); 这短语句, 新建的没法执行
顽石呓语 2013-09-18
  • 打赏
  • 举报
回复
你看看是不是页面传输的时候出问题 你可以弄个过滤器 把request和response的编码都设置为utf-8 在不行区看看是不是sqlserver里面存储编码的问题
vonreynard 2013-09-18
  • 打赏
  • 举报
回复
多谢各位大能悉心解答

求教继续,JAVA苦手
<%@ page contentType="text/html;charset=utf-8" %>
<%@ page import="java.sql.*" %>
<%!
public String codeToString(String str)
{//处理中文字符串的函数
String s=str;
try
{
byte tempB[]=s.getBytes("utf-8");
s=new String(tempB);
return s;
}
catch(Exception e)
{
return s;
}
}
%>
<%//接收客户端提交的数据
String f_chargetime=codeToString(request.getParameter("f_chargetime"));




vonreynard 2013-09-18
  • 打赏
  • 举报
回复
恩,本意是想看下RS5的遍历状态,这明显错误改掉了,但是此语句貌似仍然是只能UPDATE不能INSERT 另外求教编码乱码问题
江城DiorsMan 2013-09-18
  • 打赏
  • 举报
回复
路过,看看、、、
tony4geek 2013-09-18
  • 打赏
  • 举报
回复
如果只有一条数据 ,if(rs5.next()) 这个就不会走了。
forgetsam 2013-09-18
  • 打赏
  • 举报
回复
out.print(rs5.next()); //游标下移一次 if(rs5.next()) //至少有两行数据,这里才能为true { stmt2.executeUpdate(sqlString); out.print(rs5.next()); } 正常人都用select count(*) from xxx看看结果是否为0来执行判断操作。

81,092

社区成员

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

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