【问题标题】:Establishing connection between Android app and Oracle DB using JDBC driver使用 JDBC 驱动程序在 Android 应用程序和 Oracle DB 之间建立连接
【发布时间】:2015-09-21 11:34:56
【问题描述】:

我无法使用 JDBC 驱动程序在我的应用程序和 Oracle DB 之间建立连接。

托管 Oracle 版本:Oracle 数据库 11g 版本 11.2.0.1.0 - 64 位生产

.Jar jdbc 驱动我试过:ojdbc5.jar、ojdbc6.jar、ojdbc14.jar,都来自oracle本身。 我已授予应用程序清单中的权限。

  <uses-permission android:name="android.permission.INTERNET" />

我完全没有得到任何回应,logcat 中什么也没有。 SQL 语句对远程数据库没有影响。 我可以使用 SQL Plus 在我的机器上使用相同的登录凭据连接远程数据库,并拥有所有权限。

MainActivity.java 中的代码

package testapp.myapplication;    
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import java.sql.ResultSet;
import java.util.ArrayList;


public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            super.onCreate(savedInstanceState);
            ConnectOra db = new ConnectOra();
            ResultSet rs = db.getResult();
            ArrayList<String> list = new ArrayList<String>();
            while (rs.next()) {
                list.add(rs.getString(1));
                System.out.println(rs.getString(1));
            }
        } catch (Exception e) {
            System.out.print(e);

        }


    }

    public void btn(View view) {
        startActivity(new Intent(MainActivity.this, MainActivity.class));//Just to refresh the mainact.
    }
}

来自 ConnectOra.java 的代码:

package testapp.myapplication;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import android.util.Log;

public class ConnectOra {
    private Connection conn;
    private Statement stmt;
    public ConnectOra() throws ClassNotFoundException {
        try {
            System.out.println("in try");
            Class.forName("oracle.jdbc.driver.OracleDriver");
            String url = "jdbc:oracle:thin:@103.A.B.C:15210/mdb";
            this.conn = DriverManager.getConnection(url,"XXX","pw");
            this.conn.setAutoCommit(false);
            this.stmt = this.conn.createStatement();
        } catch(SQLException e) {
            Log.d("tag", e.getMessage());
        }
    }
    public ResultSet getResult() throws SQLException {
        ResultSet rset = stmt.executeQuery("select * from emp;");
        System.out.println(rset+"");
        stmt.close();
        return rset;
    }
}

所选答案有效,我的代码也有效。

Android 无法与 ojdbc5.jarojdbc6.jar 一起使用,因为它们需要一些 Android 上不可用的 Java SE 组件。所以,我们必须使用ojdbc14.jar,因为它比ojdbc5.jarojdbc6.jar 更早,并且不需要高级Java 组件,这也意味着ojdbc14.jar 只有基本功能。

使用ojdbc14.jar,您可能必须在运行数据库的远程主机上的sqlnet.ora 中设置“SQLNET.ALLOWED_LOGON_VERSION=8”。这将允许较旧的客户端连接到较新的数据库,否则会引发错误 ORA-28040: No matching authentication protocol.

在 SQL 语句执行后,close ConnectionStatement 也很重要,否则更改不会保存在实际的远程数据库中。

【问题讨论】:

    标签: java android oracle jdbc oracle11g


    【解决方案1】:

    您能否试用此代码并发布错误日志。还有一点要注意,你真的不应该这样做,你应该有一个像this 这样的应用程序服务器来管理到 Oracle DB 的连接。但如果你想玩不安全,试试这段代码:

    String driver = "oracle.jdbc.driver.OracleDriver"; //
    
      String serverName = "localhost";
      String portNumber = "1521";
      String db = "XE";
      String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":"
        + db; // connectOracle is the data
      // source name
      String user = "system"; // username of oracle database
      String pwd = "root"; // password of oracle database
      Connection con = null;
      ServerSocket serverSocket = null;
      Socket socket = null;
      DataInputStream dataInputStream = null;
      DataOutputStream dataOutputStream = null;
    
      try {
       Class.forName(driver);// for loading the jdbc driver
    
       System.out.println("JDBC Driver loaded");
    
       con = DriverManager.getConnection(url, user, pwd);// for
                    // establishing
       // connection
       // with database
       Statement stmt = con.createStatement();
    
       serverSocket = new ServerSocket(8888);
       System.out.println("Listening :8888");
    
       while (true) {
        try {
    
         socket = serverSocket.accept();
         System.out.println("Connection Created");
         dataInputStream = new DataInputStream(
           socket.getInputStream());
         dataOutputStream = new DataOutputStream(
           socket.getOutputStream());
         System.out.println("ip: " + socket.getInetAddress());
         // System.out.println("message: " +
         // dataInputStream.readUTF());
    
         ResultSet res=stmt.executeQuery("select * from person");
         while(res.next()){
          System.out.println(res.getString(1));
         }
    
        } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        }
    
        if (dataInputStream != null) {
         try {
          dataInputStream.close();
         } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         }
        }
    
        if (dataOutputStream != null) {
         try {
          dataOutputStream.close();
         } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         }
        }
       }
      } catch (Exception e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }
    

    再读一遍,不建议这样做。

    【讨论】:

    • 当然,您必须更改端口号详细信息和所有内容。
    • 将立即尝试。我知道它不安全,但我又没有任何选择,而且数据库中的数据不敏感。
    • 不仅如此,理想情况下你不应该在客户端做太多的数据处理,它应该发生在服务器上,客户端应该只接收必要的数据。此外,数据很容易不同步。我想不出任何用例,除了尝试一些快速工作的东西,然后会产生更大的问题......
    • 我需要提供访问权限的数据库不支持移动服务器。我还能尝试什么其他方法?
    • 那么它将如何满足建立多个连接的客户端?如果这只是一个测试,那么您正在围绕一些您稍后将丢弃的东西构建基础设施......并且不要忘记我说的处理部分......
    猜你喜欢
    • 2013-09-29
    • 2012-04-04
    • 2014-02-27
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多