• Android 连接 SQL Server (jtds方式)——上


    本文将介绍开发Android程序,连接SQL Server,通过第三方包jtds的方式。

    如果你有同样的需求,请跟着做一遍,博主将以最详细的方式,进行介绍。

     

    首先说明,Java、Android连接SQL Server并不是常见的方式,原因是SQL Server的微软的产品,没有打算让Java、Android直接连接,所以能连上的,都是在Java、Android使用第三方的包,

    目前总共有2个方法能连,(1)本文将介绍jtds,这是名副其实的直连,Android必须使用1.2.7版本,高版本连不了,Java则可以使用1.3.1

                (2)通过ASP.NET的web service连接,这个并非直连,只是通过网页读取,Java使用第三方包axis,Android使用KSOAP。(以后的文章会介绍)

    博主由于工作的原因,两种方法都试过了,因此分享到这里。

     

    下面正式开始说明:

    首先,先说明一下普通的操作步骤:

    一、打开AndroidManifest.xml的网络操作权限

      这是博主在之前的文章强调过的,这个必须先打开,以免以后遗忘。

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.test.androidsqltest"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6     
     7     <uses-permission android:name="android.permission.INTERNET" />
     8 
     9     <uses-sdk
    10         android:minSdkVersion="14"
    11         android:targetSdkVersion="21" />
    12 
    13     <application
    14         android:allowBackup="true"
    15         android:icon="@drawable/ic_launcher"
    16         android:label="@string/app_name"
    17         android:theme="@style/AppTheme" >
    18         <activity
    19             android:name=".MainActivity"
    20             android:label="@string/app_name" >
    21             <intent-filter>
    22                 <action android:name="android.intent.action.MAIN" />
    23 
    24                 <category android:name="android.intent.category.LAUNCHER" />
    25             </intent-filter>
    26         </activity>
    27     </application>
    28 
    29 </manifest>
    View Code

     

    二、导入jtds包

      1、在项目路径下建立libs文件夹,把jtds-1.2.7.jar放到libs目录中

      2、右键点击项目名=>Build Path=>Configure Build Path=>上面打开Libraries=>Add External JARs

      =>选中jtds-1.2.7.jar=>上面打开Order and Export=>勾选jtds-1.2.7.jar=>apply

      完成

     

    三、简单界面布局

      1、res=>values=>strings.xml

    1 <?xml version="1.0" encoding="utf-8"?>
    2 <resources>
    3 
    4     <string name="app_name">JtdsTest</string>
    5     <string name="hello_world">Hello world!</string>
    6     <string name="action_settings">Settings</string>
    7     <string name="btnInsert">Insert</string>
    8 
    9 </resources>

      界面中的Button,显示文本为Insert

     

      2、res=>layout=>activity_main.xml

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:paddingBottom="@dimen/activity_vertical_margin"
     6     android:paddingLeft="@dimen/activity_horizontal_margin"
     7     android:paddingRight="@dimen/activity_horizontal_margin"
     8     android:paddingTop="@dimen/activity_vertical_margin"
     9     tools:context="com.test.jtdstest.MainActivity" >
    10 
    11     <TextView
    12         android:id="@+id/textView1"
    13         android:layout_width="wrap_content"
    14         android:layout_height="wrap_content"
    15         android:text="@string/hello_world" />
    16 
    17     <Button
    18         android:id="@+id/btnInsert"
    19         android:layout_width="wrap_content"
    20         android:layout_height="wrap_content"
    21         android:layout_marginStart="50dp"
    22         android:layout_marginLeft="50dp"
    23         android:layout_marginTop="40dp"
    24         android:text="@string/btnInsert" />
    25 
    26 </RelativeLayout>

      加入Button控件

     

      3、主程序代码(增Insert、删Delete、改Update)

      1 package com.test.jtdstest;
      2 
      3 import java.sql.Connection;
      4 import java.sql.DriverManager;
      5 import java.sql.PreparedStatement;
      6 import java.sql.SQLException;
      7 
      8 import android.app.Activity;
      9 import android.os.Bundle;
     10 import android.os.Handler;
     11 import android.view.Menu;
     12 import android.view.MenuItem;
     13 import android.view.View;
     14 import android.view.View.OnClickListener;
     15 import android.widget.Button;
     16 import android.widget.Toast;
     17 
     18 public class MainActivity extends Activity {
     19 
     20     // 按钮控件
     21     private Button btnInsert;
     22     // jtds驱动路径
     23     private String drive = "net.sourceforge.jtds.jdbc.Driver";
     24     // SQL连接字符串,格式是 jdbc:jtds:sqlserver://服务器IP:端口号/数据库名称
     25     // 端口号默认为1433,如果不是,可以打开SQL Server配置管理器设定,
     26     // 如果你的SQL Server不是默认实例,需添加连接字符串为
     27     // jdbc:jtds:sqlserver://服务器IP:端口号/数据库名称;instance=实例名,不过博主没有试验过,你可以百度一下。
     28     private String connStr = "jdbc:jtds:sqlserver://10.76.25.1:1433/CommonDB";
     29     // 用户名和密码,则是对应的数据库的帐号,博主使用sa进行说明,如果你用的不是sa,记得在数据库表中打开你的帐号的权限。
     30     private String uid = "sa";
     31     private String pwd = "123";
     32     // 连接对象,相当于C#中的SqlConnection
     33     private Connection con = null;
     34     // 执行对象,相当于C#中的SqlCommand
     35     private PreparedStatement pstm = null;
     36     // handler处理对象,用于在跨线程时,在线程间的响应,用于控制主线程的控件(不能跨线程控制控件)
     37     private Handler handler = new Handler();
     38 
     39     // 执行语句
     40     private String sql = "insert into [table1]([id],[name]) values ('01','aaa')";
     41     // 执行结果,受影响行数
     42     private int resultCount;
     43 
     44     @Override
     45     protected void onCreate(Bundle savedInstanceState) {
     46         super.onCreate(savedInstanceState);
     47         setContentView(R.layout.activity_main);
     48 
     49         // 找到btnInsert按钮
     50         btnInsert = (Button) findViewById(R.id.btnInsert);
     51         // 设定btnInsert的click操作的监听事件,btnInsert被点击时,触发clickEvent()方法
     52         btnInsert.setOnClickListener(clickEvent());
     53     }
     54 
     55     // clickEvent()方法
     56     public OnClickListener clickEvent() {
     57         return new OnClickListener() {
     58 
     59             // 方法体
     60             @Override
     61             public void onClick(View view) {
     62                 // TODO Auto-generated method stub
     63                 if (view == btnInsert) {
     64                     // 必须开启新的线程执行
     65                     Thread thread = new Thread(new Runnable() {
     66 
     67                         @Override
     68                         public void run() {
     69                             // TODO Auto-generated method stub
     70                             // 线程在运行后,执行Insert()方法,返回受影响行数,赋值给resultCount
     71                             resultCount = Insert();
     72                             // 使用handler,使主线程响应并执行runShowResult方法
     73                             handler.post(runShowResult);
     74                         }
     75                     });
     76                     // 线程运行
     77                     thread.start();
     78                 }
     79             }
     80         };
     81     }
     82 
     83     // 操作数据库的方法
     84     public int Insert() {
     85         int count = 0;
     86         try {
     87             // 加载驱动
     88             Class.forName(drive);
     89         } catch (ClassNotFoundException e) {
     90             // TODO Auto-generated catch block
     91             e.printStackTrace();
     92         }
     93 
     94         try {
     95             // 创建连接对象,加入连接字符串、用户名、密码
     96             con = DriverManager.getConnection(connStr, uid, pwd);
     97             // 创建执行对象,并加入执行语句
     98             pstm = con.prepareStatement(sql);
     99             // 执行SQL语句,并返回受影响行数
    100             count = pstm.executeUpdate();
    101         } catch (SQLException e) {
    102             // TODO Auto-generated catch block
    103             e.printStackTrace();
    104             count = -1;
    105         } finally {
    106             try {
    107                 // 关闭连接
    108                 pstm.close();
    109                 con.close();
    110             } catch (Exception e2) {
    111                 // TODO: handle exception
    112                 e2.printStackTrace();
    113             }
    114         }
    115         return count;
    116     }
    117 
    118     // 主线程响应方法,用于显示提示气泡
    119     public Runnable runShowResult = new Runnable() {
    120 
    121         @Override
    122         public void run() {
    123             // TODO Auto-generated method stub
    124             String tips = "受影响行数为:" + resultCount;
    125             // 弹出气泡
    126             Toast.makeText(getApplicationContext(), tips, Toast.LENGTH_SHORT).show();
    127         }
    128     };
    129 
    130     // 暂不需要理会
    131     @Override
    132     public boolean onCreateOptionsMenu(Menu menu) {
    133         // Inflate the menu; this adds items to the action bar if it is present.
    134         getMenuInflater().inflate(R.menu.main, menu);
    135         return true;
    136     }
    137 
    138     // 暂不需要理会
    139     @Override
    140     public boolean onOptionsItemSelected(MenuItem item) {
    141         // Handle action bar item clicks here. The action bar will
    142         // automatically handle clicks on the Home/Up button, so long
    143         // as you specify a parent activity in AndroidManifest.xml.
    144         int id = item.getItemId();
    145         if (id == R.id.action_settings) {
    146             return true;
    147         }
    148         return super.onOptionsItemSelected(item);
    149     }
    150 }

      说明:

        1、加载驱动时,如果报错,则说明jtds包导入失败,字符串没有错误的情况下,一定能加载成功;

        2、如果使用的数据库实例,并不是默认实例,需在连接字符串加入;instance=实例名

        3、必须使用跨线程进行网络操作,因为Android4.0后,就禁止在主线程进行网络操作,因为如果操作失败,将导致整个程序崩溃。

        4、得到的执行结果,可用公共变量接收,如上面代码的resultCount,在副线程赋值给resultCount后,可直接通过Handler对象,调用Runnable方法,操作主线程的控件,上面代码把结果显示在Toast中。

      

      常见的运行失败现象:

        1、Thread跳出,程序中止,说明在处理控件与线程时出现异常

        2、EACCES permission,就是AndroidManifest.xml没有插入打开网络权限的语句

     

      如果运行错误,而找不到错误发生在哪里,可以在代码中各步加入System.out.println("标记信息或Exception信息"),在eclipse中打开LogCat监视窗体,观察运行的情况。

      完成,执行看看吧。

     

    以上就是jtds增删改的代码说明,还有查询的方法,由于代码量不少,所以会在之后的(Android 连接 SQL Server (jtds方式)——下)进行说明。

     

  • 相关阅读:
    OC,iOS浮点型数据的计算不正确问题
    Swift中AVFoundation的简单使用
    一款经典的stick footer布局
    swift获取当前活动的viewcontroller
    xib的NSLayoutConstraint是否有效
    bootstrap的quartz定时任务简单使用
    Python实现:某个用户登录后,查看自己拥有所有权限
    ftp作业
    实现计算器
    面向对象作业——校园管理系统
  • 原文地址:https://www.cnblogs.com/chenyucong/p/5708674.html
Copyright © 2020-2023  润新知