java - 使用 JDBC 驱动程序在 Android 应用程序和 Oracle DB 之间建立连接

标签 java android oracle jdbc oracle11g

我在使用 JDBC 驱动程序在我的应用程序和 Oracle 数据库之间建立连接时遇到问题。

主机 Oracle 版本:Oracle Database 11g 版本 11.2.0.1.0 - 64 位生产

.Jar jdbc驱动程序我尝试过:ojdbc5.jar、ojdbc6.jar、ojdbc14.jar,全部来自oracle本身。 我已在 list 中授予应用程序权限。

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

我完全没有得到任何回应,logcat 中什么也没有。 SQL语句对远程DB没有影响。 我可以使用 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:没有匹配的身份验证协议(protocol)。

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

最佳答案

您可以尝试一下此代码并发布错误日志吗?另外请注意,你真的不应该这样做,你应该有一个像 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();
  }
 }

再读一遍,不推荐这样做。

关于java - 使用 JDBC 驱动程序在 Android 应用程序和 Oracle DB 之间建立连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31209978/

相关文章:

java - 如何确保对提交给 ThreadPoolExecutor 然后取消的 FutureTask 进行垃圾回收?

Android:未调用 fragment 中的 onActivityResult

sql - 如何利用SQL(Oracle)来计算字符串的大小?

performance - 用于处理历史记录的 ETL

java - Android 无法在应用程序中连接我的网络服务

sql - 选择超过 16 位数字会导致值错误

java - JDBC中批量插入

java - 从 Activity 调用 fragment 方法的问题

java - Arrays.asList 的返回类型是什么?

android - Phonegap Capture 不适用于果冻 bean