【问题标题】:Connect Azue SQL Database in Lnux Android Studio在 Linux Android Studio 中连接 Azure SQL 数据库
【发布时间】:2021-04-28 23:04:32
【问题描述】:

我想在 Linux(14.04 版)Android Studio 中开发可以连接到 Microsoft Azure SQL 数据库的 Android 应用程序。我正在使用最新版本的 Android Studio 4.1.2。 我尝试了一些用于数据库连接的 java 代码。但我无法建立数据库。

我的问题是如何连接到 SQL 数据库和 如何从 SQL 数据库中获取数据到我的 Android 应用程序。我的数据存储在 Azure SQL 数据库 -> 流分析(预览版)中。

Java 代码:

 String Connect_String = "jdbc:sqlserver://sqlserver.database.windows.net:1433;database=iwave_db_1;user=username@sqlserver;password=*******;" +
                    "encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;";
       
 String Username = "username@sqlserver";
 String Password = "*******";
    try {
        System.out.println("Connecting to the Database");
        //Class.forName("com.mysql.cj.jdbc.Driver");
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
        //Class.forName("com.sourceforge.jtds.jdbc.Driver").newInstance();

        Connection connection = DriverManager.getConnection(Connect_String, Username, Password);
        if (connection != null) {
            System.out.println("Done ........");
            System.out.println("Database connection success");
        }

Connection connection = DriverManager.getConnection(Connect_String, Username, Password);this 行出现错误。应用程序崩溃,我无法连接到 SQL 数据库。

错误信息:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.iwavesys.cloudazure, PID: 6864
    android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1450)
        at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:102)
        at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:90)
        at java.net.InetAddress.getLocalHost(InetAddress.java:851)
        at com.microsoft.sqlserver.jdbc.Util.lookupHostName(Util.java:652)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2690)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2362)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2213)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1276)
        at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:861)
        at java.sql.DriverManager.getConnection(DriverManager.java:569)
        at java.sql.DriverManager.getConnection(DriverManager.java:219)
        at com.iwavesys.cloudazure.ToDoActivity.Azure_Connection(ToDoActivity.java:222)
        at com.iwavesys.cloudazure.ToDoActivity.access$100(ToDoActivity.java:43)
        at com.iwavesys.cloudazure.ToDoActivity$2.onClick(ToDoActivity.java:154)
        at android.view.View.performClick(View.java:6294)
        at android.view.View$PerformClick.run(View.java:24770)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

我在我的 gradle 文件中链接所有的库文件。 build.Gradle:

apply plugin: 'com.android.application'
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.iwavesys.cloudazure"
        minSdkVersion 19
        targetSdkVersion 30
        multiDexEnabled true
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation 'org.conscrypt:conscrypt-android:2.2.1'
    implementation 'org.apache.httpcomponents:httpclient-android:4.3.5'
    //implementation 'net.sourceforge.jtds:jtds:1.3.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    implementation 'com.microsoft.azure:azure-mobile-android:3.1.0'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'com.google.guava:guava:24.1-jre'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.microsoft.azure.android:azure-storage-android:2.0.0@aar'
}

我正在使用以下版本的 .jar 文件进行连接:

  1. jtds-1.3.1.jar
  2. mssql-jdbc-8.4.1.jre8.jar
  3. mysql-connector-java-8.0.22.jar
  4. Azure 云中的防火墙设置检查以下链接。 https://i.stack.imgur.com/q37Sj.png

我在哪里失踪??我的代码是否正确??任何人都知道请帮助我。 提前谢谢你。

【问题讨论】:

    标签: java android mysql azure-sql-database


    【解决方案1】:

    由于 Android 中的 Java 风格,您需要 jtds 驱动程序。更新您的连接字符串以使用jtds,如下所示。注意变化

    • 在“sqlserver”之前添加“jtds”
    • “数据库名称”而不是“数据库”

    jdbc:jtds:sqlserver://sqlserver.database.windows.net:1433;DatabaseName=iwave_db_1;user=username@sqlserver;password=*******;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;

    另外,请确保您在清单中启用所需的权限以允许连接到互联网。还要检查 SQL Azure 实例的防火墙设置,以允许来自所需 IP 的流量。

    参考:https://www.youtube.com/watch?v=WJBs0zKGqH0

    注意:从移动应用程序直接连接到 db 不是一个好的设计。我宁愿在两者之间有一些服务器端 API 服务。

    【讨论】:

    • 我更改了我的连接字符串并添加了 Class.forName("com.sourceforge.jtds.jdbc.Driver").newInstance();到我的代码。我得到 classNot found 异常。 W/System.err: java.lang.ClassNotFoundException: com.sourceforge.jtds.jdbc.Driver
    • Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
    • 谢谢。 jtds 问题已解决,但无法连接 SQL 数据库。我面临同样的问题。 [E/AndroidRuntime: FATAL EXCEPTION: main Process: com.iwavesys.cloudazure, PID: 6864]
    • 检查 sql azure 实例是否有防火墙阻止
    • 在此链接中检查我的防火墙设置。 i.stack.imgur.com/q37Sj.png
    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多