当前页面: 开发资料首页 → J2SE 专题 → 高分请教高手JDBC的问题,实在不知道那里错了。。在线等
高分请教高手JDBC的问题,实在不知道那里错了。。在线等
摘要: 高分请教高手JDBC的问题,实在不知道那里错了。。在线等
文件data.properties:
jdbc.drivers=com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc.url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=student
jdbc.uid=sa
jdbc.pwd=
源码:
import java.sql.*;
import java.util.*;
import java.io.*;
public class propertiesTest {
/**
* @param args
*/
private Connection con=null;
private PreparedStatement prestat=null;
private ResultSet rs=null;
String sql;
String num,name,sex,age;
int math,collegenglish;
propertiesTest(String databasetable)
{
try
{
con=getConnection();
sql=-#34;UPDATE -#34;+databasetable+-#34; SET 高等数学=? WHERE 年龄-#62;?-#34;;
prestat=con.prepareStatement(sql);
for(int i=0;i-#60;5;i++)
{
prestat.setInt(1, 60);
prestat.setString(2, -#34;25-#34;);
prestat.executeUpdate();
}
sql=-#34;SELECT * FROM -#34;+databasetable;
rs=prestat.executeQuery(sql);
System.out.println(-#34;学号 -#34;+-#34;姓名 -#34;+-#34;性别 -#34;+-#34;年龄 -#34;+-#34;高等数学 -#34;+-#34;英语-#34;);
while(rs.next())
{
num=rs.getString(1);
name=rs.getString(2);
sex=rs.getString(3);
age=rs.getString(4);
math=rs.getInt(5);
collegenglish=rs.getInt(6);
System.out.println(num+-#34;-#34;+name+-#34;-#34;+sex+-#34;-#34;+age+-#34;-#34;+math+-#34; -#34;+collegenglish);
}
}catch(SQLException e)
{
e.printStackTrace();
}catch(IOException e)
{
e.printStackTrace();
}
}
private static Connection getConnection() throws IOException,SQLException
{
InputStream ist=new BufferedInputStream(new FileInputStream(new File(-#34;.-#34; + File.separator+-#34;data.properties-#34;)));
Properties prop=new Properties();
prop.load(ist);
ist.close();
String drivers=prop.getProperty(-#34;jdbc.drivers-#34;);
if (drivers != null) System.setProperty(-#34;jdbc.drivers-#34;, drivers);
String url=prop.getProperty(-#34;jdbc.url-#34;);
String uid=prop.getProperty(-#34;jdbc.uid-#34;);
String pwd=prop.getProperty(-#34;jdbc.pwd-#34;);
return DriverManager.getConnection(url, uid, pwd);
}
public static void main(String[] args) {
// TODO 自动生成方法存根
propertiesTest pro=new propertiesTest(-#34;student-#34;);
}
}
错误信息:
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Invalid call Statement method: {0}
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BasePreparedStatement.executeQuery(Unknown Source)
at propertiesTest.-#60;init-#62;(propertiesTest.java:32)
at propertiesTest.main(propertiesTest.java:76)
应该怎么改,大家帮帮我!
错误提示是非法调用STATEMENT方法,我觉得我没写错啊,大家帮忙看看,有高手在嘛?
高手呢?高手都泡妞吃饭去了?
CSDN人气怎么这样了?
可以按我下面的办法试试:
for(int i=0;i-#60;5;i++)
{
sql=-#34;UPDATE -#34;+databasetable+-#34; SET 高等数学=? WHERE 年龄-#62;?-#34;;
prestat.setInt(1, 60);
prestat.setString(2, -#34;25-#34;);
prestat.addBatch(sql);
}
prestat.executeBatch();
sql应该放for循环外面
那个SQL?FOR里没有SQL啊
TO zhangj0571(笨鸟飞飞)
改后错误依旧
不明白,
学习
那这样吧,不要用PreparedStatement,for循环里面生成sql语句,然后就是用statement.addBatch(sql),然后for循环结束后,statement.executeUpdate();
for循环里没问题,调试时候我+了打印信息
statement.executeUpdate();--#62;statement.executeBatch();
友情up
TO zhangj0571(笨鸟飞飞)
我就是想用PREPAREDSTATEMENT实现替换,改STATEMENT就没意义了
有高手嘛,帮帮忙!!!!
sql=-#34;UPDATE -#34;+databasetable+-#34; SET 高等数学=? WHERE 年龄-#62;?-#34;;
prestat=con.prepareStatement(sql);
for(int i=0;i-#60;5;i++)
{
prestat.setInt(1, 60);
prestat.setString(2, -#34;25-#34;);
prestat.executeUpdate();
}
年龄字段是字符串吗? 字符串可以用 -#62; 判断?
另外,你这个update语句没有任何意义,做了5次同样的动作,仅仅是测试吗?
for(int i=0;i-#60;5;i++)
{
prestat.setInt(1, 60);
prestat.setString(2, -#34;25-#34;);
prestat.executeUpdate();
prestat.clearParameter();
}
年龄字段是字符串吗? 字符串可以用 -#62; 判断?
------------------------------------------------------------------------------------
加个转换试试
简单测试方法:
先判断连接是否正常. 打印Statement的信息.
在数据库客房端实际输入SQL ,要能正确执行.
把程序中的SQL语句打印出来. 和上面的比较一下,
一般情况下, 通过以上几个步骤, 就不应该出现什么问题了.
如果还有问题, 就有可能数据库不支持 setAutoCommit()等一些特殊方法, 先简化到最简单的状态 , 然后再执行
TO kevinliuu(@。@)
这程序只是个测试。。。我把年龄改成INT了,可是错误依旧
TO pauliuyou(paul)
我用打印信息测试过了,可以连接,SQL语句在SQL里可以运行的
看看我这个,没错误的!也许有启发
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBConnect {
/**
* @author abc
* @return
* @throws ClassNotFoundException
* @throws SQLException
*/
public Connection getConnection() throws ClassNotFoundException, SQLException {
String sql = new String(-#34;INSERT INTO emp (id, name, password) VALUES (11, -#39;LeoK-#39;, -#39;pass-#39;) -#34;);
Class.forName(-#34;com.gbase.jdbc.Driver-#34;);
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try{
con = DriverManager.getConnection(-#34;jdbc:gbase://192.168.2.109:5258/user1-#34;,
-#34;root-#34;,-#34;111111-#34;);
stmt = con.createStatement();
stmt.execute(sql);
rs = stmt.executeQuery(-#34;select * from emp limit 5-#34;);
while (rs.next()) {
System.out.print(-#34;ID: -#34;+rs.getString(-#34;id-#34;));
System.out.print(-#34; Name: -#34;+rs.getString(-#34;name-#34;));
System.out.print(-#34; PassWord: -#34;+rs.getString(-#34;password-#34;));
System.out.print(-#34;/n-#34;);
}
}catch(Exception e){
e.printStackTrace();
}finally{
rs.close();
stmt.close();
con.close();
}
return null;
}
public static void main(String[] args) {
DBConnect aa = new DBConnect();
try {
aa.getConnection();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
你的表里字段名是中文的?“高等数学“,“年龄”?
把你表里字段名别用中文,试一下,如果你用用中文,那么你的JDBC就需要设置字符集等一系列问题,先测试一下是不是这个问题。
sql=-#34;SELECT * FROM -#34;+databasetable;
rs=prestat.executeQuery(sql);
-------------
用新的Statement来执行,之前那个已经被预先编译了.
我想我知道你的问题在哪了
prestat=con.prepareStatement(sql);你这句话是预编译了一个包含sql语句的prepareStatement
但是你又写了下面的语句
sql=-#34;SELECT * FROM -#34;+databasetable;
rs=prestat.executeQuery(sql);
等于是同一个prepareStatement包含了两个不同的sql语句,这怎么行呢
你应该createStatement创造一个新的statement 再执行第二句sql,应该就OK了
sql=-#34;SELECT * FROM -#34;+databasetable;
在这句后+prestat=con.prepareStatement(sql);