本文将介绍开发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.lazyload.js图片延迟加载

    转:http://www.jb51.net/article/50273.htm 这篇文章主要介绍了Jquery图片延迟加载插件jquery.lazyload.js的使用方法,需要的朋友可以参考下   ...

  2. C# 程序性能提升篇-2、类型(字段类型、class和struct)的错误定义所影响性能浅析

    前景提要: 编写程序时,也许你不经意间,就不知不觉的定义了错误的类型,从而发生了额外的性能消耗,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候 ...

  3. Redmine配置

    官网步骤说明 http://www.redmine.org/projects/redmine/wiki/RedmineInstall 搭环境 1.MySql 2.RailsInstaller:Redm ...

  4. ECommon.Dapper

    ECommon.Dapper 轻量级的dapper扩展 我们都知道Dapper这个orm框架,但是我们也知道他的扩展目前没有特别好的,今天我就推荐一个轻量级的很方便使用的一个扩展叫做 ECommon. ...

  5. Unity各平台路径总结

    路径是Unity开发中令人头疼的一个问题,根据我的开发经验,现将开发中遇到的路径问题总结如下: 1. 如何读取Application.streamingAssetsPath下的文件? Edit.iOS ...

  6. 转:GraphicsMagick介绍及安装

    原文来自于:http://www.cnblogs.com/cocowool/archive/2010/08/16/1800954.html GraphicsMagick 当前稳定版本:1.3.12(发 ...

  7. [BZOJ 3172] [Tjoi2013] 单词 【AC自动机】

    题目链接:BZOJ - 3172 题目分析: 题目要求求出每个单词出现的次数,如果把每个单词都在AC自动机里直接跑一遍,复杂度会很高. 这里使用AC自动机的“副产品”——Fail树,Fail树的一个性 ...

  8. iOS cell自动换行

    // //  DynamicHeightsViewController.h //  DynamicHeights // //  Created by Matt Long on 9/22/09. //  ...

  9. 工作那些事(二)应聘时填写个人信息ABCD

    先看看都有那些: 公司A: 填写来访人员登记表(在前台的那种),内容包括: 姓名.时间.电话.职位. 公司B: 填写来访人员登记表(在前台的那种),内容包括: 姓名.时间.电话.身份证号码().事由( ...

  10. C++ 路径中\\与/

    windows默认使用\\ linux默认使用/ 可以都用/