首先说一下背景,由于目前个人自学Android Studio,参考度娘实现连接DB的方式,总结出目前主流的两种方式:
1)使用jtds直接访问DB数据库(参考:https://blog.csdn.net/feidie436/article/details/77532194/)方式
2)另外一种就是比较主流的以webservice方式进行远程访问数据库,使用ksoap2进行数据读取及GSON进行数据解析
但是jtds目前有点弊端,建议局域网,少数人使用。所以这次主要以Android Studio+webservice+ksoap2+GSON的方式读取数据进行总结归纳
开发环境
1、windows 10专业版本X64(破解版,需要安装IIS,度娘上面有很多安装IIS的教程)
2、Visual Studio 2013旗舰版(又是盗版,穷逼一个,需要进行部署webservice)
3、Android Studio(这个是正版,需要ksoap2-android-assembly-3.6.4-jar-with-dependencies.jar(这个需要自己下载,可以进行ksoap2的官网下载,CSDN的资源下载太贵,伤不起,然后放在android项目libs目录下导入Android Studio到)和导入Android Studio自带的com.google.code.gson:gson2.8.5和GsonFormat,度娘上面有很多如何从Android Studio自动添加gson和GsonFormat的方法,这边就不细说了,另外gson的版本可能不一样,但是我现在Android Studio3.3.2的自带是gson2.8.5,这些都不重要,用法都是一样的,另外还需用到AsyncTask异步多线程,Android 不能在主线程直接访问数据库,必须用到异步才能进行)
4、SQL Server 2008 R2版本的(网上找的破解版,挺好用的)
实现逻辑
第一步:安装SQL Server 2008 R2,Visual Studio 2013,Android Studio,
因为是盗版的windows系统,在安装系统环境的时候遇到各种问题,比如windows没有IIS组件,比如在运行Visual Studio 2013的时候报错:内存被占用,最坑的一次是,什么都安装完了,还免费激活400年…结果第3天,系统变未激活,系统还原初始状态,系统Patch参数全部清空,SQL Server 2008 R2及多个软件不能启动…不过还好,最后终于找到一个系统版本,免费激活180天的,一直用到了现在,所以想吐槽一下,那些GHOST系统版本的,能不能不要精简了。
第二步:Visual Studio 2013创建个空网站,新建webserver服务,访问及操作数据库
1)Visual Studio 2013新建一个空白网站
2)新建项目->Web服务(ASMX)
3)配置Web.config
add name=“conn_data” connectionString=“server=.;database=testDB;user id=sa;password=618531;Max Pool Size=50000;Min Pool Size=2;Pooling=true;Connect Timeout=60000;” providerName=“System.Data.SqlClient”
4)编写SQLHelper.cs文件用来进行数据库操作
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DBUtility
{
///
/// 数据库访问类,
///
public class SQLHelper
{
#region 全局变量定义
private static SQLHelper sqldb;
///
/// 定义数据库链接字符串
///
private string sqlConnStr = “”;
private SqlConnection con;
#endregion
#region <!------------------SQlhelper对象重载------------------->
/// <summary>
/// 根据默认连接字符串实例化
/// </summary>
public SQLHelper()
{
sqlConnStr = System.Configuration.ConfigurationManager.ConnectionStrings["conn_data"].ToString();
}
/// <summary>
/// 根据指定数据库链接字符串实例化
/// </summary>
/// <param name="connectionName">指定数据库链接字符串值</param>
public SQLHelper(string connectionName)
{
sqlConnStr = System.Configuration.ConfigurationManager.ConnectionStrings[connectionName].ToString();
}
#endregion
#region <!------------------返回一个SlqHelper类的实例------------------->
/// <summary>
/// 创建SqlHelper的对象(默认数据库链接connName=conn_data)
/// </summary>
/// <returns>sqlhelper实例</returns>
public static SQLHelper CreateSQLHelper()
{
if (sqldb == null)
{
sqldb = new SQLHelper();
return sqldb;
}
else
{
return sqldb;
}
}
/// <summary>
/// 创建SqlHelper的对象(指定数据库链接connName=自定义的非'conn_data')
/// </summary>
/// <param name="connectionName">数据库链接字符串在config中的键值名称</param>
/// <returns>sqlhelper实例</returns>
public static SQLHelper CreateSQLHelper(string connectionName)
{
//如需要用到,可能会修改对象名,否则无法真正重载此函数(sqldb不为空)
if (sqldb == null)
{
sqldb = new SQLHelper(connectionName);
return sqldb;
}
else
{
return sqldb;
}
}
#endregion
#region <!------------------连接数据库 获得一个sqlconnection的连接 及数据库链接操作------------------->
/// <summary>
/// 连接数据库对象及数据库链接操作
/// </summary>
public SqlConnection CreateConnecton()
{
string connstr = sqlConnStr;// System.Configuration.ConfigurationManager.ConnectionStrings["conn_data"].ToString();
try
{
con = new SqlConnection(connstr);
}
catch (SqlException ex)
{
throw ex;
}
return con;
}
/// <summary>
/// 打开数据库链接
/// </summary>
private void ConnOpen()
{
if (con.State != ConnectionState.Open)
{
con.Open();
}
}
/// <summary>
/// 关闭数据库链接 同时释放sqlconnection资源
/// </summary>
private void ConnClose()
{
if (con.State == ConnectionState.Open)
{
con.Close();
con.Dispose();
}
else
{
con.Dispose();
}
}
#endregion
#region <!------------------数据库的增、删、改更新操作------------------->
#region <!------------------sql语句执行------------------->
/// <summary>
/// 执行不带参数的sql语句,更新数据库返回受影响的行数
/// </summary>
/// <param name="cmdText">T-SQL语句</param>
/// <returns></returns>
public int TSQLExecuteNonQuery(string cmdText)
{
return TSQLExecuteNonQuery(cmdText, null);
}
/// <summary>
/// 执行带参数的sql语句,更新数据库返回受影响的行数
/// </summary>
/// <param name="cmdText">T-SQL语句</param>
/// <param name="commandParameters">一组用于执行命令的参数</param>
/// <returns></returns>
public int TSQLExecuteNonQuery(string cmdText, params SqlParameter[] commandParameters)
{
int val = 0;
try
{
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn=CreateConnecton())
{
//conn = CreateConnecton();
PrepareCommand(cmd, null, CommandType.Text, cmdText, commandParameters,conn);
val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
}
catch(SqlException ex)
{
//ConnClose();
throw ex;
}
return val;
}
#endregion
#region <!------------------存储过程执行------------------->
/// <summary>
/// 执行不带参数的存储过程,更新数据库并返回受影响的行数
/// </summary>
/// <param name="cmdText">存储过程名称</param>
/// <returns>返回受影响的行数</returns>
public int PROCExecuteNonQuery(string procName)
{
return PROCExecuteNonQuery(procName,null,null);
}
/// <summary>
/// 执行带参数的存储过程,更新数据库并返回受影响的行数
/// </summary>
/// <param name="cmdText">存储过程名称</param>
/// <param name="commandParameters">一组用于执行命令的参数</param>
/// <returns>返回受影响的行数</returns>
public int PROCExecuteNonQuery(string procName, params SqlParameter[] commandParameters)
{
return PROCExecuteNonQuery(procName, 0, commandParameters);
}
/// <summary>
/// 执行带参数的存储过程,更新数据库并返回受影响的行数
/// </summary>
/// <param name="cmdText">存储过程名称</param>
/// <param name="times">设置执行存储过程的时间 单位(秒)</param>
/// <param name="commandParameters">一组用于执行命令的参数</param>
/// <returns>返回受影响的行数</returns>
public int PROCExecuteNonQuery(string procName,int times, params SqlParameter[] commandParameters)
{
int val = 0;
try
{
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = CreateConnecton())
{
PrepareCommand(cmd, null, CommandType.StoredProcedure, procName, commandParameters,times,conn);
val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
}
catch (SqlException ex)
{
//ConnClose();
throw ex;
}
return val;
}
#endregion