2015-07-03 47 views
1

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

主机甲骨文版本:Oracle数据库11g第二版11.2.0.1.0 - 64位生产

的.jar JDBC驱动程序我都试过:ojdbc5.jar,ojdbc6.jar,ojdbc14.jar的,都来自甲骨文自己。 我已向应用程序授予清单中的权限。

<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一起工作,因为它们需要一些Java SE组件在Android上不可用。因此,我们必须使用ojdbc14.jar,因为它的年龄大于ojdbc5.jarojdbc6.jar,并且不需要预先提供Java组件,这也意味着只有基本功能与ojdbc14.jar一起使用。

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

它也一直在执行,其他的更改不会保存在实际的远程DB到closeConnectionStatement SQL语句后至关重要。

回答

0

你可以试试这段代码并发布错误日志。另外值得注意的是,你真的不应该这样做,你应该有一个像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(); 
    } 
} 

并再次阅读,这是不建议。

+0

当然,你必须改变端口号的细节和所有。 –

+0

将立即尝试。我知道它不安全,但是我再也没有任何选择,数据库中的数据也不敏感。 –

+0

不仅如此,理想情况下,您不应该在客户端做很多数据处理,它应该发生在服务器上,客户端应该只接收必要的数据。另外,数据很容易失去同步。我想不出任何其他用例,然后尝试一些能够快速运行并且稍后会产生更大问题的东西...... –

相关问题