我在使用 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.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:没有匹配的身份验证协议(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/