2015-07-03 49 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

不僅如此,理想情況下,您不應該在客戶端做很多數據處理,它應該發生在服務器上,客戶端應該只接收必要的數據。另外,數據很容易失去同步。我想不出任何其他用例,然後嘗試一些能夠快速運行並且稍後會產生更大問題的東西...... –

相關問題