Android 与 Oracle 数据库的连接

Android Connection with Oracle Database

通过单击一个按钮,我想执行一个 select 查询以显示一些结果,我使用了 Internet 权限和 AsyncTask 以及我 PC 的地址 ip 来执行此调用但它没有用对我来说,日志也没有告诉我任何解决问题的方法,这是代码:

在清单文件中:

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

Android 程序:

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 程序:

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

你的 catch 子句只有一条语句 e.printStackTrace();使伎俩。它只是吞下了异常,而您当然看不到它。最好使用 Log class 报告捕获的异常。插入类似 Log.e("tag", e.toString());你会发现问题所在。

接下来您应该始终关闭所有已使用的资源。在您的情况下,它是连接、语句和结果集。关闭它们的正确位置是在您的(遗漏的)finally 子句中。

但是无论如何,如果您想从 Android 设备使用 Oracle,那么您应该确保网络 192.168.1.* 可以从您的设备访问并且地址 (192.168.1.7) 至少可以是ping 成功(从您的设备)。您是否设法以某种方式测试连接?并且可能有更多的原因导致异常(它在您的代码中默默地被吞没),这意味着您应该做的第一件事是更改您的代码并正确记录异常。接下来可能是缺少 JDBC 驱动库,可能是网络配置问题导致数据库无法访问(最有可能),如果您没有读取权限,则可能是 Oracle 方面的问题"auteur",等等