我把大概的东西直接放到JSP中就可以正确执行,但是放到Class中就是不行,下面是我大概的代码
public class getDBconn
{
public getDBconn()
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e)
{
System.out.print("classnotfound:"+e.getMessage());
}
}
public Connection getConn(String dataname)
{
String url = dataname;
try
{
Connection conn=DriverManager.getConnection(url,"dba","sql");
}
catch(SQLException sqlexception)
{
System.out.print("----error-----:"+sqlexception.getMessage());
}
finally
{
return conn;
}
} 然后调用getdbconn public class execData
{
private getDBconn getdbconn; public execData(String dataname)
{
dataSqlAW = new getdbconn();
conn = dataSqlAW.getConn(dataname);
} public int createstmt()
{
int i = 0;
try
{
stmt = conn.createStatement();
i = 0;
}
catch(SQLException sqlexception)
{
System.out.print(sqlexception.getMessage());
i = -1;
}
finally
{
return i;
}
} public int executeData(String insert_sql)
{
int i = -1;
try
{
i = stmt.executeUpdate(insert_sql); //在这里把执行
}
catch(SQLException sqlexception)
{
System.out.print(sqlexception.getMessage());
i = -1;
}
finally
{
return i;
}
} }
sql语句绝对正确,我用COPY下来的SQL语句直接在JSP文件中执行就没有任何问题
public class getDBconn
{
public getDBconn()
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e)
{
System.out.print("classnotfound:"+e.getMessage());
}
}
public Connection getConn(String dataname)
{
String url = dataname;
try
{
Connection conn=DriverManager.getConnection(url,"dba","sql");
}
catch(SQLException sqlexception)
{
System.out.print("----error-----:"+sqlexception.getMessage());
}
finally
{
return conn;
}
} 然后调用getdbconn public class execData
{
private getDBconn getdbconn; public execData(String dataname)
{
dataSqlAW = new getdbconn();
conn = dataSqlAW.getConn(dataname);
} public int createstmt()
{
int i = 0;
try
{
stmt = conn.createStatement();
i = 0;
}
catch(SQLException sqlexception)
{
System.out.print(sqlexception.getMessage());
i = -1;
}
finally
{
return i;
}
} public int executeData(String insert_sql)
{
int i = -1;
try
{
i = stmt.executeUpdate(insert_sql); //在这里把执行
}
catch(SQLException sqlexception)
{
System.out.print(sqlexception.getMessage());
i = -1;
}
finally
{
return i;
}
} }
sql语句绝对正确,我用COPY下来的SQL语句直接在JSP文件中执行就没有任何问题
<<
catch(SQLException sqlexception)
{
System.out.print(sqlexception.getMessage());
i = -1;
}
>>
一定有异常产生的,打出来给大家看看。
BTW,顺便把insert_sql也log出来给大家看看。
{
Connection conn=null;
String url = dataname;
try
{
conn=DriverManager.getConnection(url,"dba","sql");
}
catch(SQLException sqlexception)
{
System.out.print("----error-----:"+sqlexception.getMessage());
}
finally
{
return conn;
}
}
执行完之后i = stmt.executeUpdate(insert_sql);
就直接跳到了
finally
{
return i;
}
我用
try
{ System.out.print("A");
i = stmt.executeUpdate(insert_sql); //在这里把执行
System.out.print("B");
}
catch(SQLException sqlexception)
{
System.out.print("C");
System.out.print(sqlexception.getMessage());
i = -1;
}
finally
{
System.out.print("D");
return i;
}
只打出了A和D
把
<<
catch(SQLException sqlexception)
{
System.out.print("C");
System.out.print(sqlexception.getMessage());
i = -1;
}
>>
修改为
<<
catch(Exception ex) {
ex.printStackTrace();
}
>>
然后再告诉俺们打印的结果,看看俺的猜测对不对。
i = stmt.executeUpdate(insert_sql);抛出空指针异常,stmt没有被正确创建,为什么会这样啊?
你把createStatement和execute这两个逻辑上应该在一处的东西分开到了两个方法,肯定就存在这个隐患。另外,Statement怎么作为类成员来处理呢?实际上只是方法体中需要的东西啊。你把这两个方法合在一起再试试。:)
我把语句改成这样也还是那个结果啊
stmt=conn.createStatement();
i = stmt.executeUpdate(insert_sql);
这又是怎么回事呢?多谢了
public class execData
{
private getDBconn getdbconn
private Statement stmt
public int createstmt (){
..... }
public int executedata()
{
.....
}
然后在JSP中先调用createstmt方法,在调用executedata方法
return conn;
}
这条语句是不管前面的运行情况怎么样.
无论如何都会强行将conn返回.甚至在conn ==null的情况也会返回.
这样你在程序中调用该连接时肯定是会无法创建createStatement.
错误无法避免.
我用这样的语句
String url = "jdbc:odbc:inv001";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection(url,"dba","sql");
在jsp中直接连接,并executeUpdate都没有问题
我在class中的代码是把class.forName放在了getDBconn的构造函数中,然后在在getconn方法中
Connection conn=DriverManager.getConnection(url,"dba","sql");
这样就conn就为空,请问难道这样不行吗?
在抛出异常的地方用Excption再截获一下看看是哪个地方的问题。应该是什么实例为空的错误。
使用时按照静态方法来使用,Connection conn = getDBConn.getConn(...);
BTW, 类名也改改吧。
<<
public class getDBconn {
private static final String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
static {
try {Class.forName(DRIVER);}
catch(ClassNotFoundException ex) {
throw new RuntimeException("Driver error");
}
} private getDBconn() {}
/**
* Apply JDBC Connection by given dataname
* @param dataname JDBC URL String
* @return JDBC Connection, return null if any error occurs.
*/
public static Connection getConn(String dataname) {
final String url = dataname;
try {
return DriverManager.getConnection(url,"dba","sql");
} catch(SQLException ex) {
// exception handle here.
return null;
}
}
}>>