当前位置: 首页 > 知识库问答 >
问题:

Android Studio中与Azure的JDBC连接失败

蓝星辰
2023-03-14

所以我已经和这个开关斗争了几天,感觉好像我已经用尽了所有相关的搜索词。首先,我要说的是,我对此做了很多研究,但都无济于事;我得出的结论是,这要么是非常不正常(不太可能)的事情,要么是我在某种程度上忽略了一些微小的细节。我还要马上说,是的,我知道直接从应用程序连接到数据库并不理想,我应该使用web服务器,但就我的意图和目的而言,这个解决方案不是问题。

我知道这篇文章很长,但我非常感谢大家的时间。如果没有别的,至少它可能会帮助最近开始使用JDBC并开始遇到问题的其他人。“我尝试过的”部分概述了您可以在网上找到的绝大多数尝试的事情。

我想做的是:

使用JDBC驱动程序,通过Android Studio连接到我的Azure托管SqlServer数据库。

我遇到的错误是:

W/System.err: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host vet-to-go.database.windows.net, port 1433 has failed. Error: "Connection timed out: no further information. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".

我尝试/验证过的(简短列表):

-连接代码发生在活动类中,但它在异步任务中。

-使用权限android:name=“android.permission.INTERNET”

-Azure防火墙配置为允许我的IP连接。

-Windows防火墙有允许传入的规则

-在SQLServer配置管理器中,我启用了命名管道

-尝试SQL服务器浏览器都运行

-已经尝试过使用两种jre7

-Source兼容性

-编译文件('libs/sqljdbc41.jar')[或jre8的42]

-更令人绝望的是,为了确保它们不是问题所在,在完全关闭Windows Firewall并允许任何IP通过Azure Firewall连接(起始/结束IP为0.0.0-255.255.255)后,我也未能连接

-我可以平

考虑到以上所有因素,我只能假设错误在我的代码中的某个地方,但我绝对不知道在哪里。为了给棺材钉上钉子,应该提到的是,我能够成功地查询数据库

以下是工作代码:

import java.sql.*;

public class DatabaseHelper {

public static void main(String[] args) throws Exception {
    String custID = "1";
    String connectionString = "jdbc:sqlserver://vet-to-go.database.windows.net:1433;database=Vet To Go DB;user=myLogin@vet-to-go;password=myPass;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;";
    String queryString = "SELECT FirstName, LastName FROM Tbl_Customer WHERE CustomerID = " + custID;

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    Connection myConnection = DriverManager.getConnection(connectionString);
    Statement myStatement = myConnection.createStatement();
    ResultSet myResultSet = myStatement.executeQuery(queryString);

    myResultSet.next();
    String firstName = myResultSet.getString("FirstName");
    String lastName = myResultSet.getString("LastName");

    System.out.println(firstName);
    System.out.println(lastName);

    myStatement.close();
    myConnection.close();
}

}

我知道有些代码看起来很奇怪,只是因为我希望将其合并到另一个类中。这是我最近的一次尝试(正如我提到的,我已经尝试了一段时间,所以我尝试了几种不同的组合)

import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import java.sql.*;

public class LandingPage extends AppCompatActivity {

TextView txtFirst, txtLast;
String firstName, lastName, customerID;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_landing_page);
    txtFirst = (TextView)findViewById(R.id.txtFirstName);
    txtLast = (TextView)findViewById(R.id.txtLastName);

    customerID = getIntent().getStringExtra("custID");

    new myAsyncTask(LandingPage.this).execute();

    txtFirst.setText(firstName);
    txtLast.setText(lastName);
}

public class myAsyncTask extends AsyncTask<Void, Void, String> {
    String connectionString = "jdbc:sqlserver://vet-to-go.database.windows.net:1433;database=Vet To Go DB;user=myLogin@vet-to-go;password=myPass;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;";
    String queryString = "SELECT FirstName, LastName FROM Tbl_Customer WHERE CustomerID = " + customerID;
    Context context;


    public myAsyncTask(Context context) {
        System.out.println("Async instantiated.");
        this.context = context;
    }
    protected void onPreExecute() {
        System.out.println("Pre-executing Async task.");
    }

    protected String doInBackground(Void... params) {
        try {
            System.out.println("Attempting to connect to DB...");
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            Connection con = DriverManager.getConnection(connectionString);
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(queryString);

            while (rs.next()) {
                System.out.println("Sorting through ResultSet...");
                firstName = rs.getString("FirstName");
                lastName = rs.getString("LastName");
            }

        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "Complete";
    }

    protected void onPostExecute(String result) {
        if (result.equals("Complete")) {
            System.out.println("Async task complete.");
        }
    }
}
}

运行上述代码后,我得到“到主机vet-to-go.database.windows.net的TCP/IP连接,端口1433已失败。”此行出现错误:

Connection con = DriverManager.getConnection(connectionString);

我认为这并不重要,但为了以防万一,以下是目前主要活动中的所有内容:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    etID = (EditText)findViewById(R.id.etCustID);
    btnSubmit = (Button)findViewById(R.id.btnSubmit);

    btnSubmit.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            customerID = etID.getText().toString();
            myIntent = new Intent(MainActivity.this, LandingPage.class);
            myIntent.putExtra("custID", customerID);

            startActivity(myIntent);
        }
    });
}

Android Studio 2.3

建造#AI-162.3764568,建造于2017年2月24日

JRE:1.8.0_112-release-b06 amd64

JVM:JetBrains s.r.o的OpenJDK 64位服务器虚拟机

Gradle版本3.3

目标API 22:Android 5.1

Min Sdk V 21

构建工具V25.0.0

共有1个答案

高溪叠
2023-03-14

首先,在Android上直接连接Azure SQL数据库不是个好主意。通常,推荐的方法是通过调用一些REST API来访问数据库,这些API可以在Azure上创建为Web应用或移动应用。

其次,许多现有的SO线程与您的问题类似,一个解决方案是在Android上使用jTDS驱动程序而不是MS SQL Server驱动程序sqljdbc进行连接,因为Android上似乎不完全支持sqljdbc驱动程序。作为参考,请参阅以下已解析的线程。

  1. https://social.msdn.microsoft.com/forums/sqlserver/en-US/4799819a-27fd-4292-a3d8-f114207c20b2/using-the-jdbc-driver-with-android
  2. 使用android的JDBC驱动程序连接Sql数据库
  3. 如何在Android中使用JTDS驱动程序连接sql server

希望有帮助。

 类似资料:
  • 我在连接到公共托管的静态IP mysql服务器时遇到了一个奇怪的问题。 我能够使用MySQL Workbench成功连接到服务器,也可以通过SSH连接到本地远程服务器。但是从jdbc连接器连接到mysql服务器的尝试(通过NetBeans和本地部署的代码都失败)。在查看日志时,代码正在尝试与远程服务器连接,考虑到用户凭据是本地用户而不是远程用户的。因此用户存在于远程,但java在尝试连接时会考虑u

  • 尝试创建一个简单的Jmeter 5.0测试,以使用JDBC连接配置连接到数据库。它无法连接到我本地的mySql数据库。[jdbc:mysql://localhost:3306]。我可以使用mySql工作台连接到我本地的mySql数据库,所以我知道我可以连接到它。 它似乎在方法上失败。 你有什么想法为什么会发生这种情况吗? 我在apache-jmeter-5.0\bin中尝试了不同的mysql-co

  • 我想连接Java类文件与SQL server 2012。我已通过SQL server身份验证登录。但我接收到连接错误。 错误:到主机127.0.0.1端口1433的TCP/IP连接失败。错误:“连接拒绝:连接。验证连接属性。确保主机上正在运行SQL Server实例并接受端口上的TCP/IP连接。确保到端口的TCP连接没有被防火墙阻止。” 我的代码---

  • 有人尝试过将jmeter连接到azure mongodb吗。我尝试连接模拟器,但无法连接,也没有收到任何错误。或者知道Jmeter是否支持与azure mongodb的连接? 检查azure留档:它指出连接字符串应该是这样的。

  • 问题内容: 我有一个使用JDBC连接到MySQL的应用程序。在某些情况下,JDBC连接空闲数小时(甚至几天),并且失去与MySQL的连接,然后尝试执行查询时除外。最好的解决方案是什么? 问题答案: 保持连接打开时间不足是一个坏习惯。当数据库打开时间过长时,它将强制关闭。您应该编写JDBC代码,以便它总是在您获取它们的同一块块中关闭连接(以及语句和结果集),以防止这样的资源泄漏。 但是,获取每个连接