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'"; 也不会出问题。
但是放在程序里就出问题?我不想用先判断在截取的方法.
还有其他的办法吗?
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'"; 也不会出问题。
但是放在程序里就出问题?我不想用先判断在截取的方法.
还有其他的办法吗?
解决方案 »
- java如何 对用户上传的附件 调用本地的360或其他杀毒软件进行 扫描
- 谁能提供一份jawin运行包
- 用MyElipse 的插件xfire, 生成的client ,执行后Could not find a service to invoke 异常,是什么原因呢?
- web服务器和应用服务器什么区别啊?
- Tomcat No Java Virtual Machine found的问题
- 高分求:Eclipse in action 或 The Java Developer's Guide to Eclipse电子版
- 大虾帮帮我,jboss中怎么样用实体bean,感觉很难
- SSH问题,求大侠解决
- form表单提交action后,接收到的值为null.
- 求助!!!关于springboot2.0 + yml多数据源配置报错
- 如何防止SQL注入
- Jquery ajaxfileupload.js 文件上传问题。
还有我不想用截取的方法
我只想让我的select 语句在程序中可以正常执行。
不知道你还有没有其他的方法
但是现在是3位,但是进去的是4位
这样在程序里,一执行select 就处错
别人知道怎么改吗?
stmt.setString(1, a==null?null:(a.length>4?a.substring(0,3):a));
VARCHAR 3
还有上面说了, stmt.setString(1, "123"); OK
但是 stmt.setString(1, "1234"); 出错
我现在就是不想截取“1234。subString(0,3)
错误是ibmcode 302
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)
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差不多就是这样,不修改数据库又不想截取字符串,真的想不出来什么办法了。
stmt.setString(1, "1234");
换成普通的sql文 select * from table where user_id = ‘1234’的话
程序就不会出问题!
我不明白的地方是用这种参数 为什么会出问题呢?
是stmt 的问题吗?
我只是抛砖引玉,希望有真正明白原理的人来解释下
期待中。
换个版本的驱动或许就好了,注意尽量和你的数据库版本号保持一致。
jdbc报错是对的啊,这是你的数据错误,为什么一定要jdbc放弃处理你的错误???太奇怪的要求了至于你说的为什么写sql和预处理语句处理结果不一样
这个你应该好好去看点基础书籍了
标准sql语句由服务器处理,这个不谈
预处理语句,分为3步
1.提交预编译sql,就是带有参数列表(?)的sql语句,由服务器判断是否是被缓存的指令集
2.提交参数列表,检查所有参数的有效性及安全性
3.执行缓存的指令集至于为什么要用预编译语句来跑sql,一个最简单的安全考量就是防止sql注入,谁也不想留着sql语句的注入漏洞吧?
但是 我想问下,为什么换成oracle 的数据库 预处理语句 就能通过呢?
我是不明白数据库,这不才发帖问吗?哼你们这帮男程序员,就不能先帮我解释明白了,再教育我吗?
如果你连数据库都不明白...怎么给你解释什么是sql解析,什么是预处理...
如果你用参数传, 貌似 java 的机制是会检查的。 所以直接用 " select ..." 这样是可以,因为这样是直接丢过去给数据库执行。 我只能说我很纠结,因为你这样它就应该报错啊-。- 这该如何是好。