#android #sql-server-2008 #database-connection
#Android #sql-server-2008 #подключение к базе данных
Вопрос:
Я разрабатываю приложение для Android для подключения SQL Server 2008, и это мой исходный код DBConn.java
public class DBConn {
private static Connection conn = null ;
private static String DRIVER = "net.sourceforge.jtds.jdbc.Driver";
private static String DB_NAME = "TestDB" ;
private static String DB_USER = "sa" ;
private static String DB_PASSWORD = "sa" ;
public boolean conSqlServer() {
Log.d("ERR","start connect SQL SERVER") ;
try {
Class.forName(DRIVER).newInstance();
String connString = "jdbc:jtds:sqlserver://192.168.1.100:1433/TestDB; instance=SQLEXPRESS; user=sa;password=sa";
conn = DriverManager.getConnection(connString);
Log.d("SUCCESS","Connection successful ");
return true;
}
catch (SQLException e) {
Log.d("ERR","ERROR CONNECTION 1 = " e.getMessage());
e.printStackTrace();
return false ;
}
catch (Exception ex ) {
Log.d("ERR","ERROR CONNECTION 2 = " ex.getMessage());
ex.printStackTrace();
return false ;
}
}
}
я вызываю это из MainActivity.java
public class MainActivity extends ActionBarActivity {
....
....
DBConn dbconn = new DBConn();
dbconn.conSqlServer() ;
...
}
AndroidManifest.xml
<manifest>
.....
<uses-permission android:name="android.permission.INTERNET" />
.....
</manifest>
но я получил такую ошибку
java.sql.SQLException: Network error IOException: socket failed: EACCES (Permission denied)
at net.sourceforge.jtds.jdbc.JtdsConnection.<init>(JtdsConnection.java:436)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
at java.sql.DriverManager.getConnection(DriverManager.java:179)
at java.sql.DriverManager.getConnection(DriverManager.java:213)
at com.noh.connectdb.app.core.DBConn.conSqlServer(DBConn.java:35)
at com.noh.connectdb.app.MainActivity.onCreate(MainActivity.java:20)
....
....
- Я запускаю с устройства Android через Wi-Fi
- Я проверяю соединение, мое устройство может пинговать сервер
- брандмауэр закрыт
- открыт порт 1433
может ли кто — нибудь мне помочь?
Комментарии:
1. Подключение к вашей базе данных из вашего приложения — это NOGO. Я не знаю, чего вы пытаетесь достичь, но вместо этого используйте API. если я получил ваше приложение, я могу легко взломать вашу базу данных путем обратного проектирования вашего приложения.
2. я просто пытаюсь подключить sql server из своего приложения, чтобы оно работало или нет, но оно показывает такую ошибку, есть ли способ исправить
Здравствуйте. Много тем перечитал, даже нашёл работающий исходник.
Проблема только в том, что у меня почему-то не подключается к Mysql.
Вот пример ф-ции:
Java | ||
|
Проделываю через denwer.
Это —
Java | ||
|
логин, пароль и адрес:порт/бд.
Порт в php.ini 3306, в эмуляторе при переходе на 10.0.2.2 всё страница грузится.
База test создана. Пользователь тоже.
При запуске приложение не вылетает, доходит до:
conn = DriverManager.getConnection(url, userName, password);
и сразу же попадает в exception:
Java | ||
|
Драйвер Class.forName(«com.mysql.jdbc.Driver»).newInstance (); загружается.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
I’m trying to make an Android app communicate with a MySQL database. I get the following error even with the correct permissions set up in the manifest:
java.net.SocketException: socket failed: EACCES (Permission denied) in Android Studio
Here is the AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.biddingapp">
<uses-configuration android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".SecondActivity"></activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Here is the MainActivity.java
public class MainActivity extends AppCompatActivity {
private EditText username;
private EditText password;
private Button login;
Connection con;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
username = (EditText)findViewById(R.id.username);
password = (EditText)findViewById(R.id.password);
login = (Button)findViewById(R.id.login);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new MainActivity.checkLogin().execute("");
}
});
}
private class checkLogin extends AsyncTask<String, String, String>{
String str = null;
Boolean isSuccess = false;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
@Override
protected String doInBackground(String... strings) {
con = connectionClass(ConnectionClass.user.toString(),ConnectionClass.password.toString(),ConnectionClass.database.toString(),ConnectionClass.server.toString());
if(con == null){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"Check Internet Connection",Toast.LENGTH_LONG).show();
}
});
str = "On Internet Connection";
}
else {
try {
String sql = "SELECT * FROM users WHERE username = '" + username.getText() + "' AND password = '" + password.getText() + "' ";
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if (rs.next()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Login Success", Toast.LENGTH_LONG).show();
}
});
str = "Success";
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
finish();
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Check email or password", Toast.LENGTH_LONG).show();
}
});
username.setText("");
password.setText("");
}
} catch (Exception e) {
isSuccess = false;
Log.e("SQL Error : ", e.getMessage());
}
}
return str;
}
}
@SuppressLint("NewApi")
public Connection connectionClass(String user, String password, String database, String server){
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Connection connection = null;
String connectionURL = null;
try{
Class.forName("com.mysql.jdbc.Driver");
connectionURL = "jdbc:mysql://localhost/biddingapp://" + server+"/" + database + ";user=" + user + ";password=" + password + ";";
connection = DriverManager.getConnection(connectionURL);
}catch (Exception e){
Log.e("SQL Connection Error : ", e.getMessage());
}
return connection;
}
}
Here is the ConnectionClass.java
package com.example.biddingapp;
import android.annotation.SuppressLint;
import android.os.StrictMode;
import android.util.Log;
import java.sql.Connection;
import java.sql.DriverManager;
public class ConnectionClass {
public static String user = "androidstudio";
public static String password = "program";
public static String database = "users";
public static String server = "localhost";
}
How can I solve this issue? Is there any better way to do this?
Я пытаюсь заставить приложение Android общаться с базой данных MySQL. Я получаю следующую ошибку даже с правильными разрешениями, установленными в манифесте:
java.net.SocketException: сбой сокета: EACCES (отказано в доступе) в Android Studio
Вот AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.biddingapp">
<uses-configuration android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".SecondActivity"></activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Вот MainActivity.java
public class MainActivity extends AppCompatActivity {
private EditText username;
private EditText password;
private Button login;
Connection con;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
username = (EditText)findViewById(R.id.username);
password = (EditText)findViewById(R.id.password);
login = (Button)findViewById(R.id.login);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new MainActivity.checkLogin().execute("");
}
});
}
private class checkLogin extends AsyncTask<String, String, String>{
String str = null;
Boolean isSuccess = false;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
@Override
protected String doInBackground(String... strings) {
con = connectionClass(ConnectionClass.user.toString(),ConnectionClass.password.toString(),ConnectionClass.database.toString(),ConnectionClass.server.toString());
if(con == null){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"Check Internet Connection",Toast.LENGTH_LONG).show();
}
});
str = "On Internet Connection";
}
else {
try {
String sql = "SELECT * FROM users WHERE username = '" + username.getText() + "' AND password = '" + password.getText() + "' ";
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if (rs.next()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Login Success", Toast.LENGTH_LONG).show();
}
});
str = "Success";
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
finish();
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Check email or password", Toast.LENGTH_LONG).show();
}
});
username.setText("");
password.setText("");
}
} catch (Exception e) {
isSuccess = false;
Log.e("SQL Error : ", e.getMessage());
}
}
return str;
}
}
@SuppressLint("NewApi")
public Connection connectionClass(String user, String password, String database, String server){
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Connection connection = null;
String connectionURL = null;
try{
Class.forName("com.mysql.jdbc.Driver");
connectionURL = "jdbc:mysql://localhost/biddingapp://" + server+"/" + database + ";user=" + user + ";password=" + password + ";";
connection = DriverManager.getConnection(connectionURL);
}catch (Exception e){
Log.e("SQL Connection Error : ", e.getMessage());
}
return connection;
}
}
Вот ConnectionClass.java
package com.example.biddingapp;
import android.annotation.SuppressLint;
import android.os.StrictMode;
import android.util.Log;
import java.sql.Connection;
import java.sql.DriverManager;
public class ConnectionClass {
public static String user = "androidstudio";
public static String password = "program";
public static String database = "users";
public static String server = "localhost";
}
Как я могу решить эту проблему? Есть ли лучший способ сделать это?
3 ответа
Первая строка должна быть: <uses-permission android:name="android.permission.INTERNET" />
Я думаю, вы запускаете приложение в эмуляторе Android и хотите подключиться к серверу sql, работающему на вашем хост-компьютере.
Для подключения с эмулятора Android к машине, на которой работает эмулятор, необходимо использовать IP-адрес 10.0.2.2
Дополнительную информацию вы можете найти здесь
0
mhlnstdt25
6 Янв 2021 в 15:12
Также нужно упомянуть порт.
MySQL работает на порту 3306 на локальной машине.
Сделайте следующее:
connectionURL = "jdbc:mysql://localhost:3306/biddingapp://" + server+"/" + database + ";user=" + user + ";password=" + password + ";";
Кроме того, разрешение на доступ в Интернет необходимо исправить
<uses-permission android:name="android.permission.INTERNET" />
0
Umer Khalid
12 Янв 2021 в 21:33