用JAVA连接ORACLE数据库的问题

    前天刚开始学习用JAVA连接Oracle 数据库的时候遇到了点问题,在网上发帖子求助,搜索相似的问题,和同学一起探索,终于把问题给解决了,说不上完美的解决吧,但至少学到了不少的东西。

    分别在Java和Oracle社区发表了同样的帖子,以下会引用一起原贴中的话:

主  题: 用JAVA连接ORACLE数据库的问题
作  者: richard_2010 (只爱子寒)        Blog   加为好友
等  级: 
信 誉 值: 100
所属社区: Java J2SE / 基础类
问题点数: 50
回复次数: 17
发表时间: 2007-4-10 20:30:41

我用JAVA连接ORACLE数据库,但是出现问题了,提示:
Exception in thread "main" java.lang.NoClassDefFoundError: JDBCConn
我的源程序如下:
import java.sql.*;

public class JDBCConn
{
private static String url="";
private static String username="";
private static String password="";

private Connection conn()
{
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection(url,username,password);
return con;
}
catch(ClassNotFoundException cnf)
{
System.out.println("driver not find:"+cnf);
return null;
}
catch(SQLException sqle)
{
System.out.println("can't connection db:"+sqle);
return null;
}
catch(Exception e)
{
System.out.println("failed to load JDBC driver.");
return null;
}
}

public void query(Connection con,String sql)
{
try
{
if(con==null)throw new Exception("datebase connection can't use!");
if(sql==null)throw new Exception("check your parameter:'sql'! don't input null!");
Statement stmt =con.createStatement();
ResultSet rs=stmt.executeQuery(sql);
ResultSetMetaData rmeta=rs.getMetaData();
int numColumns=rmeta.getColumnCount();
while(rs.next())
{
for(int i=0;i<numColumns;i++)
{
String sTemp=rs.getString(i+1);
System.out.println(sTemp+"");
}
System.out.println("");
}
}
catch(Exception e)
{
System.out.println("query error:"+e);
}
}

public void execute(Connection con,String sql)
{
try
{
if(con==null)return;
Statement stmt =con.createStatement();
stmt.executeUpdate(sql);
}
catch(Exception e)
{
System.out.println("execute error:sql="+sql);
System.out.println(e);
}
}

public void demo()
{
try
{
JDBCConn oc=new JDBCConn();
Connection conn=oc.conn();
String sql="insert into TBL_USER(id,name,password) values (seq_user.nextval,'switch','haorenpingan')";
oc.execute(conn,sql);
sql="select * from TBL_USER";
oc.query(conn,sql);
conn.close();
}
catch(SQLException se)
{
System.out.println(se);
}
catch(Exception e)
{
System.out.println(e);
}
}

public static void main(String[] arg)
{
if(arg.length!=3)
{
System.out.println("use :java JDBCConn url username password");
return;
}
JDBCConn oc=new JDBCConn();
oc.url=arg[0];
oc.username=arg[1];
oc.password=arg[2];
oc.demo();
}
}

在运行时我输入:
java JDBCConn jdbc:oracle:thin:@127.0.0.1:1521:MISDB scott tiger
得到刚才的提示的,还想请问下,我的JDBC驱动就是oracle10g安装程序下的.../OraHome_1/jdbc/lib/classes12.zip 环境变量classpath是在命令行窗口用set设置的(不知道为什么,直接在我的电脑—>属性->高级->环境变量里面不能设置),这个没问题吧?

我是新手,请各位高手在解答问题时详细点(包括我说的环境变量设置的这个小问题),不甚感激!

 richard_2010(只爱子寒) ( 一级(初级)) 信誉:100    Blog   加为好友 2007-4-10 20:40:44 得分: 0

我在网上找到的这个例子:
 import   java.sql.*;  
  public   class   tt  
  {  
  public   static   void   main(String[]   args)  
          {  
          try    
          {  
          Class.forName("oracle.jdbc.driver.OracleDriver");  
  Connection   conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:MISDB",  
  "scott","tiger");  
  Statement   stmt=conn.createStatement();  
  ResultSet   rs=stmt.executeQuery("select   *   from   emp");  
  while(rs.next())  
  {  
  //int   i=rs.getInt("id");  
  //System.out.println   (i);  
  //System.out.println   (rs.getString("userid"));  
  System.out.println   (rs.getString(2));  
  }  
  conn.close();  
          }  
          catch   (Exception   ex)    
          {  
           
          }  
          }  
  } 
运行后的结果和我的程序结果一样,都是出现:
Exception in thread "main" java.lang.NoClassDefFoundError: classname
在线等,谢谢!
 

有个叫zzxiaoma(小马)的朋友说:oracle的驱动包没有找到吧

在没有用set classpath=.../OraHome_1/jdbc/lib/classes12.zip设置环境变量的时候,出现的提示是这样的:can't connection db:java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection
query error:java.lang.Exception: datebase connection can't use!
java.lang.NullPointerException
设置了以后就是:Exception in thread "main" java.lang.NoClassDefFoundError: JDBCConn

我想应该是环境变量没有设置好的原因,因为我用set设置的时候前面没有用%pathclass%;可能把java类的环境变量覆盖了。于是设置前提示找不到驱动,设置后提示找不到java的类。可是到底应该怎么设置环境变量才对呢。

正好有个richboylf() 热心把他自己的环境变量贴出来了:我环境变量是这么设置的,你可以参考一下
classpath:
.;C:/j2sdk1.4.2_02/lib/tools.jar;C:/j2sdk1.4.2_02/lib/dt.jar;C:/j2sdk1.4.2_02/lib/classes12.jar
JAVA_HOME:
C:/j2sdk1.4.2_02
PATH:
D:/oracle/ora92/bin;C:/j2sdk1.4.2_02/bin;C:/Program Files/Oracle/jre/1.3.1/bin;C:/Program Files/Oracle/jre/1.1.8/bin;%SystemRoot%/system32;%SystemRoot%;%SystemRoot%/System32/Wbem;%PATH%;%ANT_HOME%/bin

可是设置后还是不行。和同学商讨的时候,他说没用过在命令行输入url,username和password,于是改用别的程序测试连接:

import java.sql.*;
import java.util.*;
import java.awt.*;
public class JDBCFile
{
public static void main(String[] args)
{
            
Connection conn;
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(Exception e)
{
System.out.println("33333333333333333333333333");
}
try
{conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:MISDB","system","123456789");
System.out.println("11111111111111111");
}
catch(SQLException e)
{
System.out.println("2222222222222222222222222222");
}

}
}

输出的是222222222222,显示不能连接到数据库,于是我把数据库删除了又新建了下,输出1111111111,但是我原来的程序还是不行,提示变了,成为:can't connection db:java.sql.SQLException: No suitable driver
query error:java.lang.Exception: datebase connection can't use!
java.lang.NullPointerException

到了这一步我总结了下,我觉得以前的环境变量没有设置好有一部分的原因。

然后有个一朋友zhaochunhui(没有烟抽的日子)回复我了:can't connection db:java.sql.SQLException: No suitable driver
query error:java.lang.Exception: datebase connection can't use!
java.lang.NullPointerException
没有适当的驱动
数据库不能应用
空指针错误

有可能你的 数据库创建的有问题

确实是,我创建的时候到最后一步了提示EM配置错误,以前创建的时候就没遇到过,而在reboot computer后,我原来的程序终于可以正常工作了。但是EM还是打不开,于是又把数据库删除了,重新建,这次没有选上示例方案(不知道和这个有关系没),上次创建有问题的时候选了,建好了后重新用上面所设计到的程序都测试,都能正常工作,EM也能打开了,问题是没了,却带给我了许多思考。比如遇到问题怎么想去解决,有个朋友ahu201() 回复说:http://forum.java.sun.com/thread.jspa?threadID=571464
http://www.jguru.com/faq/view.jsp?EID=455768,
有事Google查询,都会有相关解决办法的.  我看了他提供的两个帖子,和我的情况有些累似,包括出现的问题都是莫名其妙的,以前这样做都没问题,但偏偏这次不行。我觉得这种问题都是出现在细节上的,有时候一点细节问题没做好,可能出现和以前截然不同的问题,所以当我们遇到问题的时候,先想想以前有没经历过,以前是怎么做的,和现在有什么区别,以前怎么解决的,在在网上看别人是怎么解决的,也可以发帖子问,和别人讨论都是不错的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值