java - 在 Android Studio 中与 JDBC 斗争

标签 java android jdbc android-studio

我正在尝试通过我开发的 Android 应用程序在我的 SQL Server 数据库上运行存储过程。我现在只是在胡闹,但我似乎无法让它运行。事情是我没有遇到任何类型的错误或崩溃 - 应用程序运行良好,我可以单击按钮,存储过程似乎不想运行。

SP 在表中创建一行。我已经在 SQL Server 中对此进行了测试,它运行良好。问题似乎与从我的应用程序执行它有关。

我想我已经正确设置了。

1) 我已将正确的 .jar 文件包含在我的应用程序的 libs 文件夹中。

2) 我在 build.gradle 中包含了对库的引用:-

dependencies {
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.google.android.gms:play-services:8.3.0'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile files('libs/jtds-1.3.1.jar')
}

3) 我已经导入了我需要的所有库(我认为):-

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

4) 我有一个按钮,单击该按钮时应运行存储过程:-

@Override
public void onClick(View v) {
    try {
        Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
        String username = "myusername";
        String password = "mypassword";
        Connection DbConn = DriverManager.getConnection("jdbc:jtds:sqlserver://sql9.hostinguk.net/matprichardson;user=" + username + ";password=" + password);

        Log.w("Connection","Open");
        Statement stmt = DbConn.createStatement();
        stmt.execute("exec [matprichardson].[updatelatlong]");

        DbConn.close();
    } catch (Exception e) {
        Log.w("Error connection","" + e.getMessage());
    }
}

如果我从 try/catch block 中删除代码,Class.forName 部分会以红色突出显示,当我将鼠标悬停时,我会得到一个 java.lang.ClassNotFoundException 但我已经读过这就是原因首先是 try/catch block ……我说得对吗?

无论如何,在对此进行了一个小时的修补之后,我已经到了不知道该做什么的地步。希望大家帮帮忙。

注意:我直接在我的设备上运行该应用程序,而不是通过模拟器。

另一个注意事项:在 Android Monitor 的“logcat”部分,我收到一个错误。单击按钮时的完整日志:

11-28 22:54:29.173 11995-11995/uk.co.matprichardson.omgandroid D/libc: [NET] android_getaddrinfofornet+,hn 18(0x73716c372e686f),sn(),hints(known),family 0,flags 4
11-28 22:54:29.173 11995-11995/uk.co.matprichardson.omgandroid D/libc: [NET] android_getaddrinfofornet-, err=8
11-28 22:54:29.173 11995-11995/uk.co.matprichardson.omgandroid E/MYAPP: exception android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1155)
    at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
    at java.net.InetAddress.getAllByName(InetAddress.java:215)
    at java.net.Socket.tryAllAddresses(Socket.java:109)
    at java.net.Socket.<init>(Socket.java:178)
    at java.net.Socket.<init>(Socket.java:150)
    at net.sourceforge.jtds.jdbc.SharedSocket.<init>(SharedSocket.java:259)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:311)
    at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:187)
    at java.sql.DriverManager.getConnection(DriverManager.java:179)
    at java.sql.DriverManager.getConnection(DriverManager.java:144)
    at uk.co.matprichardson.omgandroid.MainActivity.onClick(MainActivity.java:114)
    at android.view.View.performClick(View.java:4785)
    at android.view.View$PerformClick.run(View.java:19869)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:155)
    at android.app.ActivityThread.main(ActivityThread.java:5721)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

最佳答案

这并不完全正确。

catch (Exception e)
{
    Log.w("Error connection","" + e.getMessage());
}
11-26 20:49:14.662 5445-5445/uk.co.matprichardson.omgandroid W/Error connection: null

像往常一样,答案在完整的堆栈跟踪中,而不仅仅是在异常消息中。您基本上是在抑制整个异常,包括它的堆栈跟踪,并且只记录唯一的异常消息。这真的没有帮助(不仅对我们来说是为了在您不理解的情况下将其翻译成通俗易懂的术语,而且对您自己也是为了研究/谷歌它)。

如果您不知道如何print the full stack trace in Android ,前往以下问答:Android - print full exception backtrace to log .

一旦掌握了完整的堆栈跟踪,应该如下所示:

android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1155)
    at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
    at java.net.InetAddress.getAllByName(InetAddress.java:215)
    at java.net.Socket.tryAllAddresses(Socket.java:109)
    at java.net.Socket.<init>(Socket.java:178)
    at java.net.Socket.<init>(Socket.java:150)
    at net.sourceforge.jtds.jdbc.SharedSocket.<init>(SharedSocket.java:259)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:311)
    at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:187)
    at java.sql.DriverManager.getConnection(DriverManager.java:179)
    at java.sql.DriverManager.getConnection(DriverManager.java:144)
    at uk.co.matprichardson.omgandroid.MainActivity.onClick(MainActivity.java:114)
    at android.view.View.performClick(View.java:4785)
    at android.view.View$PerformClick.run(View.java:19869)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:155)
    at android.app.ActivityThread.main(ActivityThread.java:5721)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

然后简单地复制粘贴异常类型、消息(如果有)和堆栈跟踪的第一行(没有括号和行号),如下所示,

android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork

进入一个体面的搜索引擎寻找线索,比如Google .截至目前,直接或间接(重复)点击率最高的是以下 Stack Overflow 问题:

肯定其中之一已经解释/回答了您的具体问题。

关于java - 在 Android Studio 中与 JDBC 斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33946718/

相关文章:

java - JPA 是否要求数据源来自 JNDI?

java - 判断一个对象是数组还是字符串

Java GUI 卡住井字游戏

android - 如何一次在所有屏幕上显示单个列表项?

java - 在Android上制作一个随机移动的可点击按钮

java - 如果数字相等,我可以确定对它们进行的任何数学运算的结果也相等吗?

android - 无法在新版本的计费服务中添加base64公钥

java - mysql 之间和通过 JDBC preparedstatement 使用 - 获取参数索引超出范围异常

java - Java 中最高效的多线程数据库插入

java - 是否值得为 int 值创建 PreparedStatement?