使用 jTDS 驱动程序通过 Android Studio 连接到 Azure DB 时出现问题

发布于 2025-01-14 15:44:39 字数 9572 浏览 1 评论 0原文

我正在尝试使用 Android Studio 中的 jTDS 驱动程序版本 1.2.7 连接到 Azure DB。我收到此错误:“SQL 错误:原因:由于客户端 TLS 版本低于服务器允许的最低 TLS 版本,登录失败。”已尝试更改 Azure 上的 TLS 版本,但仍然遇到相同的错误。我还尝试将 ssl=request 添加到连接字符串的末尾,但最终出现另一个错误:

AndroidRuntime: FATAL EXCEPTION: main
    Process: com.capstone.rideshareapp, PID: 6440
    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/sun/net/ssl/SSLContext;
        at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.factory(SocketFactoriesSUN.java:174)
        at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.getFactory(SocketFactoriesSUN.java:157)
        at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.createSocket(SocketFactoriesSUN.java:86)
        at net.sourceforge.jtds.jdbc.SharedSocket.enableEncryption(SharedSocket.java:332)
        at net.sourceforge.jtds.jdbc.TdsCore.negotiateSSL(TdsCore.java:554)
        at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:350)
        at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:188)
        at java.sql.DriverManager.getConnection(DriverManager.java:580)
        at java.sql.DriverManager.getConnection(DriverManager.java:236)
        at com.capstone.rideshareapp.MainActivity.connectionClass(MainActivity.java:68)
        at com.capstone.rideshareapp.MainActivity.onCreate(MainActivity.java:42)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.sun.net.ssl.SSLContext" on path: DexPathList[[zip file "/data/app/com.capstone.rideshareapp-c0eguH-FO1sEfSOTqUd8qw==/base.apk"],nativeLibraryDirectories=[/data/app/com.capstone.rideshareapp-c0eguH-FO1sEfSOTqUd8qw==/lib/x86, /system/lib, /system/product/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.factory(SocketFactoriesSUN.java:174) 
        at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.getFactory(SocketFactoriesSUN.java:157) 
        at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.createSocket(SocketFactoriesSUN.java:86) 
        at net.sourceforge.jtds.jdbc.SharedSocket.enableEncryption(SharedSocket.java:332) 
        at net.sourceforge.jtds.jdbc.TdsCore.negotiateSSL(TdsCore.java:554) 
        at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:350) 
        at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:188) 
        at java.sql.DriverManager.getConnection(DriverManager.java:580) 
        at java.sql.DriverManager.getConnection(DriverManager.java:236) 
        at com.capstone.rideshareapp.MainActivity.connectionClass(MainActivity.java:68) 
        at com.capstone.rideshareapp.MainActivity.onCreate(MainActivity.java:42) 
        at android.app.Activity.performCreate(Activity.java:7802) 
        at android.app.Activity.performCreate(Activity.java:7791) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

我也无法找出导致此错误的原因。除了尝试 jTDS 驱动程序之外,我还尝试了 Microsoft JDBC 驱动程序,但仍然遇到我似乎无法弄清楚的错误。 JDBC 驱动程序的错误是这样的:“SQL 错误:驱动程序无法使用安全套接字层 (SSL) 加密建立与 SQL Server 的安全连接。错误:“套接字已关闭”。ClientConnectionId”

build.gradle (: app) :

plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.capstone.rideshareapp"
        minSdkVersion 24
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
//        multiDexEnabled true

        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 {

//    def multidex_version = "2.0.1"
//    implementation "androidx.multidex:multidex:$multidex_version"
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation files('libs/jtds-1.2.7.jar')
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

MainActivity.java :

package com.capstone.rideshareapp;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

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 {
    // db connection string
    static private final String connectionURL = "jdbc:jtds:sqlserver://myschooldata.database.windows" +
            ".net:1433;DatabaseName=MySchoolData;sslProtocol=TLSv1;user=*****@myschooldata;password=******;" +
            "encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows" +
            ".net;loginTimeout=30;";
    static protected Connection connection = null;

    Button signUpBtn;
    Button loginBtn;

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

        connectionClass();

        signUpBtn = findViewById(R.id.signUpBtn);
        signUpBtn.setOnClickListener(v -> switchToRegister());

        loginBtn = findViewById(R.id.loginBtn);
        loginBtn.setOnClickListener(v -> switchToLogin());
    }

    private void switchToRegister() {
        Intent switchToCreateAccount = new Intent(this, CreateAccount.class);
        startActivity(switchToCreateAccount);
    }

    private void switchToLogin() {
        Intent switchToLogin = new Intent(this, Login.class);
        startActivity(switchToLogin);
    }

    // can be called in another activity using MainActivity.connectionClass()
    @SuppressLint("NewApi")
    static protected void connectionClass() {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
            connection = DriverManager.getConnection(connectionURL);
            Log.i("Connected", "It works");
        }
        catch (SQLException se) {
            Log.e("SQL Error", se.getMessage());
        }
        catch (ClassNotFoundException e) {
            Log.e("Loading Error", e.getMessage());
        }
        catch (Exception e) {
            Log.e("Error", e.getMessage());
        }
    }
}

作为澄清,当使用不同的驱动程序时,我更改了连接字符串、所用驱动程序的依赖项和 Class.forName()。

有谁知道为什么在尝试不同的可能解决方案后,我不断收到 jTDS 驱动程序或 JDBC 驱动程序的这些错误?

I am trying to connect to Azure DB with the jTDS Driver version 1.2.7 in Android Studio. I got this error: "SQL Error: Reason: Login failed due to client TLS version being less than minimal TLS version allowed by the server." Already tried changing the TLS version on Azure and still got the same error. I also tried adding ssl=request to the end of the connection string, but I end up getting another error:

AndroidRuntime: FATAL EXCEPTION: main
    Process: com.capstone.rideshareapp, PID: 6440
    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/sun/net/ssl/SSLContext;
        at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.factory(SocketFactoriesSUN.java:174)
        at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.getFactory(SocketFactoriesSUN.java:157)
        at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.createSocket(SocketFactoriesSUN.java:86)
        at net.sourceforge.jtds.jdbc.SharedSocket.enableEncryption(SharedSocket.java:332)
        at net.sourceforge.jtds.jdbc.TdsCore.negotiateSSL(TdsCore.java:554)
        at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:350)
        at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:188)
        at java.sql.DriverManager.getConnection(DriverManager.java:580)
        at java.sql.DriverManager.getConnection(DriverManager.java:236)
        at com.capstone.rideshareapp.MainActivity.connectionClass(MainActivity.java:68)
        at com.capstone.rideshareapp.MainActivity.onCreate(MainActivity.java:42)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.sun.net.ssl.SSLContext" on path: DexPathList[[zip file "/data/app/com.capstone.rideshareapp-c0eguH-FO1sEfSOTqUd8qw==/base.apk"],nativeLibraryDirectories=[/data/app/com.capstone.rideshareapp-c0eguH-FO1sEfSOTqUd8qw==/lib/x86, /system/lib, /system/product/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.factory(SocketFactoriesSUN.java:174) 
        at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.getFactory(SocketFactoriesSUN.java:157) 
        at net.sourceforge.jtds.ssl.SocketFactoriesSUN$TdsTlsSocketFactory.createSocket(SocketFactoriesSUN.java:86) 
        at net.sourceforge.jtds.jdbc.SharedSocket.enableEncryption(SharedSocket.java:332) 
        at net.sourceforge.jtds.jdbc.TdsCore.negotiateSSL(TdsCore.java:554) 
        at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:350) 
        at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:188) 
        at java.sql.DriverManager.getConnection(DriverManager.java:580) 
        at java.sql.DriverManager.getConnection(DriverManager.java:236) 
        at com.capstone.rideshareapp.MainActivity.connectionClass(MainActivity.java:68) 
        at com.capstone.rideshareapp.MainActivity.onCreate(MainActivity.java:42) 
        at android.app.Activity.performCreate(Activity.java:7802) 
        at android.app.Activity.performCreate(Activity.java:7791) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

I haven't been able to figure out what has been causing this error either. On top of trying the jTDS Driver, I've also tried the Microsoft JDBC Driver and still run into errors that I seem to not be able to figure out either. The error with the JDBC Driver is this: "SQL Error: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "Socket is closed". ClientConnectionId"

build.gradle (:app) :

plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.capstone.rideshareapp"
        minSdkVersion 24
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
//        multiDexEnabled true

        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 {

//    def multidex_version = "2.0.1"
//    implementation "androidx.multidex:multidex:$multidex_version"
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation files('libs/jtds-1.2.7.jar')
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

MainActivity.java :

package com.capstone.rideshareapp;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

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 {
    // db connection string
    static private final String connectionURL = "jdbc:jtds:sqlserver://myschooldata.database.windows" +
            ".net:1433;DatabaseName=MySchoolData;sslProtocol=TLSv1;user=*****@myschooldata;password=******;" +
            "encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows" +
            ".net;loginTimeout=30;";
    static protected Connection connection = null;

    Button signUpBtn;
    Button loginBtn;

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

        connectionClass();

        signUpBtn = findViewById(R.id.signUpBtn);
        signUpBtn.setOnClickListener(v -> switchToRegister());

        loginBtn = findViewById(R.id.loginBtn);
        loginBtn.setOnClickListener(v -> switchToLogin());
    }

    private void switchToRegister() {
        Intent switchToCreateAccount = new Intent(this, CreateAccount.class);
        startActivity(switchToCreateAccount);
    }

    private void switchToLogin() {
        Intent switchToLogin = new Intent(this, Login.class);
        startActivity(switchToLogin);
    }

    // can be called in another activity using MainActivity.connectionClass()
    @SuppressLint("NewApi")
    static protected void connectionClass() {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
            connection = DriverManager.getConnection(connectionURL);
            Log.i("Connected", "It works");
        }
        catch (SQLException se) {
            Log.e("SQL Error", se.getMessage());
        }
        catch (ClassNotFoundException e) {
            Log.e("Loading Error", e.getMessage());
        }
        catch (Exception e) {
            Log.e("Error", e.getMessage());
        }
    }
}

As a clarification, when using the different drivers, I changed the connection strings, the dependency for the used driver, and the Class.forName().

Does anyone know why, after trying different possible solutions, I keep getting these errors for either the jTDS Driver or the JDBC Driver?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文