【问题标题】:Struggling with JDBC in Android Studio在 Android Studio 中与 JDBC 作斗争
【发布时间】:2016-03-01 00:37:50
【问题描述】:

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

SP 在表中创建一行。我已经在 SQL Server 中对此进行了测试,并且效果很好。问题似乎在于从我的应用程序执行它..

我认为我的设置是正确的。

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

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 块中删除代码,Class.forName 部分以红色突出显示,当我悬停时,我得到一个 java.lang.ClassNotFoundException 但我已经读过这是第一个 try/catch 块的原因地点……我说的对吗?

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

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

另一个注意事项:在 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)

【问题讨论】:

  • 给我几分钟时间再次运行,我会发布整个堆栈跟踪。
  • 没什么可发的,但我已经发过了
  • 这样更好。发布更新
  • 好多了,你终于得到了googlable exception
  • 您先生,真是个天才。非常感谢 - 请发布您的答案,我会标记为正确的。

标签: java android jdbc android-studio


【解决方案1】:

这并不完全正确。

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.StrictMode$AndroidBlockGuardPolicy.onNetwork 处的 android.os.NetworkOnMainThreadException

进入一个像样的搜索引擎寻找线索,比如Google。截至目前,直接或间接(重复)的热门点击是指以下 Stack Overflow 问题:

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

【讨论】:

    【解决方案2】:

    编辑:

    您可能需要使用旧版本的 jtds。这个post 有帮助吗?

    【讨论】:

    • 我连接的是 SQL Server 数据库,而不是 mysql。
    • jTDS JDBC 是否不够好?抱歉,如果这是一个愚蠢的问题,只是认为我已经为该项目准备了正确的 jar 文件..
    • 刚刚尝试过 - 没有用,但由于某种原因,我不确定为什么只是将不同的 .jar 文件添加到文件夹会...
    • 我刚刚更换了旧版本,但这并没有任何区别。以为我自己早点修好了,但我错了。
    • 你能尝试清理你的项目并重建+同步吗?您也可以粘贴整个错误消息
    【解决方案3】:

    Androids 严格模式解释here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 2022-01-08
      • 2013-12-06
      • 2019-04-20
      • 1970-01-01
      相关资源
      最近更新 更多