设为首页 收藏本站
查看: 943|回复: 0

[经验分享] Android 连接 SQL Server (jtds方式)——上

[复制链接]

尚未签到

发表于 2017-7-13 18:31:47 | 显示全部楼层 |阅读模式
  本文将介绍开发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的网络操作权限
    这是博主在之前的文章强调过的,这个必须先打开,以免以后遗忘。


DSC0000.gif DSC0001.gif


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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393507-1-1.html 上篇帖子: sql server 2016 json 解析方法 下篇帖子: jmeter之连接mysql和SQL Server配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表