【问题标题】:Connect android app to sql server database将android应用程序连接到sql server数据库
【发布时间】:2013-06-01 05:27:52
【问题描述】:

我对 java 和 android 编程很陌生。 我正在尝试将 android 应用程序连接到安装在 Windows 笔记本电脑上的 SQL Server 数据库。

我在全网搜索,找到了很多解决方案,但没有成功。 我的情况如下:

  • 我正在使用 ADT 在 Windows 下编程
  • 我直接在我的 Galaxy S3 (Jelly Bean 4.1.2) 上运行应用程序
  • 应用程序只有一个按钮“连接到数据库”
  • 代码如下(放在MainActivity.java中):

    public void ConnectToDatabase(View View){
        try {
             // SET CONNECTIONSTRING
             Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
             Connection DbConn = DriverManager.getConnection("jdbc:jtds:sqlserver://12.34.56.78:1433/DatabaseName;user=myusername;password=mypassword");
    
             // CONNECTION OK: SHOW MESSAGE
             Toast.makeText(this, "Connection successful!", Toast.LENGTH_LONG).show();
         }
    }
    

我以这些方式添加了两次 jtds-1.2.5.jar

  • 在包资源管理器下,右键单击应用名称
  • 构建路径\添加外部存档..
  • 手动搜索jtds-1.2.5.jar文件,确认

然后:

  • 手动复制 jtds-1.2.5.jar 文件
  • 在包资源管理器下,右键单击 libs 目录
  • 粘贴

在我的笔记本电脑上,SQL Browser 服务已启用,端口 1433 正确打开,Windows 防火墙服务已禁用。我可以从另一台 PC 正常连接到我的数据库。

我正在使用 Connectify 与我的 Android 设备共享我的笔记本电脑的互联网连接。从笔记本电脑上,我可以成功 ping 智能手机。我还使用另一台笔记本电脑尝试了此配置,没有问题。

当我按下“连接到数据库”按钮时,我收到以下错误消息:

Intent error: Network error IOException: socked failed: EACCES (Permission denied)

我在网上搜索并找到了这个解决方案。将 Internet 权限放入 Manifest 文件中:

<uses-permission android:name="android.permission.INTERNET"/>

之后,当我按下“连接到数据库”按钮时,应用程序就会崩溃。这是 LogCat 的输出:

D/dalvikvm(24311): GC_CONCURRENT freed 180K, 6% free 12426K/13127K, paused 12ms+2ms, total 39ms
D/AndroidRuntime(24311): Shutting down VM
W/dalvikvm(24311): threadid=1: thread exiting with uncaught exception (group=0x40f382a0)
E/AndroidRuntime(24311): FATAL EXCEPTION: main
E/AndroidRuntime(24311): java.lang.IllegalStateException: Could not execute method of the activity
E/AndroidRuntime(24311):    at android.view.View$1.onClick(View.java:3691)
E/AndroidRuntime(24311):    at android.view.View.performClick(View.java:4211)
E/AndroidRuntime(24311):    at android.view.View$PerformClick.run(View.java:17267)
E/AndroidRuntime(24311):    at android.os.Handler.handleCallback(Handler.java:615)
E/AndroidRuntime(24311):    at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(24311):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(24311):    at android.app.ActivityThread.main(ActivityThread.java:4898)
E/AndroidRuntime(24311):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(24311):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(24311):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
E/AndroidRuntime(24311):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
E/AndroidRuntime(24311):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(24311): Caused by: java.lang.reflect.InvocationTargetException
E/AndroidRuntime(24311):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(24311):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(24311):    at android.view.View$1.onClick(View.java:3686)
E/AndroidRuntime(24311):    ... 11 more
E/AndroidRuntime(24311): Caused by: java.lang.NullPointerException
E/AndroidRuntime(24311):    at com.example.app1.MainActivity.ConnectToDatabase(MainActivity.java:74)
E/AndroidRuntime(24311):    ... 14 more

有人可以帮我解决这个问题吗?

提前致谢


编辑

我认为应用程序正确加载了 JDBC 驱动程序。应用程序在尝试连接到 SQL 数据库时抛出异常。只要我想连接到 \SQLEXPRESS 数据库,我就将连接字符串更改如下:

Connection DbConn = DriverManager.getConnection("jdbc:jtds:sqlserver://12.34.56.78:1433/DatabaseName;user=myusername;password=mypassword;instance=SQLEXPRESS")

如果我离开“istance=SQLEXPRESS”,应用会抛出以下 SQLException

"Unable to get information from SQL Server: 12.34.56.78."

如果我从连接字符串中删除距离,我收到的错误如下:

Error: null

有什么想法吗? :(

【问题讨论】:

  • MainActivity 的第 74 行是否与:Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance(); ?如果是,那么问题是找不到您的驱动程序 net.sourceforge.jtds.jdbc.Driver。 IE。问题不在于建立连接,而在于找到驱动程序。
  • 不是,第74行是异常管理(catch语句中,忘记贴在代码里了)。在我刚刚提出的问题中: Toast.makeText(this,"Error: " + e.getMessage().toString(),Toast.LENGTH_LONG).show();
  • 就是这样,如果我取消“catch”中的错误管理,应用程序不会崩溃。但我仍然没有 SQL 连接 :(
  • 无连接意味着 DbConn 为空,对吧?当我努力制作 FireBird android 驱动程序时,驱动程序总是返回一些正常的异常消息(例如“找不到服务器”)。我怀疑错误处理 - 似乎在第 74 行抛出了空异常。也许 e.getMessage() 为空,因此调用 .toString() 失败。只使用:“Error:” + e.getMessage() 更安全 - 它不会在 null 时崩溃。
  • 就是这样。我取下了“.toString()”,现在我没有崩溃,只是“错误:null”,正如你所说。我仍然不明白为什么连接字符串和驱动程序设置不起作用

标签: android sql jdbc connection jtds


【解决方案1】:

这可能不相关(因为我从未尝试/听说过直接从 android 应用程序访问 sql 数据库)但是为什么不为数据库创建 Web 服务呢?由于您的数据库位于主机上而不是手机内存卡上,因此最终您需要创建一个 Web 服务,以便您的应用可以访问数据库。

【讨论】:

【解决方案2】:

尝试:之前的 DriverManager.getConnection

StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

【讨论】:

    【解决方案3】:
    public void ConnectToDatabase(){
        try {
    
             // SET CONNECTIONSTRING
             Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
             String username = "XXXXXXXXX";
                String password = "XXXXXX";
             Connection DbConn = DriverManager.getConnection("jdbc:jtds:sqlserver://192.188.4.83:1433/DATABASE;user=" + username + ";password=" + password);
    
             Log.w("Connection","open");
            Statement stmt = DbConn.createStatement();
            ResultSet reset = stmt.executeQuery(" select * from users ");
    
    
             EditText num = (EditText) findViewById(R.id.displaymessage);
            num.setText(reset.getString(1));
    
            DbConn.close();
    
            } catch (Exception e)
            {
            Log.w("Error connection","" + e.getMessage());
            }
    }
    

    【讨论】:

      【解决方案4】:

      在具有 sql 的计算机上,还要检查是否启用了所有类型的连接,而不仅仅是命名管道。您的第一种方法应该有效。如果不尝试从更多的建议中改进您的代码。连接的那部分花了我整整一周的时间。 sql server express 的默认设置是仅使用命名管道。在您的连接字符串上,您还应该添加

          Network Library=DBMSSOCN;
      

      密码后。这将告诉 sql server 使用 TCP 而不是命名管道。可能您的第一个代码很好。我尝试了很多东西和很多代码,我只需要添加那个小东西。如果您不指定连接模式,则远程连接将失败。只有本地连接有效。

      【讨论】:

        【解决方案5】:

        这个 OP 有什么更新吗?

        ps:我刚刚看到缺少“;”服务器名称后的分号。

        连接 DbConn = DriverManager.getConnection("jdbc:jtds:sqlserver://12.34.56.78:1433/ 数据库名称;用户=我的用户名;密码=我的密码");

        这可能是错误的原因吗?

        【讨论】:

          猜你喜欢
          • 2018-05-16
          • 1970-01-01
          • 2018-07-02
          • 2018-09-03
          • 1970-01-01
          • 1970-01-01
          • 2013-03-24
          • 2017-10-08
          • 1970-01-01
          相关资源
          最近更新 更多