我对 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
有任何想法吗?:(