2016-12-14 3 views
0

durch Klicken auf eine Schaltfläche, ich möchte eine SELECT-Abfrage ausführen, um einige Ergebnisse anzuzeigen, habe ich die Internet-Berechtigung und die AsyncTask und die IP-Adresse meines PCs, um diesen Aufruf auszuführen, aber es nicht funktioniert mich, auch das Log nicht Alles, was nicht zeigen Sie mir die Frage, um herauszufinden, das ist der Code:Android-Verbindung mit Oracle-Datenbank

in Manifest-Datei:

<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(); 
    } 
} 

i Al also führe die gleiche Prozedur in einem einfachen Java-Projekt (void main) in Netbeans aus, und es funktioniert perfekt, ich habe so oft die Android-Anwendung ausprobiert, aber ich habe versagt, könnte mir jemand helfen, dieses Problem zu lösen.

das ist das 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

sind Sie auf einem echten Android-Gerät oder dem Emulator? –

+0

auf einem echten Gerät –

Antwort

0

Ihre catch-Klausel, mit der einzigen Anweisung e.printStackTrace(); macht den Trick. Es schluckt nur die Ausnahme und Sie können es natürlich nicht sehen. Es ist viel besser, die Log-Klasse zu verwenden, um die abgefangene Ausnahme zu melden. Fügen Sie dort etwas wie Log.e ein ("tag", e.toString()); und du wirst das Problem sehen.

Als nächstes sollten Sie immer alle Ressourcen schließen, die Sie verwendet haben. In Ihrem Fall ist es die Verbindung, die Anweisung und das ResultSet. Der richtige Ort, um sie zu schließen, ist in Ihrer (verpasste) finally-Klausel.

Aber wenn Sie mit Oracle von einem Android Gerät arbeiten wollen, dann sollten Sie sicherstellen, dass das Netzwerk 192.168.1. * Von Ihrem Gerät aus erreichbar ist und die Adresse (192.168.1.7) zumindest erfolgreich gepingded werden kann Gerät). Hast du es irgendwie geschafft, die Verbindung zu testen? Und es kann viel mehr Gründe geben, eine Ausnahme zu erhalten (die in Ihrem Code stillschweigend verschluckt wird). Das bedeutet, dass Sie als Erstes Ihren Code ändern und die Ausnahme ordnungsgemäß protokollieren müssen. Als nächstes kann es eine fehlende JDBC-Treiberbibliothek sein, es kann ein Netzwerkkonfigurationsproblem sein, das die Datenbank unerreichbar macht (am wahrscheinlichsten), es kann das Problem auf der Seite des Oracle sein, wenn Sie keine Erlaubnis haben, von "Auteur" zu lesen, usw.

+0

ich pinged mein PC von meinem Telefon und es ist erreichbar, ich änderte den Code mit den Bemerkungen Sie erwähnt, und es gibt mir die Ausnahme: –

+0

java.sql.SQLException: Exception d'E/S : Der Netzwerkadapter konnte die Verbindung nicht herstellen –

+0

Das Problem ist, dass die URL in einem einfachen Projekt in Netbeans funktioniert –