使用JDBC驱动程序在Android应用程序和Oracle DB之间建立连接

时间:2015-07-03 15:16:53

标签: java android oracle jdbc oracle11g

我无法使用JDBC驱动程序在我的应用程序和Oracle数据库之间建立连接。

主机Oracle版本:Oracle数据库11g版本11.2.0.1.0 - 64位生产

.Jar jdbc驱动程序我试过:ojdbc5.jar,ojdbc6.jar,ojdbc14.jar,全部来自oracle本身。 我已经在清单中授予了应用程序的权限。

  <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.jarojdbc6.jar,因为它们需要Android上没有的某些Java SE组件。因此,我们必须使用ojdbc14.jar,因为它早于ojdbc5.jarojdbc6.jar并且不需要高级Java组件,这也意味着ojdbc14.jar只有基本函数ojdbc14.jar 1}}。

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

执行SQL语句后Connection StatementIn [9]: df.merge(df1, how='outer') Out[9]: Table_Name Table_Alias Variable_Name 0 tab_1 t1 Owner 1 tab_1 t1 Owner_Id 2 tab_2 t2 Purchase_date 3 tab_3 t3 Maintenance_cost 也很重要,否则更改不会保存在实际的远程数据库中。

1 个答案:

答案 0 :(得分: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();
  }
 }

再读一遍,不建议这样做。