博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 连接 SQL Server (jtds方式)——上
阅读量:6300 次
发布时间:2019-06-22

本文共 7169 字,大约阅读时间需要 23 分钟。

本文将介绍开发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 
2
6 7
8 9
12 13
18
21
22
23 24
25
26 27 28 29
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 
2
3 4
JtdsTest
5
Hello world!
6
Settings
7
Insert
8 9

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

 

  2、res=>layout=>activity_main.xml

1 
10 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方式)——下)进行说明。

 

转载于:https://www.cnblogs.com/chenyucong/p/5708674.html

你可能感兴趣的文章
BusinessObject Port 配置
查看>>
异常和函数
查看>>
软工实验三
查看>>
学习OpenCV(一)从Mat讲起
查看>>
BZOJ 2535:NOI 2010 航空管制
查看>>
linux下的C语言开发
查看>>
62. 不同路径
查看>>
C++程序员学Python:C与Python进行交互
查看>>
Windbg学习 (0x0002) 命令基础
查看>>
ubuntu su进入root权限
查看>>
创业公司如何实施敏捷开发(转载)
查看>>
AngularJs学习
查看>>
MySQL 8.0 正式版 8.0.11 发布:比 MySQL 5.7 快 2 倍
查看>>
HDU 1016 Prime Ring Problem (DFS回溯)
查看>>
Python 获取图片文件大小并转换为base64编码
查看>>
使用Cydia Substrate Hook Android Java世界
查看>>
[Leetcode] Distinct Subsequences 解题报告
查看>>
模板类中使用友元函数的方式,派生类友元函数对基类的成员使用情况
查看>>
linux修改主机名
查看>>
ssm框架restful风格实现增删改查
查看>>