使用db2,oracle8等数据库提供的jdbc驱动,jdbc-odbc客户端需要进行odbc配置,在web上是不现实的

解决方案 »

  1.   

    其实也可尝试用applet-servlet这种方式来进行通讯。避免直接使用jdbc.:)
      

  2.   

    applet-servlet方式不就得传参数吗?那似乎是一场灾难!
      

  3.   

    小人不才,如果将一个序列化的对象通过这种方式发过来,是有点浪费带宽(因为序列化流比单纯的参数传递要消耗更多的字节),但是使用起来非常透明啊。而且你还可以动态绑定不同的javabean,逻辑也好写。而且听你的问题,业务应该以查询为主,这种方式应该可以适应你的业务。:)Good luck.
      

  4.   

    今天拜读了网上的一篇大作,讲到applet连接数据库的问题,
    居然连接的方法和servlet以及jsp完全一致,但小弟测试之后无法连上,
    那位大哥能给我一个明确的答复:applet到底能不能连数据库?
    附(网友的连接方法):String url="jdbc:odbc:interweb";
    String ls_1="select * from t_interdata";
    Class.forName("com.ms.jdbc.odbc.JdbcOdbcDriver"); //加载驱动程序
    //建立连接
    Connection con=DriverManager.getConnection(url,"sa",""); 
    //执行SQL
    Statement stmt=con.createStatement();
    ResultSet result=stmt.executeQuery(ls_1); //返回结果
      

  5.   

    在Applet中访问数据库,通过JDBC啊,在客户端安装数据库的客户端。
    这是我觉得在Applet实现队数据的访问好像没什么意义, Applet是需要下载到浏览器端的,然后再浏览器端运行,则会必然要求浏览器端好么安装你的数据库的客户端(比如OrACLE的客户端,SQLServer的客户端),另外还要建立数据的连接,基于浏览器的目的就是为了实现瘦客户,希望在客户端只需要一个浏览器,不需要在安装其他东西,什么数据库客户端啦,统统都不要装,这样就没哟任何意义了。
    如果你在Applet中直接实现对数据库的访问,那必然需要在浏览器侧的机器必须安装数据库的客户端,如果你的程序时基于Intrarnet的,只是在企业网内部运行,虽然一个个机器去安装客户端,有些麻烦,到还是可以的。假如你是基于Internet,那就不可能了,你不可能要求每个来浏览网页的客户都安装数据库客户端,另外还需要配置数据库的连接吧。显然是不可能的。
    我觉得可行的方法是WEB服务器和数据可服务器进行交互,WEB服务器取得数据后,然后将数据送到浏览器端。比较典型的方式一个是通过CGI编程,WEB服务器上的CGI进程从数据库取数据,然后HTML的方式发到浏览器端;另一种方式现在也用得很多,那就是使用ASP了。
    我个人觉得在Applet访问数据美什么意义,不过还是附上JDBC的实现,下面是一个例子,这里提供的是一个通过JDBC以TCP/IP方式访问ORACLE数据库的例子,包括直接执行SQL语句和调用存储过程两种方式:import java.sql.*;
    import java.lang.*;
    import java.io.*;public class JDBC_EXAMPLE {
    public static void main(String args[]){
    Connection connection=null;
    Statement dispSTMT=null;    //用于装载执行静态的SQL语句
         CallableStatement callableSTMT=null;
    //可以调用数据库存储过程
         ResultSet result; String sQueryStr="";
    String sVolLevel=""; //建立数据库连接
    try{
       Class.forName("oracle.jdbc.driver.OracleDriver");
       connection = DriverManager.getConnection (
    "jdbc:oracle:thin:@10.136.140.156:1521:mis",
    "UserName","Password"); //数据库的用户名和口令
       //getConnection(String url,String UserName,String UserPassword)
       dispSTMT=connection.createStatement();
        }catch(Exception e){}
        
        //执行SQL语句并去取得数据集
        try {
        sQueryStr="select TO_CHAR(SYSDATE) as SD form DUAL";
          result=dispSTMT.executeQuery(sQueryStr);
          if (result.next())
            sVolLevel=result.getString("SD").trim();
        }catch(Exception e){}
        
        //执行存储过程并取得数据
        try{
          callableSTMT=(CallableStatement)con.prepareCall("{call SP_GETDYHGL(?,?,?,?,?,?,?,?)}");      callableSTMT.clearParameters();

    String sInParm1,sInParm2,sInParm3,sInParm4;
    String sOutParm1,sOutParm2;
    float  fOutParm3,fOutParm4;

    sInParm1 ="Input Parm1";
    sInParm2 ="Input Parm2";
    sInParm3 ="Input Parm3";
    sInParm4 ="Input Parm4";      //输入参数
          callableSTMT.setString(1,sInParm1);
          callableSTMT.setString(2,sInParm2);
          callableSTMT.setString(3,sInParm3);
          callableSTMT.setString(4,sInParm4);      //注册输出参数
          callableSTMT.registerOutParameter(5,Types.VARCHAR);
          callableSTMT.registerOutParameter(6,Types.VARCHAR);
          callableSTMT.registerOutParameter(7,Types.FLOAT);
          callableSTMT.registerOutParameter(8,Types.FLOAT);      //执行存储过程
          callableSTMT.execute();      //取得输出数据
          sOutParm1   =callableSTMT.getString(5);
          sOutParm2 =callableSTMT.getString(6);
          fOutParm3   =callableSTMT.getFloat(7);
          fOutParm4   =callableSTMT.getFloat(8);
          
        }catch(Exception e){}
        
      }  
    }    
      

  6.   

    在Applet中访问数据库,通过JDBC啊,在客户端安装数据库的客户端。
    这是我觉得在Applet实现队数据的访问好像没什么意义, Applet是需要下载到浏览器端的,然后再浏览器端运行,则会必然要求浏览器端好么安装你的数据库的客户端(比如OrACLE的客户端,SQLServer的客户端),另外还要建立数据的连接,基于浏览器的目的就是为了实现瘦客户,希望在客户端只需要一个浏览器,不需要在安装其他东西,什么数据库客户端啦,统统都不要装,这样就没哟任何意义了。
    如果你在Applet中直接实现对数据库的访问,那必然需要在浏览器侧的机器必须安装数据库的客户端,如果你的程序时基于Intrarnet的,只是在企业网内部运行,虽然一个个机器去安装客户端,有些麻烦,到还是可以的。假如你是基于Internet,那就不可能了,你不可能要求每个来浏览网页的客户都安装数据库客户端,另外还需要配置数据库的连接吧。显然是不可能的。
    我觉得可行的方法是WEB服务器和数据可服务器进行交互,WEB服务器取得数据后,然后将数据送到浏览器端。比较典型的方式一个是通过CGI编程,WEB服务器上的CGI进程从数据库取数据,然后HTML的方式发到浏览器端;另一种方式现在也用得很多,那就是使用ASP了。
    我个人觉得在Applet访问数据美什么意义,不过还是附上JDBC的实现,下面是一个例子,这里提供的是一个通过JDBC以TCP/IP方式访问ORACLE数据库的例子,包括直接执行SQL语句和调用存储过程两种方式:import java.sql.*;
    import java.lang.*;
    import java.io.*;public class JDBC_EXAMPLE {
    public static void main(String args[]){
    Connection connection=null;
    Statement dispSTMT=null;    //用于装载执行静态的SQL语句
         CallableStatement callableSTMT=null;
    //可以调用数据库存储过程
         ResultSet result; String sQueryStr="";
    String sVolLevel=""; //建立数据库连接
    try{
       Class.forName("oracle.jdbc.driver.OracleDriver");
       connection = DriverManager.getConnection (
    "jdbc:oracle:thin:@10.136.140.156:1521:mis",
    "UserName","Password"); //数据库的用户名和口令
       //getConnection(String url,String UserName,String UserPassword)
       dispSTMT=connection.createStatement();
        }catch(Exception e){}
        
        //执行SQL语句并去取得数据集
        try {
        sQueryStr="select TO_CHAR(SYSDATE) as SD form DUAL";
          result=dispSTMT.executeQuery(sQueryStr);
          if (result.next())
            sVolLevel=result.getString("SD").trim();
        }catch(Exception e){}
        
        //执行存储过程并取得数据
        try{
          callableSTMT=(CallableStatement)con.prepareCall("{call SP_GETDYHGL(?,?,?,?,?,?,?,?)}");      callableSTMT.clearParameters();

    String sInParm1,sInParm2,sInParm3,sInParm4;
    String sOutParm1,sOutParm2;
    float  fOutParm3,fOutParm4;

    sInParm1 ="Input Parm1";
    sInParm2 ="Input Parm2";
    sInParm3 ="Input Parm3";
    sInParm4 ="Input Parm4";      //输入参数
          callableSTMT.setString(1,sInParm1);
          callableSTMT.setString(2,sInParm2);
          callableSTMT.setString(3,sInParm3);
          callableSTMT.setString(4,sInParm4);      //注册输出参数
          callableSTMT.registerOutParameter(5,Types.VARCHAR);
          callableSTMT.registerOutParameter(6,Types.VARCHAR);
          callableSTMT.registerOutParameter(7,Types.FLOAT);
          callableSTMT.registerOutParameter(8,Types.FLOAT);      //执行存储过程
          callableSTMT.execute();      //取得输出数据
          sOutParm1   =callableSTMT.getString(5);
          sOutParm2 =callableSTMT.getString(6);
          fOutParm3   =callableSTMT.getFloat(7);
          fOutParm4   =callableSTMT.getFloat(8);
          
        }catch(Exception e){}
        
      }  
    }    
      

  7.   

    在Applet中访问数据库,通过JDBC啊,在客户端安装数据库的客户端。
    这是我觉得在Applet实现队数据的访问好像没什么意义, Applet是需要下载到浏览器端的,然后再浏览器端运行,则会必然要求浏览器端好么安装你的数据库的客户端(比如OrACLE的客户端,SQLServer的客户端),另外还要建立数据的连接,基于浏览器的目的就是为了实现瘦客户,希望在客户端只需要一个浏览器,不需要在安装其他东西,什么数据库客户端啦,统统都不要装,这样就没哟任何意义了。
    如果你在Applet中直接实现对数据库的访问,那必然需要在浏览器侧的机器必须安装数据库的客户端,如果你的程序时基于Intrarnet的,只是在企业网内部运行,虽然一个个机器去安装客户端,有些麻烦,到还是可以的。假如你是基于Internet,那就不可能了,你不可能要求每个来浏览网页的客户都安装数据库客户端,另外还需要配置数据库的连接吧。显然是不可能的。
    我觉得可行的方法是WEB服务器和数据可服务器进行交互,WEB服务器取得数据后,然后将数据送到浏览器端。比较典型的方式一个是通过CGI编程,WEB服务器上的CGI进程从数据库取数据,然后HTML的方式发到浏览器端;另一种方式现在也用得很多,那就是使用ASP了。
    我个人觉得在Applet访问数据美什么意义,不过还是附上JDBC的实现,下面是一个例子,这里提供的是一个通过JDBC以TCP/IP方式访问ORACLE数据库的例子,包括直接执行SQL语句和调用存储过程两种方式:import java.sql.*;
    import java.lang.*;
    import java.io.*;public class JDBC_EXAMPLE {
    public static void main(String args[]){
    Connection connection=null;
    Statement dispSTMT=null;    //用于装载执行静态的SQL语句
         CallableStatement callableSTMT=null;
    //可以调用数据库存储过程
         ResultSet result; String sQueryStr="";
    String sVolLevel=""; //建立数据库连接
    try{
       Class.forName("oracle.jdbc.driver.OracleDriver");
       connection = DriverManager.getConnection (
    "jdbc:oracle:thin:@10.136.140.156:1521:mis",
    "UserName","Password"); //数据库的用户名和口令
       //getConnection(String url,String UserName,String UserPassword)
       dispSTMT=connection.createStatement();
        }catch(Exception e){}
        
        //执行SQL语句并去取得数据集
        try {
        sQueryStr="select TO_CHAR(SYSDATE) as SD form DUAL";
          result=dispSTMT.executeQuery(sQueryStr);
          if (result.next())
            sVolLevel=result.getString("SD").trim();
        }catch(Exception e){}
        
        //执行存储过程并取得数据
        try{
          callableSTMT=(CallableStatement)con.prepareCall("{call SP_GETDYHGL(?,?,?,?,?,?,?,?)}");      callableSTMT.clearParameters();

    String sInParm1,sInParm2,sInParm3,sInParm4;
    String sOutParm1,sOutParm2;
    float  fOutParm3,fOutParm4;

    sInParm1 ="Input Parm1";
    sInParm2 ="Input Parm2";
    sInParm3 ="Input Parm3";
    sInParm4 ="Input Parm4";      //输入参数
          callableSTMT.setString(1,sInParm1);
          callableSTMT.setString(2,sInParm2);
          callableSTMT.setString(3,sInParm3);
          callableSTMT.setString(4,sInParm4);      //注册输出参数
          callableSTMT.registerOutParameter(5,Types.VARCHAR);
          callableSTMT.registerOutParameter(6,Types.VARCHAR);
          callableSTMT.registerOutParameter(7,Types.FLOAT);
          callableSTMT.registerOutParameter(8,Types.FLOAT);      //执行存储过程
          callableSTMT.execute();      //取得输出数据
          sOutParm1   =callableSTMT.getString(5);
          sOutParm2 =callableSTMT.getString(6);
          fOutParm3   =callableSTMT.getFloat(7);
          fOutParm4   =callableSTMT.getFloat(8);
          
        }catch(Exception e){}
        
      }  
    }    
      

  8.   

    在Applet中访问数据库,通过JDBC啊,在客户端安装数据库的客户端。
        这是我觉得在Applet实现队数据的访问好像没什么意义, Applet是需要下载到浏览器端的,然后再浏览器端运行,则会必然要求浏览器端好么安装你的数据库的客户端(比如OrACLE的客户端,SQLServer的客户端),另外还要建立数据的连接,基于浏览器的目的就是为了实现瘦客户,希望在客户端只需要一个浏览器,不需要在安装其他东西,什么数据库客户端啦,统统都不要装,这样就没哟任何意义了。
        如果你在Applet中直接实现对数据库的访问,那必然需要在浏览器侧的机器必须安装数据库的客户端,如果你的程序时基于Intrarnet的,只是在企业网内部运行,虽然一个个机器去安装客户端,有些麻烦,到还是可以的。假如你是基于Internet,那就不可能了,你不可能要求每个来浏览网页的客户都安装数据库客户端,另外还需要配置数据库的连接吧。显然是不可能的。
        我觉得可行的方法是WEB服务器和数据可服务器进行交互,WEB服务器取得数据后,然后将数据送到浏览器端。比较典型的方式一个是通过CGI编程,WEB服务器上的CGI进程从数据库取数据,然后HTML的方式发到浏览器端;另一种方式现在也用得很多,那就是使用ASP了。
        我个人觉得在Applet访问数据美什么意义,不过还是附上JDBC的实现,下面是一个例子,这里提供的是一个通过JDBC以TCP/IP方式访问ORACLE数据库的例子,包括直接执行SQL语句和调用存储过程两种方式:import java.sql.*;
    import java.lang.*;
    import java.io.*;public class JDBC_EXAMPLE {
    public static void main(String args[]){
    Connection connection=null;
    Statement dispSTMT=null;  //用于装载执行静态的SQL语句
        CallableStatement callableSTMT=null; 
            //可以调用数据库存储过程
        ResultSet result;String sQueryStr="";
    String sVolLevel="";//建立数据库连接
    try{
      Class.forName("oracle.jdbc.driver.OracleDriver");
      connection = DriverManager.getConnection (
    "jdbc:oracle:thin:@10.136.140.156:1521:mis",
    "UserName","Password"); //数据库的用户名和口令
      //getConnection(String url,String UserName,String UserPassword)
      dispSTMT=connection.createStatement();
        }catch(Exception e){}
        
        //执行SQL语句并去取得数据集
        try {
        sQueryStr="select TO_CHAR(SYSDATE) as SD form DUAL";
          result=dispSTMT.executeQuery(sQueryStr);
          if (result.next())
            sVolLevel=result.getString("SD").trim();
        }catch(Exception e){}
        
        //执行存储过程并取得数据
        try{
          callableSTMT=(CallableStatement)con.prepareCall("{call SP_GETDYHGL(?,?,?,?,?,?,?,?)}");      callableSTMT.clearParameters();String sInParm1,sInParm2,sInParm3,sInParm4;
    String sOutParm1,sOutParm2;
    float  fOutParm3,fOutParm4; sInParm1 ="Input Parm1";
    sInParm2 ="Input Parm2";
    sInParm3 ="Input Parm3";
    sInParm4 ="Input Parm4";      //输入参数
          callableSTMT.setString(1,sInParm1);
          callableSTMT.setString(2,sInParm2);
          callableSTMT.setString(3,sInParm3);
          callableSTMT.setString(4,sInParm4);      //注册输出参数
          callableSTMT.registerOutParameter(5,Types.VARCHAR);
          callableSTMT.registerOutParameter(6,Types.VARCHAR);
          callableSTMT.registerOutParameter(7,Types.FLOAT);
          callableSTMT.registerOutParameter(8,Types.FLOAT);      //执行存储过程
          callableSTMT.execute();      //取得输出数据
          sOutParm1  =callableSTMT.getString(5);
          sOutParm2 =callableSTMT.getString(6);
          fOutParm3  =callableSTMT.getFloat(7);
          fOutParm4  =callableSTMT.getFloat(8);
          
        }catch(Exception e){}
        
      }  
    }    
      

  9.   

    fireangel老兄:
       不知您用过ORACLE的I系列产品没有,都是采用浏览器的方式管理,而且很多是采用了applet的方式,象FORM SERVER、OEM、SQL*NET等,毫无疑问,他们都是要访问数据库的,当然客户端不需要配置任何ODBC,却不知是如何实现的?
      

  10.   

    至于ASP嘛,要做图形应用显然不行,JSP和SERVLET也不行。
      

  11.   

    Oracle8i没用过。至于你说的“采用浏览器的方式管理,而且很多是采用了applet的方式”,那是因为为什么要叫“Oracle8i”。在ORALCE8i中内嵌了对JAVA的支持,在数据库服务器端有一个ORACLE8i JServer在运行,这就是一个高度专用的JAVA虚拟机,另外它还支持一种称为SQLJ的语言,就是嵌入式SQL。这样的Applet都是标准的Java程序,在内部就实现了数据库的连接。
    另外,我不知道你的ORACLE8i的工具是不是随便找一台机器,上面除了浏览器之外什么都没装,当然,数据服务端和客户端都没有,是不是也可以连接到数据库服务器。
      

  12.   

    SQLJ is one kind of embbed SQL. Most popular database support SQLJ. In fact, there are three kinds of jdbc driver in oracle. Thin , OCI and native. In oracle, only SQLJ can use native JDBC driver to connect database. After a lot of steps, u can deploy a SQLJ into database. Oracle Jserver will help u in mapping java object into oracle object.BTW, oracle 8i installer will automatic install necessary files such as driver libary. I suppose it wouldn't install a jdbc driver and register it into classpath, and oracle still got other methods to handle database. After all, oracle got oracle database.If somebody had decompiled and found what kind of method the driver using, pls let me know. JAD is a nice tool.:)
      

  13.   

    如果给applet做数字签名呢? 那样的话,你需要用的class就可以从server动态download下来  ... 或者用rmi,server给个接口出来 ... 但是好象client要jre什么的:( 痛苦 ...
    --
    关注这一话题,想听听各位高手的意见^^
      

  14.   

    applet完全可以通过直接JDBC访问数据库,但是有一个限制,就是只能访问applet文件本身所在地服务器上的数据库。例如applet被放在http://my.server.com上,那么这个applet也只能访问my.server.com上的数据库。具体的方法前面也有例子了。
    这里再提一下另外的问题:
    1、如果使用oracle,只能使用jdbc-thin,因为jdbc-oci要求客户机安装有oracle的客户程序
    2、jdbc驱动程序下载的问题,oracle的jdbc驱动程序相对拨号网络来说十分巨大,即使是局域网,浏览器处理1兆多的.zip文件还是比较慢,而且oracle得jdbc驱动程序还需要和一个nls_charset12_01.zip文件配合使用,这个文件有12兆。过去曾经在赛扬300、128兆内存的机器上用netscape对sybase进行实验(sybase的jconnect大约1兆),applet连同swing和jconnect地调入需要20分钟!
    3、安全问题。上述的连接办法需要使用数据库的账号和密码,而且往往是写死在applet中。而大家知道applet得.class文件是可以下载和反编译的,这样密码和账号就会泄漏了。针对上述问题的解决办法有几种。
    1、用socket协议写自己的c/s程序实现,前面也有人提到,缺点是传参数
    2、用RMI远程方法调用来做,把数据库连接部分写作服务器上,缺点是IE似乎不支持;不过可以通过安装JAVA PLUGIN来解决。
    3、不要用applet来做界面,而是使用纯web界面。即采用b/s模式,利用server/jsp来实现其中第3种方法是大势所趋,其优点十分突出:
    1、对客户的端的配置和速度均无特别要求
    2、客户机无需执行任何客户程序,即零客户机管理(applet更新时有时会出现客户机无法刷新)
    3、服务器端伸缩性好,方便进行连接池、负载分担等设计
      

  15.   

    applet不要直接连接数据库,虽然这么做是允许的(前面已经说了很多了)。我觉得好的方法应该是applet和servlet通讯,又后者在服务器端使用jdbc访问数据库。两者之间的连接,使用标准的http协议。记录在server打开,并做好处理,只传applet请求的数据。(也可以使用sochet通讯)applet尽可能的简单,用作交互,和展示逻辑(比如做图),其他的都放在servlet中。