AndroidStudio通过JTDS远程访问SQLServer数据库
引用http://blog.sina.com.cn/s/blog_45eaa01a0102y8ug.html
一、下载SQL驱动JTDS
下载 jtds-1.3.1-dist.zip
2 在Android Studio中导入Library项目
在开发环境菜单
File -- New -- Import Project...
从中找到下载的加入
3 把Library项目添加到源项目中
这部不做,调用以下语句 Class.forName("net.sourceforge.jtds.jdbc.Driver");
会出现 ClassNotFound:net.sourceforge.jtds.jdbc.Driver 错误
在开发环境,从菜单 File -- Project Structure,点击进入
在窗口左侧选择自己的项目后,点击右侧的Dependencies。
点击右侧的“+”添加按钮,在下拉菜单中找到Module Dependency,点击打开项目选择窗口。
选择前面步骤中导入的Library项目后,点击OK按钮导入到自己项目中
二、开发环境
windows 7 X64
android 5.1
android studio 3.1.2
Microsoft SQL Server 2008 R2
1 SQL ERVER 允许远程访问
开始--SQL2008--配置工具--SQL Server配置管理器--SQL Server网络配置--SQLexpress的协议--TCP/IP
状态 要改为 已启用
2 建立数据库和表
数据库 BOOK
建立表 管理员,字段 编号,姓名,密码,内容如下:
编号 姓名 密码
1001 穆木 1212
1002 久九 123
1003 巴芭 111
1004 admin 111
三、用JTDS连接SQLServer数据库相关代码
1 Android 访问sql server的类
package com.example.wmx.myapplication6;
//package com.example.androidsql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil
{
private static Connection getSQLConnection(String ip, String user, String pwd, String db)
{
Connection con = null;
try
{
Class.forName("net.sourceforge.jtds.jdbc.Driver");
con = DriverManager.getConnection("jdbc:jtds:sqlserver://" + ip + ":1433/" + db, user, pwd);
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (SQLException e)
{
e.printStackTrace();
}
return con;
}
public static String QuerySQL()
{
String result = "";
try
{
Connection conn = getSQLConnection("10.3.1.37", "sa", "123", "book");
String sql = "select top 10 * from 管理员";
Statement stmt = conn.createStatement();//
ResultSet rs = stmt.executeQuery(sql);
while (rs.next())
{
String s1 = rs.getString("姓名");
String s2 = rs.getString("密码");
result += s1 + " - " + s2 + "\n";
System.out.println(s1 + " - " + s2);
}
rs.close();
stmt.close();
conn.close();
} catch (SQLException e)
{
e.printStackTrace();
result += "异常!" + e.getMessage();
}
return result;
}
public static void main(String[] args)
{
QuerySQL();
}
}
2 MainActivity.java
package com.example.wmx.myapplication6;
//package com.example.androidsql;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity
{
private View btnTest;
private View btnClean;
private TextView tvTestResult;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnTest=findViewById(R.id.btnTestSql);
btnClean=findViewById(R.id.btnClean);
tvTestResult = (TextView)findViewById(R.id.tvTestResult);
btnTest.setOnClickListener(getClickEvent());
btnClean.setOnClickListener(getClickEvent());
}
private View.OnClickListener getClickEvent(){
return new View.OnClickListener()
{
@Override
public void onClick(View v)
{
tvTestResult.setText("...");
if(v==btnTest){
test();
}
}
};
}
private void test()
{
Runnable run = new Runnable()
{
@Override
public void run()
{
//测试数据库的语句,在子线程操作,在主线程好像不成功。
String ret = DBUtil.QuerySQL();
Message msg = new Message();
msg.what=1001;
Bundle data = new Bundle();
data.putString("result", ret);
msg.setData(data);
mHandler.sendMessage(msg);
}
};
new Thread(run).start();
}
Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what)
{
case 1001:
String str = msg.getData().getString("result");
tvTestResult.setText(str);
break;
default:
break;
}
};
};
}
以下 XML文件中都有大量的 左尖括号<,测试发现博客中的 < 需要和它后面的内容之间空一格才行,这样做太麻烦了,为了简单拍成图片
3 activity_main.xml
4 content_main.xml
5 strings.xml
6 AndroidManifest.xml
注意:有关网络访问需要如下的许可,
< uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
< uses-permission android:name="android.permission.INTERNET" />
< uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
四 执行程序
1 从模拟上
2 从真实的手机上
五 IP地址的获得
SQL SERVER 数据库位于PC机上, 手机和PC机位于同一个局域网内
1 获得 PC机IP地址10.3.1.37
从命令行执行 ipconfig 获得Windows IP 配置如下:
无线局域网适配器 无线网络连接:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::59cb:ec67:d8a1:77d3
IPv4 地址 . . . . . . . . . . . . : 192.168.123.1
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :
以太网适配器 本地连接:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::50fb:a1b7:500e:82ef
IPv4 地址 . . . . . . . . . . . . : 10.3.1.37
子网掩码 . . . . . . . . . . . . : 255.255.0.0
默认网关. . . . . . . . . . . . . : 10.3.0.1
2 获得手机的IP地址 10.0.2.10
这一步不需要,只是将来需要静态设置时需要
从手机上, 设置--关于手机-- 状态信息
六 以下几个文件夹的内容可能在工作中出现问题,需要删除重新建立
C:\Users\wmx\AppData\Local\Android\Sdk
C:\Users\wmx\.android\avd\Nexus_5X_API_22.avd
C:\Users\wmx\.gradle\wrapper\dists\gradle-4.4-all\9br9xq1tocpiv8o6njlyu5op1