2016-12-14 145 views
0

通過點擊一個按鈕,我想執行一個選擇查詢來顯示一些結果,我使用Internet權限和AsyncTask以及我的PC的地址ip來執行此調用,但它不適用於我,還有日誌不顯示我什麼弄清楚這個問題,這是代碼:Android與Oracle數據庫的連接

清單文件:

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

的Android PROGRAMM:

package com.ammach.oraclecon; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class MainActivity extends AppCompatActivity { 


    class Task extends AsyncTask<Void,Void,String>{ 

     @Override 
     protected String doInBackground(Void... params) { 

      String param="mal9a walou"; 
      String driver="oracle.jdbc.driver.OracleDriver"; 
      String bd="ORCL"; 
      String user="SYSTEM"; 
      String passwd="SYSTEM"; 
      String port="1521"; 
      String ip="192.168.1.7"; 
      String url="jdbc:oracle:thin:@"+ip+":"+port+":"+bd; 

      Connection con=null; 
       try { 
        Class.forName(driver); 
        con = DriverManager.getConnection(url, user, passwd); 
        Log.e("coooon", "coooon"); 
        Statement st=con.createStatement(); 
        Log.e("Statement", "Statement"); 
        ResultSet resultSet = st.executeQuery("select * from auteur"); 
        Log.e("ResultSet", "ResultSet"); 

        Log.e("con", "You made it, take control your database now!"); 
        if(resultSet.next()){ 
         param=resultSet.getString("nom"); 
         Log.e("dkhal", "rah dkhal"); 
        }else{ 
         Log.e("walou", "walou"); 
        } 

       } catch (SQLException | ClassNotFoundException e) { 
        e.printStackTrace(); 
       } 


      return param; 
     } 

     @Override 
     protected void onPostExecute(String param) { 
      super.onPostExecute(param); 
      textView.setText(param); 
      Toast.makeText(MainActivity.this, "finished", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    TextView textView; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     textView= (TextView) findViewById(R.id.txt); 
    } 

    public void fetchOracle(View view) { 

     new Task().execute(); 
     Toast.makeText(MainActivity.this, "starting", Toast.LENGTH_SHORT).show(); 
    } 
} 

我鋁所以在Netbeans的一個簡單的java項目(void main)中運行相同的過程,它完美的工作,我嘗試了很多次的Android應用程序,但我失敗了,有人可以幫我解決這個問題。

這是Java PROGRAMM:

 String param = "nothing"; 
     String driver = "oracle.jdbc.driver.OracleDriver"; 
     String bd = "ORCL"; 
     String user = "SYSTEM"; 
     String passwd = "SYSTEM"; 
     String port = "1521"; 
     String ip = "localhost"; 
     String url = "jdbc:oracle:thin:@" + ip + ":" + port + ":" + bd; 

     Connection con = null; 
     try { 
      Class.forName(driver); 
      con = DriverManager.getConnection(url, user, passwd); 
      Statement st = con.createStatement(); 
      ResultSet resultSet = st.executeQuery("select * from auteur"); 
      if (resultSet.next()) { 
       param = resultSet.getString("nom"); 

      } else { 
       System.out.println("no result"); 
      } 
      System.out.println("nom: "+param); 
     } catch (SQLException | ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
+0

你是在一個真正的android設備或模擬器? –

+0

在一個真實的設備上 –

回答

0

您與唯一的語句e.printStackTrace catch子句();製造詭計。它只是吞噬了例外,當然,你無法看到它。使用Log類報告捕獲的異常要好得多。插入那裏像Log.e(「tag」,e.toString());你會看到問題。

接下來,您應該總是關閉您使用過的所有資源。在你的情況下,它是連接,語句和ResultSet。關閉它們的正確位置在你的(錯過的)finally子句中。

但是,無論如何,如果你想從Android設備使用Oracle,那麼你應該確保網絡192.168.1。*可以從你的設備到達,地址(192.168.1.7)至少可以ping通(從你的設備)。你設法以某種方式測試連接?並且可以有更多的理由來獲得異常(它被你的代碼默默吞下),這意味着你應該做的第一件事就是改變你的代碼並正確地登錄異常。接下來,它可能是缺少的JDBC驅動程序庫,它可能是一個網絡配置問題,導致數據庫無法訪問(最可能),如果您沒有權限從「auteur」讀取數據,則可能是Oracle側的問題,等等

+0

我從我的手機ping我的電腦,它是可及的,我改變了代碼與你說的話,它給了我下面的例外: –

+0

java.sql.SQLException:Exception d'E/S :網絡適配器無法建立連接 –

+0

問題是該網址在netbeans中的簡單項目中工作 –