本文将介绍开发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 26 7 8 9 12 13 18 21 22 26 27 28 2923 24 25
二、导入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 23 4 JtdsTest 5Hello world! 6Settings 7Insert 8 9
界面中的Button,显示文本为Insert
2、res=>layout=>activity_main.xml
110 11 16 17 25 26
加入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 block103 e.printStackTrace();104 count = -1;105 } finally {106 try {107 // 关闭连接108 pstm.close();109 con.close();110 } catch (Exception e2) {111 // TODO: handle exception112 e2.printStackTrace();113 }114 }115 return count;116 }117 118 // 主线程响应方法,用于显示提示气泡119 public Runnable runShowResult = new Runnable() {120 121 @Override122 public void run() {123 // TODO Auto-generated method stub124 String tips = "受影响行数为:" + resultCount;125 // 弹出气泡126 Toast.makeText(getApplicationContext(), tips, Toast.LENGTH_SHORT).show();127 }128 };129 130 // 暂不需要理会131 @Override132 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 @Override140 public boolean onOptionsItemSelected(MenuItem item) {141 // Handle action bar item clicks here. The action bar will142 // automatically handle clicks on the Home/Up button, so long143 // 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方式)——下)进行说明。