public static void main(String[] args) throws Exception{   
    String driverClassName="com.ibm.db2.jcc.DB2Driver";   
    String url="jdbc:db2://localhost:50000/TESTDB";   
    Class.forName(driverClassName);   
    Connection conn=DriverManager.getConnection(url, "test", "test");   
    String sql="select count(*) from T_USER where USER_ID =?";   
    PreparedStatement stmt=conn.prepareStatement(sql);   
    stmt.setString(1, "1234");   
    ResultSet rs=stmt.executeQuery();   
    while(rs.next()){   
        System.out.println(rs.getObject(1));   
    }   
    stmt.close();   
    conn.close();   
}  
USER_ID定义为3位,如果stmt.setString(1, "123"); 就不会出问题。 
或者直接写到SQL里面:String sql="select count(*) from T_USER where USER_ID ='1234'"; 也不会出问题。 
但是放在程序里就出问题?我不想用先判断在截取的方法.
还有其他的办法吗?

解决方案 »

  1.   

    请问一下USER_ID定义为3位,是前面3位数字吗?可以用USER_ID.substring(0,3)方法
      

  2.   

    我这个是不区分前后的
    还有我不想用截取的方法
    我只想让我的select 语句在程序中可以正常执行。
    不知道你还有没有其他的方法
      

  3.   

    我的数据类型是char型 那么传一个'1234' 没什么问题吧
    但是现在是3位,但是进去的是4位
    这样在程序里,一执行select 就处错
    别人知道怎么改吗?
      

  4.   


    stmt.setString(1, a==null?null:(a.length>4?a.substring(0,3):a)); 
      

  5.   

    你USER_ID的数据类型是什么?有长度限制吗???
      

  6.   


    VARCHAR 3 
    还有上面说了, stmt.setString(1, "123"); OK
    但是 stmt.setString(1, "1234"); 出错
    我现在就是不想截取“1234。subString(0,3) 
    错误是ibmcode 302
     
      

  7.   

    Exception in thread "main" com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -302, SQLSTATE: 22001, SQLERRMC: null 
    at com.ibm.db2.jcc.b.sf.e(sf.java:1680) 
    at com.ibm.db2.jcc.b.sf.a(sf.java:1260) 
    at com.ibm.db2.jcc.c.jb.o(jb.java:611) 
    at com.ibm.db2.jcc.c.jb.j(jb.java:264) 
    at com.ibm.db2.jcc.c.jb.c(jb.java:57) 
    at com.ibm.db2.jcc.c.w.c(w.java:42) 
    at com.ibm.db2.jcc.c.cc.g(cc.java:178) 
    at com.ibm.db2.jcc.b.sf.p(sf.java:1256) 
    at com.ibm.db2.jcc.b.tf.d(tf.java:2344) 
    at com.ibm.db2.jcc.b.tf.d(tf.java:2458) 
    at com.ibm.db2.jcc.b.tf.X(tf.java:508) 
    at com.ibm.db2.jcc.b.tf.executeQuery(tf.java:491) 
    at com.user.service.TestQuery.main(TestQuery.java:24) 
      

  8.   

    VARCHAR 3 长度太短导致,你换成4,长一点啥。重新改变一下表结构吧
      

  9.   

    SQL> create table tesetable(username char(3));
     
    Table created
     
    SQL> insert into tesetable('1234');
     
    insert into tesetable('1234')
     
    ORA-00928: 缺失 SELECT 关键字
     
    SQL> insert into tesetable values ('1234');
     
    insert into tesetable values ('1234')
     
    ORA-12899: 列 "LLOYDS_U2"."TESETABLE"."USERNAME" 的值太大 (实际值: 4, 最大值: 3)
     
    SQL> drop table tesetable;
     
    Table dropped差不多就是这样,不修改数据库又不想截取字符串,真的想不出来什么办法了。
      

  10.   

    引用参数的这种法式如下
    stmt.setString(1, "1234");
    换成普通的sql文 select * from table where user_id = ‘1234’的话
    程序就不会出问题!
    我不明白的地方是用这种参数 为什么会出问题呢?
    是stmt 的问题吗?
    我只是抛砖引玉,希望有真正明白原理的人来解释下
    期待中。
      

  11.   

    IBM的DB2驱动自带了一套JDK来处理相关的事务。我碰到过很多次这样的问题。
    换个版本的驱动或许就好了,注意尽量和你的数据库版本号保持一致。
      

  12.   

    没什么问题啊
    jdbc报错是对的啊,这是你的数据错误,为什么一定要jdbc放弃处理你的错误???太奇怪的要求了至于你说的为什么写sql和预处理语句处理结果不一样
    这个你应该好好去看点基础书籍了
    标准sql语句由服务器处理,这个不谈
    预处理语句,分为3步
    1.提交预编译sql,就是带有参数列表(?)的sql语句,由服务器判断是否是被缓存的指令集
    2.提交参数列表,检查所有参数的有效性及安全性
    3.执行缓存的指令集至于为什么要用预编译语句来跑sql,一个最简单的安全考量就是防止sql注入,谁也不想留着sql语句的注入漏洞吧?
      

  13.   


    但是 我想问下,为什么换成oracle 的数据库 预处理语句 就能通过呢?
    我是不明白数据库,这不才发帖问吗?哼你们这帮男程序员,就不能先帮我解释明白了,再教育我吗?
      

  14.   

    因为大家都感觉没法给你解释问题...
    如果你连数据库都不明白...怎么给你解释什么是sql解析,什么是预处理...
      

  15.   

      lz .     我只能说,你这个出异常是应该的。
                 
                 如果你用参数传, 貌似 java 的机制是会检查的。             所以直接用 " select ..." 这样是可以,因为这样是直接丢过去给数据库执行。             我只能说我很纠结,因为你这样它就应该报错啊-。-           这该如何是好。
      

  16.   

    用setString的方法,内部会做数据类型和长度的校验,你现在是varchar3,你用“1234”肯定不行,不要说你不想改其他东西就想有办法通过,工作中要学会变通,现在就是你数据结构设计的有问题,为什么不改呢?
      

  17.   

    结贴了 谢谢 beiouwolf  感谢大家