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

时间:2013-09-07 09:49:53

标签: 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\\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并将其添加到库中:

enter image description here

(jboss.jar)

导出:

enter image description here

在此之后我也会收到错误:

java.lang.ClassNotFoundException: javax.sql.XAConnection

我有这堂课:

enter image description here

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

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

2 个答案:

答案 0 :(得分:12)

我已成功完成了与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文件。

  5. 按顺序排序>检查jtds jar如下:

  6. (你在pic中观看的其他罐子没用)

    enter image description here

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

    enter image description here

    7按如下方式配置SQLServer:

    启用TCP / IP和VIA连接。

    enter image description here

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

    enter image description here

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

答案 1 :(得分:1)

发生错误是因为在开发期间, 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完成前者可能是一种巨大的痛苦。