尽管在项目中添加了特定的 jar,但找不到类(android 到 sqlserver,没有 web 服务)
Posted
技术标签:
【中文标题】尽管在项目中添加了特定的 jar,但找不到类(android 到 sqlserver,没有 web 服务)【英文标题】:Class not found although particular jar is added in project (android to sqlserver without webservice) 【发布时间】:2013-09-07 09:49:53 【问题描述】:我正在将 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
【问题讨论】:
检查导入并粘贴完整的logcat @Sultanmirza 我已经用 logcat 更新了 【参考方案1】:我已经成功地将 JTDC Android 连接到 SQLServer。
想要通过android直接连接到SQLServer的人应该首先记住“这根本不是安全的方式”。
我遵循的步骤:
请记住,JDBC 会产生 SSL 问题,JTDC 驱动程序是开源且安全的。所以使用 JTDC 驱动程序。
在使用 JTDC 驱动程序时,请确保您使用的是正确的版本。即 JTDC 驱动程序版本应与 java 版本匹配或可确认。我用jtds-1.2.5-dist
你可以从网上的任何地方得到它。
将 Jar 文件粘贴到 libs 文件夹。
转到 Java 构建路径(右键单击项目 > 属性)在库中 > 添加 Externl jar。导入 Jar 文件。
按顺序和导出> 检查 jtds jar 如下:
(您在图片中观看的其他罐子没有用)
6 您将必须设置 SQLServer 登录身份验证(SQLServer 的 Windows 身份验证)屏幕截图如下:
7 按如下方式配置您的 SQLServer:
启用 TCP/IP 和 VIA 连接。
在 TCP/IP 属性中将端口更改为 1433
8 然后您必须将连接 URL 设置为:
url="jdbc:jtds:sqlserver://10.0.2.2:1433;instanceName=14GRAFICALI\MSSQLSERVER2008;DatabaseName="+DBName+";integratedSecurity=true;user="+UserName+";password="+Password;
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 我已经制作了连接类并实例化如下:
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;
【讨论】:
关于连接字符串,我找到了从 Android 连接到 MSSQL 数据库的第一个漂亮而干净的解决方案,谢谢! @AdrianOlar 欢迎 :) 我对第 6 步感到困惑。 @Naruto 你的困惑是什么? 第 5 步本身没问题。我做到了。但是在进行第 6 步时我不知道发生了什么。首先我有一个数据库文件。它是在 MS Sql sever 2008 中打开的。然后我遵循了您的五个步骤。成功添加了 jtdc jar。最后在 sql server 2008 女士的帮助下连接到该数据库文件时出现错误。该错误与网络相关或特定于实例。【参考方案2】:发生错误是因为在开发过程中,Eclipse ADT 向您显示了 Android JRE 和 Java SE JRE 的超集。 XAConnection
comes from the latter,不是来自您包含的 JDBC JAR。
但是,在设备上,Android 只有自己的运行时环境,它不包含 Java SE 的所有类。 It looks like XAConnection
is one the missing ones.
要解决此问题,您需要找到一个包含 JDBC JAR 所需的缺失类的库(或自己制作),或者,better yet, use the recommended solution。
我推荐后者,because I know from experience 完成前者可能会非常痛苦。
【讨论】:
以上是关于尽管在项目中添加了特定的 jar,但找不到类(android 到 sqlserver,没有 web 服务)的主要内容,如果未能解决你的问题,请参考以下文章
尽管安装了 Completion,但找不到模块“../lib/completion”
ng serve 命令需要在 Angular 项目中运行,但找不到项目定义