本文将介绍开发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的网络操作权限

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

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.androidsqltest"
android:versionCode="1"
android:versionName="1.0" > <uses-permission android:name="android.permission.INTERNET" /> <uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="21" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

二、导入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

 <?xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">JtdsTest</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="btnInsert">Insert</string> </resources>

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

  2、res=>layout=>activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.test.jtdstest.MainActivity" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> <Button
android:id="@+id/btnInsert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="50dp"
android:layout_marginLeft="50dp"
android:layout_marginTop="40dp"
android:text="@string/btnInsert" /> </RelativeLayout>

  加入Button控件

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

 package com.test.jtdstest;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends Activity { // 按钮控件
private Button btnInsert;
// jtds驱动路径
private String drive = "net.sourceforge.jtds.jdbc.Driver";
// SQL连接字符串,格式是 jdbc:jtds:sqlserver://服务器IP:端口号/数据库名称
// 端口号默认为1433,如果不是,可以打开SQL Server配置管理器设定,
// 如果你的SQL Server不是默认实例,需添加连接字符串为
// jdbc:jtds:sqlserver://服务器IP:端口号/数据库名称;instance=实例名,不过博主没有试验过,你可以百度一下。
private String connStr = "jdbc:jtds:sqlserver://10.76.25.1:1433/CommonDB";
// 用户名和密码,则是对应的数据库的帐号,博主使用sa进行说明,如果你用的不是sa,记得在数据库表中打开你的帐号的权限。
private String uid = "sa";
private String pwd = "123";
// 连接对象,相当于C#中的SqlConnection
private Connection con = null;
// 执行对象,相当于C#中的SqlCommand
private PreparedStatement pstm = null;
// handler处理对象,用于在跨线程时,在线程间的响应,用于控制主线程的控件(不能跨线程控制控件)
private Handler handler = new Handler(); // 执行语句
private String sql = "insert into [table1]([id],[name]) values ('01','aaa')";
// 执行结果,受影响行数
private int resultCount; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 找到btnInsert按钮
btnInsert = (Button) findViewById(R.id.btnInsert);
// 设定btnInsert的click操作的监听事件,btnInsert被点击时,触发clickEvent()方法
btnInsert.setOnClickListener(clickEvent());
} // clickEvent()方法
public OnClickListener clickEvent() {
return new OnClickListener() { // 方法体
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
if (view == btnInsert) {
// 必须开启新的线程执行
Thread thread = new Thread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
// 线程在运行后,执行Insert()方法,返回受影响行数,赋值给resultCount
resultCount = Insert();
// 使用handler,使主线程响应并执行runShowResult方法
handler.post(runShowResult);
}
});
// 线程运行
thread.start();
}
}
};
} // 操作数据库的方法
public int Insert() {
int count = 0;
try {
// 加载驱动
Class.forName(drive);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
// 创建连接对象,加入连接字符串、用户名、密码
con = DriverManager.getConnection(connStr, uid, pwd);
// 创建执行对象,并加入执行语句
pstm = con.prepareStatement(sql);
// 执行SQL语句,并返回受影响行数
count = pstm.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
count = -1;
} finally {
try {
// 关闭连接
pstm.close();
con.close();
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}
return count;
} // 主线程响应方法,用于显示提示气泡
public Runnable runShowResult = new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
String tips = "受影响行数为:" + resultCount;
// 弹出气泡
Toast.makeText(getApplicationContext(), tips, Toast.LENGTH_SHORT).show();
}
}; // 暂不需要理会
@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;
} // 暂不需要理会
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}

  说明:

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

Android 连接 SQL Server (jtds方式)——上的更多相关文章

  1. Android 连接 SQL Server (jtds方式)——下

    本文主要补充介绍jtds的查询方法,将以博主的一个实际开发程序进行说明 下图是项目的文件列表与界面效果:          运行效果: 1.三个EditText对应的是单个计划的序号.品种名.数量 2 ...

  2. Android 连接网络数据库的方式

    以连接MS SQL(sqlserver数据库)的网络数据库为例,从当前搜集的资料来看,一共有两种方式:在Android工程中引入JDBC驱动,直接连接:通过WebService等方法的间接连接. 采用 ...

  3. 【原创】Qt 使用ODBC driver 连接SQL Server

    最近在做数据库的课程设计.第一个需要解决的问题是使用什么工具来实现这个系统.经过一番资料查找,决定使用SQL Server Express 2012作为服务器,使用Qt作为编写客户端程序语言.问题是c ...

  4. jTDS Java连接SQL Server 2000数据库

    Java连接SQL Server 2000数据库时,有两种方法: (1)通过Microsoft的JDBC驱动连接.此JDBC驱动共有三个文件,分别 是mssqlserver.jar.msutil.ja ...

  5. phpstudy连接SQL Server 2008数据库 以及 php使用sql server出现乱码解决方式

    开始也尝试自己配置php安装环境,找到一个详细的百度经验http://jingyan.baidu.com/article/154b46315242b328ca8f4101.html,前面有问题也一一去 ...

  6. Java连接SQL Server:jTDS驱动兼容性问题

    Java连接SQL Server 2000数据库时,有两种方法: (1)通过Microsoft的JDBC驱动连接.此JDBC驱动共有三个文件,分别是mssqlserver.jar.msutil.jar ...

  7. JeeSite如何正确连接SQL SERVER 数据库

    JeeSite如何正确连接SQL SERVER 数据库 jeesite介绍 感谢jeesite项目的作者thinkgem. 没有你我也不会更改这数据源非了恁大的劲,,,,嘻嘻嘻说多了. JeeSite ...

  8. SQL server 数据库连接方式分析

    SQL server 数据库连接方式图示: ODBC和OLEDB连接的区别 ODBC(开放数据库互连):是Microsoft引进的一种早期数据库接口技术.它实际上是ADO的前身.早期的数据库连接是非常 ...

  9. Navicat 远程连接SQL Server 2014 Express 报08001错误

    场景:Navicat 远程连接SQL Server 2014 Express 报08001错误,经查验防火墙端口1434,1433已经打开 过程:1. 一开始觉得是连接名称问题,使用IP地址或者主机名 ...

随机推荐

  1. Standard Numeric Format Strings

    The following table describes the standard numeric format specifiers and displays sample output prod ...

  2. Android 5.0 技术新趋势

    由于 Android 的版本分裂比较严重,整个新系统升级可能需要一两年甚至更长时间.所以目前使用 Android 5.0 的大部分是喜欢尝鲜的用户,同时现在市场上能够很好支持 Android 5.0 ...

  3. HTTP请求和响应详解

    HTTP有两部分组成:请求与响应,下面分别整理. 一.HTTP请求 1.HTTP请求格式: <request line> <headers> <blank line> ...

  4. Beauty Contest(graham求凸包算法)

    Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 25256   Accepted: 7756 Description Bess ...

  5. -_-#【CSS】注释

  6. POJ 2762 Going from u to v or from v to u?(强联通 + TopSort)

    题目大意: 为了锻炼自己的儿子 Jiajia 和Wind 把自己的儿子带入到一个洞穴内,洞穴有n个房间,洞穴的道路是单向的. 每一次Wind 选择两个房间  x 和 y,   让他的儿子从一个房间走到 ...

  7. 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑

    2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...

  8. 杂题 UVAoj 10000 Longest Paths

      Longest Paths  It is a well known fact that some people do not have their social abilities complet ...

  9. 搜索与DP:SLIKAR

    Problem: SLIKAR[题目描述]Josip 是个奇怪的画家,他想画一幅由 N*N 个点组成的图, N 是一个 2 的乘方 数(1, 2, 4, 8, 16 等.).每个点要么是黑色的,要么是 ...

  10. How to Implement the IContextMenu Interface

    http://msdn.microsoft.com/en-us/library/windows/desktop/hh127443(v=vs.85).aspx IContextMenu is the m ...