<%@ page import="java.sql.*,oracle.jdbc.driver.*" contentType="text/html;charset=gb2312" session="true"%>
<%
 Connection conn=null;
 Statement  stmt=null;
 ResultSet  rs=null; DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver() );
 conn =
DriverManager.getConnection("jdbc:oracle:thin:@xxx.xxx.xxx.xxx:port:SID","us
ername", "password");
 stmt = conn.createStatement();
 rs=stmt.executeQuery("SQLstr");
%>

解决方案 »

  1.   

    Oracle的JDBC驱动要放在classpath里
    如果是Oracle8i的数据库 安装后Oracle目录里自带了驱动:classes12.zip;nls_charset12.zip
      

  2.   

    to:handbread 
    这样做有何不妥?<!--首先导入一些必要的packages-->
    <%@ page info="database handler"%>
    <%@ page import="java.io.*"%>
    <%@ page import="java.util.*"%><!--告诉编译器使用SQL包--> 
    <%@ page import="java.sql.*"%><%@ page import="javax.servlet.*"%>
    <%@ page import="javax.servlet.http.*"%><%
    //以try开始
    try
    {
    Connection con;
    Statement stmt;
    ResultSet rs;//加载驱动程序,下面的代码为加载JDBD-ODBC驱动程序
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//用适当的驱动程序连接到数据库,test"是系统dsn名
    String url="jdbc:odbc:test";//建立连接,类似于ASP中的创建数据库联接
    con=DriverManager.getConnection(url, "user1", "pass1");//创建一个JDBC声明
    stmt = con.createStatement();//增加新记录
    stmt.executeUpdate("INSERT INTO test (a,b) VALUES (1,'2')");//查询记录
    rs = stmt.executeQuery("SELECT a,b from test");//输出查询结果
    out.println("<table border=1 width=400>");
    while (rs.next())
    {
    String col1 = rs.getString(1);
    String col2 = rs.getString(2);
    //打印所显示的数据
    out.println("<tr><td>"+col1+"</td><td>"+col2+"</td></tr>");
    }
    out.println("</table>");
    }//如果加载时出错,给出相应的错误信息
    catch (Exception e) {}
    %>
      

  3.   

    你这种JDBC-ODBC的方法一点问题都没有
    我在没有修改代码的前提下 建了一个Oracle的系统DNS
    运行正常所以你要确定几点:
    1.系统DNS是否已经正确配置,也就是说Oracle连接服务名配置是否正确
    这个可以用Oracle自带的SQL/Plus来检验
    2.你对数据库操作是否正确,表名?字段名....
    这个你可以通过打印错误信息来查找
    将最后一段catch修改为
    catch(Exception e){
       out.print(e.toString());
    }
    就可以看到Oracle的系统报错了,根据错误编号 到Oracle技术手册里去查错误原因
      

  4.   

    to:headbread
    我的执行结果是:
    java.sql.SQLException: [Oracle][ODBC][Ora]ORA-12154: TNS: ??????? 
    是数据库的原因吧,按理说建了数据源后的tnsnames.ora应是
    ORADB =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.1.1.1)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = oradb)
        )
      )
    可它不是呀。
    不知是那的问题。我的OICQ是50081811
    请多指教。
      

  5.   

    为什么不直接用jdbc连而要通过odbc呢?
      

  6.   

    你先在本地用SQL/Plus 连 username/password@oradb 试试
    如果成功 说明tnsnames.ora 配置正确的
    问题就可能出在系统DNS上了不过从报错看 是TNS的配置问题
    建议你把
        (CONNECT_DATA =
          (SERVICE_NAME = oradb)
        )
    改为:
        (CONNECT_DATA =
          (SID= oradb)
        )
      

  7.   

    既然用了JSP 为什么还死盯着ODBC不放呢建议直接用JDBC
      

  8.   

    既然用了JSP 为什么还死盯着ODBC不放呢建议直接用JDBC
      

  9.   

    to:handbread
    我没用过不清楚,怎么用呀?
    你是怎么做的,用JDBC吗?
    请多指教。
      

  10.   

    我第一篇回复就是JDBC的方法
    你还是先把ODBC搞通再试JDBC吧
      

  11.   

    TO:HANDBREAD
    我也是想先搞通ODBC再试JDBC
    我用SQL/Plus 连 username/password@oradb 试了连不通
    我的oracle是8.1.7版本的,为什么没找到TNSNAMES呀?
      

  12.   

    to:handbread
    我用network administration下的net8 assistant建了一个tnsnames.ora,内空为:# TNSNAMES.ORA Network Configuration File: D:\oracle\ora81\NETWORK\ADMIN\tnsnames.ora
    # Generated by Oracle configuration tools.ORADB =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = wg)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = oradb)
        )
      )
    试了不行,把SERVICE_NAEM改为SID=oradb也不行。
      

  13.   

    你的tnsnames.ora有问题建议看一看同目录下的sqlnet.ora
    里面应该有:NAMES.DEFAULT_DOMAIN = XXXtnsnames.ora格式如下:ORADB.XXX =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xx.xx.xxx)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SID = XXXX)
        )
      )
      

  14.   

    先写个bean,在每个页面中用<jsp:useBean id="RegisterBean" scope="page" class="db.oradb" />package db;
    import java.sql.*;public class oradb {
      String orauser="用户";
      String orapasswd="密码";
      String sDBDriver="oracle.jdbc.driver.OracleDriver";
      String sConnStr="jdbc:oracle:thin:@192.168.0.4:1521:orcl";  private Connection conn = null;
      private Statement stmt = null;
      ResultSet rs = null;  public oradb() {
        try {
          Class.forName(sDBDriver);
          conn = DriverManager.getConnection(sConnStr,orauser,orapasswd);
        stmt = conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);
        }
        catch(java.lang.ClassNotFoundException e) {
          System.err.println("oradb(): " + e.getMessage());
        }
         catch(SQLException ex) {
          System.err.println("aq.executeQuery: " + ex.getMessage());
      }
    }
      public ResultSet executeQuery(String sql) {
        rs = null;
        try {
        
        rs = stmt.executeQuery(sql);
        }
        catch(SQLException ex) {
          System.err.println("aq.executeQuery: " + ex.getMessage());
        }
        return rs;
      }  public int executeUpdate(String sql) {
       int i=0;
       try{
            i=stmt.executeUpdate(sql);
        }
        catch(SQLException ex) {
            System.err.println("aq.executeQuery: " + ex.getMessage());
        }
        return i;
      }  public void closeStmt(){
        try{
          stmt.close();
         }
        catch(SQLException e){
          e.printStackTrace();
         }
      }
      public void closeConn(){
        try{
          conn.close();
         }
        catch(SQLException e){
          e.printStackTrace();
         }
      }
    }
      

  15.   

    to:handbread 
    在D:\oracle\ora81\network\ADMIN目录下只TNSNAMES,没有sqlnet.ora.
      

  16.   

    to:handbread
    执行结果又出现以下提示:
    java.sql.SQLException: [Oracle][ODBC][Ora]ORA-12514: TNS: ?????????????????? SERVICE_NAME 
    是怎么回事?
    用sql plus连接,服务名写oradb,提示:
    监听进程不能解析在连接描述符中给出的SERVICE_NAME
    请多请教。
      

  17.   

    to:handbread
    多谢你的帮助,我用ODBC已经连通了现在想试一下JDBC,能帮我把上面的程序改一下吗?请注明修改行。
      

  18.   

    ODBC联通了?
    你那个SERVICE_NAME到底是怎么回事?另:JDBC直接连的方法已经在第一个回复里贴出来了
    你需要做的就是把Oracle8i目录下的jdbc驱动加到classpath里去
      

  19.   

    to:handbread
    DriverManager.getConnection("jdbc:oracle:thin:@xxx.xxx.xxx.xxx:port:SID","us
    ername", "password");句中的jdbc:oracle:thin:@xxx.xxx.xxx.xxx:port:SID填什么呀?
      

  20.   

    那你可以开始用JDBC直接连了比ODBC简单多了关键是JDBC驱动的classpath配置问题你看看Oracle8i目录下的JDBC目录下 应该有classes12.zip 和nls_charset12.zip
    把这两个文件加到classpath里去就可以了
      

  21.   

    to:handbread
    四个驱动加上去了,执行时系统提示:
    no suitable driver
      

  22.   

    to:headbread
    老兄帮帮忙吧?
      

  23.   

    还是举例子比较直观
    下面是我一般常用的conn.jsp<%
      Connection conn=null;
      Statement  stmt=null;
         try{
    DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver() );
    conn = DriverManager.getConnection("jdbc:oracle:thin:@172.18.88.48:1521:voyager","shec", "shec");
    stmt = conn.createStatement();
    }catch(SQLException e){
    System.out.println("Error when execute a query operation :\n"
    +e.getMessage()+"\n SQL error code="+e.getErrorCode());
    }
    %>就这么简单里面172.18.88.48是数据库服务器的地址
    voyager是数据库的SID名称
    shec/shec是用户名和密码classes12.zip 和nls_charset12.zip这两个驱动可能还得受到JDK版本的影响你JDK是什么版本的?