Java 虽然在项目中添加了特定的jar,但未找到类(android到sqlserver而不使用webservice)
我正在将android直接连接到SQLServer 我知道这是不推荐的 我编写了以下代码:Java 虽然在项目中添加了特定的jar,但未找到类(android到sqlserver而不使用webservice),java,android,Java,Android,我正在将android直接连接到SQLServer 我知道这是不推荐的 我编写了以下代码: public class MainActivity extends Activity { String dbName = "AndroidDB"; String serverip="10.0.2.2"; String serverport="1433"; //String url = "jdbc:sqlserver://14GRAFICALI\\MSSQLSER
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
我有这门课:
我不明白为什么会发生这种错误。请帮帮我
日志:
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
出现此错误的原因是,在开发过程中,Eclipse ADT向您显示了Android JRE和Java SE JRE的超集,不是从您包含的JDBC jar中获得的 然而,在设备上,Android只有自己的运行时环境,并不包含来自JavaSE的所有类 要解决这个问题,您需要找到一个库,其中包含JDBCJAR所需的缺少的类,或者自己创建,或者
我推荐后者,完成前者可能是一种巨大的痛苦 我已经成功地完成了JTDC-Android到SQLServer的连接 无论谁想要用android直接连接到SQLServer,都应该首先记住,这根本不是一种安全的方式 我采取了以下步骤: 请记住,JDBC会产生SSL问题,JTDC驱动程序是开源和安全的。因此,请使用JTDC驱动程序 在使用JTDC驱动程序时,请确保使用的是正确的版本。i、 e.JTDC驱动程序版本应与java版本匹配或可确认。我使用了jtds-1.2.5-dist 你可以在网上的任何地方得到它 将Jar文件粘贴到libs文件夹 转到Java构建路径右键单击项目>库中的属性>添加外部JAR。导入Jar文件 按顺序和导出>检查jtds jar,如下所示:
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;
}
}
您在pic中看到的其他jar没有用处
6您必须为SQLServer屏幕截图设置SQLServer登录身份验证Windows身份验证,如下所示:
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;
}
}
7按如下方式配置SQLServer:
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;
}
}
启用TCP/IP和VIA连接
在TCP/IP属性中,将端口更改为1433
8然后您必须将连接URL设置为:
url=jdbc:jtds:sqlserver://10.0.2.2:1433;instanceName=14GRAFICALI\MSSQLSERVER2008;DatabaseName=+DBName+;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我为连接创建了一个类,并将其实例化如下:
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;
}
}
检查导入并粘贴完成logcat@Sultanmirza我已经用logcatFirst更新了我找到的关于连接字符串的从Android连接到MSSQL数据库的漂亮干净的解决方案,谢谢@AdrianOlar欢迎:我对第六步感到困惑。@火影忍者你的困惑是什么?第五步本身没问题。我完成了。但是当我进入第六步时,我不知道发生了什么。首先我有一个数据库文件。它是在MS Sql Server 2008中打开的。然后我按照你的五个步骤。成功地添加了jtdc jar。最后我在在Ms sql server 2008的帮助下连接到该数据库文件。该错误与网络相关或特定于实例。