本文将介绍开发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. jQuery 树形结构

    强大的jquery.ztree树形菜单插件支持多种树形菜单导航 http://www.17sucai.com/pins/2259.html 演示: http://www.17sucai.com/pin ...

  2. ASP.NET MVC 过滤器Filter

    在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能 判断登录与否或用户权限 决策输出缓存 防盗链 防蜘蛛 本地化与国际化设置 实现动态Action Filter是一种声明式编 ...

  3. odoo view field option, action flage 参数

    options JSON object specifying configuration option for the field's widget (including default widget ...

  4. Asp.Net Mvc - 在OnResultExecut* 拦截Action返回的HTML

    在Asp.Net MVC项目中通过重写ActionFilterAttribute中的方法,我们就可以在轻松的在Action方法执行前后做一些特殊的操作如:[身份认证.日志记录.内容截取等]. 但是我们 ...

  5. java枚举小结

    如何定义一个枚举类? //定义了4个等级 enum Level{ A,B,C,D } 枚举类的实质: class Level{ public static final Level A = new Le ...

  6. [转载]网络编辑必知常识:什么是PV、UV和PR值 zz

    1.什么是pv PV(page view),即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标. 高手对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你网 ...

  7. Play on Words

    poj1386:http://poj.org/problem?id=1386 题意:给你n个单词,问你是否能够通过调整单词的顺序存在这样的一个序列,使得 每个单词的首字母是前一个单词的尾字母. 题解: ...

  8. Yii框架下不同contoller之间的方法调用

    一个contoller CustomerController里怎么调用另一个controller里的action,Acontoller调用SiteContoller的actionShow($id), ...

  9. 基于Node.js的强大爬虫 能直接发布抓取的文章哦

    基于Node.js的强大爬虫 能直接发布抓取的文章哦 基于Node.js的强大爬虫能直接发布抓取的文章哦!本爬虫源码基于WTFPL协议,感兴趣的小伙伴们可以参考一下 一.环境配置 1)搞一台服务器,什 ...

  10. 算法学习之C语言基础

    算法学习,先熟悉一下C语言哈!!! #include <conio.h> #include<stdio.h> int main(){ printf(+); getch(); ; ...