0

我直接将 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

我有这门课:

在此处输入图像描述

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

日志猫:

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
4

2 回答 2

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。导入 Jar 文件。

  5. 在 Order And Export > 检查 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;
        }

    }
于 2013-09-07T13:26:12.793 回答
1

发生该错误的原因是,在开发过程中,Eclipse ADT 向您显示了 Android JREJava SE JRE的超集。XAConnection来自后者,而不是来自您包含的 JDBC JAR。

然而,在设备上,Android 只有自己的运行时环境,并不包含 Java SE 的所有类。看起来XAConnection是失踪者之一

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

我推荐后者,因为我从经验中知道要完成前者可能会非常痛苦。

于 2013-09-07T12:49:25.793 回答