Исключение при выполнении запроса к базе MSSQL Android Kotlin

В Activity вызываю функции класса SQL, getConnection() проходит нормально, на executeMsSQLQuery() вылетает. Код класса при прямом выполнении на компьютере ошибок не вызывает, выдаёт ожидаемый результат. Что я делаю не так?

Код вызова

println("Начало работы SQL")
var SQL1 = SQl.MsSQLDatabaseExampleKotlin
SQL1.getConnection()
SQL1.executeMsSQLQuery()

Код класса SQL

package com.varvet.barcodereadersample
import android.support.v7.app.AppCompatActivity
import android.widget.TextView
import java.sql.*
import java.util.Properties
class SQl {
    object MsSQLDatabaseExampleKotlin {
        var conn: Connection? = null
        var username = "sa" // provide the username
        var password = "password" // provide the corresponding password

        @JvmStatic

        fun main(args: Array<String>) {
            // make a connection to MySQL Server
            getConnection()
            // execute the query via connection object
            executeMsSQLQuery()
        }

        fun executeMsSQLQuery() {
            var stmt: Statement? = null
            var resultset: ResultSet? = null
            try {
                stmt = conn!!.createStatement()
                resultset = stmt!!.executeQuery("SELECT name FROM master.dbo.sysdatabases;")
                if (stmt.execute("SELECT [ID]\n" +
                                "      ,[SERIAL_NO]\n" +
                                "      ,[INV_NO]\n" +
                                "      ,[IT_INVENT].[dbo].[ITEMS].[BRANCH_NO]\n" +
                                "      ,[LOC_NO]\n" +
                                "      ,[DESCR]\n" +
                                "\t  ,[IT_INVENT].[dbo].[BRANCHES].[BRANCH_NAME]\n" +
                                "  FROM [IT_INVENT].[dbo].[ITEMS], [IT_INVENT].[dbo].[BRANCHES]\n" +
                                "  WHERE [IT_INVENT].[dbo].[ITEMS].[BRANCH_NO] = [IT_INVENT].[dbo].[BRANCHES].[BRANCH_NO] and [IT_INVENT].[dbo].[ITEMS].[INV_NO] = 100316")) {
                    resultset = stmt.resultSet
                }
                while (resultset!!.next()) {
                    println(resultset.getString("descr"))

                }

            } catch (ex: SQLException) {
                // handle any errors
                ex.printStackTrace()
            } finally {
                // release resources
                if (resultset != null) {
                    try {
                        resultset.close()
                    } catch (sqlEx: SQLException) {
                    }
                    resultset = null
                }
                if (stmt != null) {
                    try {
                        stmt.close()
                    } catch (sqlEx: SQLException) {
                    }
                    stmt = null
                }
                if (conn != null) {
                    try {
                        conn!!.close()
                    } catch (sqlEx: SQLException) {
                    }
                    conn = null
                }
            }
        }


        /**
         * This method makes a connection to MsSQL Server
         * In this example, MsSQL Server is running in the local host (so 127.0.0.1)
         * at the standard port 3306
         */
        fun getConnection() {
            val connectionProps = Properties()
            connectionProps.put("user", username)
            connectionProps.put("password", password)
            try {
                Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance()
                conn = DriverManager.getConnection(
                        "jdbc:jtds:sqlserver" + "://" +
                                "192.168.2.100" +
                                ":" + "1433" + "/" +
                                "IT_INVENT",
                        connectionProps)
            } catch (ex: SQLException) {
                // handle any errors
                ex.printStackTrace()
            } catch (ex: Exception) {
                // handle any errors
                ex.printStackTrace()
            }
        }
    }
}

Run log

I/System.out: Начало работы SQL
W/System.err: android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:389)
W/System.err:     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
        at java.net.Socket.connect(Socket.java:621)
        at net.sourceforge.jtds.jdbc.SharedSocket.createSocketForJDBC3(SharedSocket.java:288)
        at net.sourceforge.jtds.jdbc.SharedSocket.<init>(SharedSocket.java:251)
        at net.sourceforge.jtds.jdbc.JtdsConnection.<init>(JtdsConnection.java:331)
        at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
        at java.sql.DriverManager.getConnection(DriverManager.java:569)
        at java.sql.DriverManager.getConnection(DriverManager.java:191)
        at com.varvet.barcodereadersample.MainActivity.getConnection(MainActivity.kt:108)
        at com.varvet.barcodereadersample.MainActivity.onActivityResult(MainActivity.kt:131)
        at android.app.Activity.dispatchActivityResult(Activity.java:7590)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4416)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4465)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6810)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.varvet.barcodereadersample, PID: 30741
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=0, data=Intent { (has extras) }} to activity {com.varvet.barcodereadersample/com.varvet.barcodereadersample.MainActivity}: kotlin.KotlinNullPointerException
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4423)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4465)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6810)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
     Caused by: kotlin.KotlinNullPointerException
        at com.varvet.barcodereadersample.MainActivity.executeMySQLQuery(MainActivity.kt:49)
        at com.varvet.barcodereadersample.MainActivity.onActivityResult(MainActivity.kt:132)
        at android.app.Activity.dispatchActivityResult(Activity.java:7590)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4416)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4465) 
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:201) 
        at android.app.ActivityThread.main(ActivityThread.java:6810) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873) 
E/MQSEventManagerDelegate: failed to get MQSService.
I/Process: Sending signal. PID: 30741 SIG: 9

Ответы (1 шт):

Автор решения: Sergei Buvaka

Вам же ошибка NetworkOnMainThreadException явно говорит где ваша проблема.

Нельзя в Android-е делать запросы в сеть на основном потоке т.к. это блокирует интерфейс пользователя. Вам необходимо выполнить ваш запрос на рабочем потоке и потом передать результат в основной (UI Thread) поток.

→ Ссылка