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",等等
通过单击一个按钮,我想执行一个 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",等等