虽然在项目中添加了特定的jar但没有找到类(没有webservice的android到sqlserver)

我直接将android连接到SQLServer(我知道它不推荐)

我写了以下代码:

public class MainActivity extends Activity { String dbName = "AndroidDB"; String serverip="10.0.2.2"; String serverport="1433"; //String url = "jdbc:sqlserver://14GRAFICALI\\MSSQLSERVER2008;databaseName="+dbName+""; //String url ="jdbc:sqlserver://14GRAFICALI\\MSSQLSERVER2008;databaseName=AndroidDB;integratedSecurity=true"; String url ="jdbc:sqlserver://14GRAFICALI;instanceName=\\MSSQLSERVER2008;DatabaseName=AndroidDB;integratedSecurity=true"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tvData=(TextView)findViewById(R.id.tvSelectedData); try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance(); Class.forName("javax.sql.XAConnection").newInstance(); Connection conn =DriverManager.getConnection(url); Statement statement=conn.createStatement(); ResultSet resultSet=statement.executeQuery("select * from UserMaster"); while(resultSet.next()){ tvData.setText(" Data1 : "+resultSet.getString(1)+" Data 2 : "+resultSet.getNString(2)); } } catch (Exception e) { e.printStackTrace(); tvData.setText(e.getMessage()); } } 

在此之前,我没有这条线:

  Class.forName("javax.sql.XAConnection").newInstance(); 

但它给了我一个例外:

 09-07 15:12:20.911: E/dalvikvm(1293): Could not find class 'javax.sql.XAConnection', referenced from method com.microsoft.sqlserver.jdbc.SQLServerConnection.poolCloseEventNotify 

因此我导入了一个包含该文件的jar并将其添加到库中:

在此处输入图像描述

(jboss.jar)

出口:

在此处输入图像描述

在此之后我也得到错误:

 java.lang.ClassNotFoundException: javax.sql.XAConnection 

我有这堂课:

在此处输入图像描述

我不明白为什么会出现这个错误。 请帮帮我。

logcat的:

 09-07 15:52:52.641: W/System.err(330): java.lang.ClassNotFoundException: javax.sql.XAConnection 09-07 15:52:52.641: W/System.err(330): at java.lang.Class.classForName(Native Method) 09-07 15:52:52.641: W/System.err(330): at java.lang.Class.forName(Class.java:234) 09-07 15:52:52.641: W/System.err(330): at java.lang.Class.forName(Class.java:181) 09-07 15:52:52.641: W/System.err(330): at com.example.sqlservercall.MainActivity.onCreate(MainActivity.java:33) 09-07 15:52:52.641: W/System.err(330): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 09-07 15:52:52.651: W/System.err(330): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 09-07 15:52:52.651: W/System.err(330): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 09-07 15:52:52.651: W/System.err(330): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 09-07 15:52:52.651: W/System.err(330): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 09-07 15:52:52.651: W/System.err(330): at android.os.Handler.dispatchMessage(Handler.java:99) 09-07 15:52:52.651: W/System.err(330): at android.os.Looper.loop(Looper.java:123) 09-07 15:52:52.651: W/System.err(330): at android.app.ActivityThread.main(ActivityThread.java:3683) 09-07 15:52:52.651: W/System.err(330): at java.lang.reflect.Method.invokeNative(Native Method) 09-07 15:52:52.651: W/System.err(330): at java.lang.reflect.Method.invoke(Method.java:507) 09-07 15:52:52.651: W/System.err(330): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 09-07 15:52:52.651: W/System.err(330): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 09-07 15:52:52.651: W/System.err(330): at dalvik.system.NativeStart.main(Native Method) 09-07 15:52:52.651: W/System.err(330): Caused by: java.lang.NoClassDefFoundError: javax.sql.XAConnection 09-07 15:52:52.661: W/System.err(330): ... 17 more 09-07 15:52:52.661: W/System.err(330): Caused by: java.lang.ClassNotFoundException: javax.sql.XAConnection in loader dalvik.system.PathClassLoader[/data/app/com.example.sqlservercall-2.apk] 09-07 15:52:52.661: W/System.err(330): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240) 09-07 15:52:52.661: W/System.err(330): at java.lang.ClassLoader.loadClass(ClassLoader.java:551) 09-07 15:52:52.671: W/System.err(330): at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 09-07 15:52:52.671: W/System.err(330): ... 17 more 09-07 15:52:52.861: I/ActivityManager(61): Displayed com.example.sqlservercall/.MainActivity: +1s503ms 09-07 15:53:00.081: W/ActivityManager(61): finishReceiver called but no pending broadcasts 

我已成功完成了与JTDC Android到SQLServer的连接。

谁想要与Android直接连接到SQLServer应该首先记住“这根本不是安全的方式”。

我遵循的步骤:

  1. 请记住,JDBC会产生SSL问题,JTDC驱动程序是开源且安全的。 所以使用JTDC驱动程序。

  2. 使用JTDC驱动程序时,请确保使用正确的版本。 即JTDC驱动程序版本应与java版本匹配或匹配。 我使用jtds-1.2.5-dist你可以从网上的任何地方获得它。

  3. 将Jar文件粘贴到libs文件夹。

  4. 转到Java构建路径(右键单击项目>属性)在库中>添加Externl jar。 导入Jar文件。

  5. 在订单和出口>检查jtds jar如下:

(你在pic中观看的其他jar子没用)

在此处输入图像描述

6您必须设置SQLServer登录身份validation(SQLServer的Windows身份validation)屏幕截图如下:

在此处输入图像描述

7按如下方式配置SQLServer:

启用TCP / IP和VIA连接。

在此处输入图像描述

在TCP / IP属性中将端口更改为1433

在此处输入图像描述

8然后,您必须将连接URL设置为:

URL = “JDBC:JTDS:SQLSERVER://10.0.2.2:1433;实例名= 14GRAFICALI \ MSSQLSERVER2008;数据库名=” +数据库名+ “; integratedSecurity = TRUE;用户=” +用户名+ “;密码=” +密码;

9从这里你可以简单地按照我给你的代码:

 public class gaConnection { String url =""; Connection conn=null; Statement statement=null; ResultSet resultSet=null; public void setConnection(String DBName,String UserName,String Password) { try { Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance(); url ="jdbc:jtds:sqlserver://10.0.2.2:1433;instanceName=14GRAFICALI\\MSSQLSERVER2008;DatabaseName="+DBName+";integratedSecurity=true;user="+UserName+";password="+Password; conn =DriverManager.getConnection(url); } catch (Exception e) { e.printStackTrace(); } } public String showResult() { String strResult=""; try { statement=conn.createStatement(); resultSet=statement.executeQuery("select * from UserMaster"); while(resultSet.next()){ strResult = strResult + " Name : "+resultSet.getString(1)+" SirName : "+resultSet.getString(2) + "\n"; } } catch (Exception e) { e.printStackTrace(); } return strResult; } } 

10我已经创建了Class For Connection并将其实例化如下:

  public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tvData=(TextView)findViewById(R.id.tvSelectedData); String DBName="AndroidDB"; String UserName="sa"; String Password="ok"; try {gaConnection con=new gaConnection(); con.setConnection(DBName,UserName,Password); tvData.setText(con.showResult()); } catch (Exception e) { e.printStackTrace(); tvData.setText(e.getMessage()); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

发生此错误的原因是,在开发期间, Eclipse ADT会向您显示Android JRE Java SE JRE的超集XAConnection来自后者 ,而不是来自您包含的JDBC JAR。

但是,在设备上,Android只有自己的运行时环境,它不包含Java SE中的所有类。 看起来XAConnection是一个缺少的 。

要解决这个问题,您需要找到一个包含JDBC JAR所需缺失类(或自己创建)的库,或者更好的是,使用推荐的解决方案

我推荐后者, 因为我从经验中知道完成前者可能是一种巨大的痛苦。