将android应用程序连接到sql server数据库

时间:2013-06-05 13:26:32

标签: android sql jdbc connection jtds

我是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文件
  • 在package explorer下,右键单击libs目录
  • 粘贴

在我的笔记本电脑上启用了SQL浏览器服务,端口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."

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

Error: null

任何想法? :(

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

尝试:在DriverManager.getConnection之前

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

答案 2 :(得分:0)

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());
        }
}

答案 3 :(得分:0)

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

    Network Library=DBMSSOCN;

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

答案 4 :(得分:0)

凹凸 关于这个OP的任何更新?

p.s:我刚看到有一个失踪的“;”服务器名称后的分号。

  

连接DbConn =   的DriverManager.getConnection(“JDBC:JTDS:SQLSERVER://12.34.56.78:1433 /   数据库名;用户=名为myUsername;密码=输入mypassword“);

这可能是导致错误的原因吗?