【发布时间】: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.jar、ojdbc6.jar 一起使用,因为它们需要一些 Android 上不可用的 Java SE 组件。所以,我们必须使用ojdbc14.jar,因为它比ojdbc5.jar 和ojdbc6.jar 更早,并且不需要高级Java 组件,这也意味着ojdbc14.jar 只有基本功能。
使用ojdbc14.jar,您可能必须在运行数据库的远程主机上的sqlnet.ora 中设置“SQLNET.ALLOWED_LOGON_VERSION=8”。这将允许较旧的客户端连接到较新的数据库,否则会引发错误 ORA-28040: No matching authentication protocol.
在 SQL 语句执行后,close Connection 和 Statement 也很重要,否则更改不会保存在实际的远程数据库中。
【问题讨论】:
标签: java android oracle jdbc oracle11g