android通过webservice连接SQL数据库(一)服务器端
来源:互联网 发布:百度地图lbs数据 编辑:程序博客网 时间:2024/06/16 08:12
作为一个学生党,参加了一个比赛,需要开发一个安卓app,需要用到数据库存储。SQLite数据库虽然是安卓常用的数据库,但只能在手机本地上进行存储,实现不了像QQ等其他软件一样实现用户登录功能。而且对于一个不小的程序来说,Android直连SQLsever也是非常不恰当的。在网络上搜索相关服务器资料,实现Android通过webservice连接SQL数据库。参考:http://blog.csdn.net/zhyl8157121/article/details/8169172#
刚好,本人对asp.net也不是太陌生,具体思路如下:在VisualStudio中的webservice中写访问SQLsever的代码,获取数据转成XML文件形式再传给android客户端。
一、VisualStudio2013→新建→项目→Asp.netWeb应用程序(空项目),我的语言是C#。创建好后 在对象资源管理器中右键项目名→添加→新建项→Web服务ASMX(即WebService.asmx) 创建。创建后系统会自动生成如下代码:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Services;namespace WebApplication3{ /// <summary> /// WebService1 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 // [System.Web.Script.Services.ScriptService] public class WebService1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; }}}
可以调试一下,发现只有一个Helloworld可以调用,可以在helloworld方法中添加参数例如将helloworld方法改为
[WebMethod] public int HelloWorld(int a ,int b) { return a+b; }
自己感受。在方法定义中添加[WebMethod]可以让该方法在客户端进行访问。在客户端调用这些方法时输入的都是string类型的参数,在可行的情况下,系统会自动的将输入的参数转化成该方法对应的参数类型。
接下来就可以通过参考的博客,根据自己的需要来实现服务器端的编写,这里由于项目内容过多就不给展示了。
我的方法是:创建好数据库,然后再Vs2013中进行连接。
这里贴出方便用户连接SQL数据库的代码(SQLhelper)
using System;using System.Collections.Generic;using System.Linq;using System.Web;/// <summary>/// SQLhelper 的摘要说明/// </summary>using System.Text;using System.Threading.Tasks;using System.Data.SqlClient;using System.Data;using System.Configuration;namespace DAL{ public class SQLHelper { private SqlConnection connect = null; private SqlCommand cmd = null; private SqlDataReader sdr = null; public SQLHelper() { connect = new SqlConnection(); connect.ConnectionString = "Data Source =<服务器名>; Initial Catalog=<数据库名>;User ID=sa;password=<密码>"; } private SqlConnection Getconn() { if (connect.State == ConnectionState.Closed) { connect.Open(); } return connect; } #region 不带参数的 /// <summary> /// 该方法传入sql语句,执行并返回受影响的行数 /// </summary> /// <param name="sql"></param> /// <returns></returns> public int ExecuteNonQuery(string cmdText, CommandType ct = CommandType.Text) { int res; try { cmd = new SqlCommand(cmdText, Getconn()); cmd.CommandType = ct; res = cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { if (connect.State == ConnectionState.Open) { connect.Close(); } } return res; } #endregion /// <summary> /// 执行带参数集的sql增删改语句 /// </summary> /// <param name="sql">sql语句或存储过程</param> /// <param name="paras">参数集合</param> /// <returns></returns> public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct = CommandType.Text) { int res; using (cmd = new SqlCommand(cmdText, Getconn())) { cmd.CommandType = ct; cmd.Parameters.AddRange(paras); res = cmd.ExecuteNonQuery(); } if (connect.State == ConnectionState.Open) { connect.Close(); } return res; } #region 不带参数的查询 /// <summary> /// 该方法执行传入的SQL查询语句 /// </summary> /// <param name="cmdText">SQL查询语句 或存储过程</param> /// <returns></returns> public DataTable ExecuteQuery(string cmdText, CommandType ct = CommandType.Text) { DataTable dt = new DataTable(); cmd = new SqlCommand(cmdText, Getconn()); cmd.CommandType = ct; using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } return dt; }#endregion #region ExecuteQuery该方法执行传入的SQL查询语句 /// <summary> /// 该方法执行传入的SQL查询语句 /// </summary> /// <param name="cmdText">sql语句或存储过程</param> /// <param name="paras">参数集合</param> /// <returns></returns> public List<string> ExecuteQuery(string cmdText,int length,SqlParameter[] paras, CommandType ct = CommandType.Text) { List<string> list = new List<string>(); cmd = new SqlCommand(cmdText, Getconn()); try { cmd.CommandType = ct; cmd.Parameters.AddRange(paras); sdr = cmd.ExecuteReader(); while (sdr.Read()) { for (int i = 0; i < length; i++) { list.Add(sdr[i].ToString()); } } sdr.Close(); cmd.Dispose(); } catch { } finally { if (connect.State == ConnectionState.Open) { connect.Close(); } } return list; } /// <summary> /// 该方法执行传入的SQL查询语句 /// </summary> /// <param name="cmdText">sql语句或存储过程</param> /// <param name="paras">参数集合</param> /// <returns></returns> public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct = CommandType.Text) { DataTable dt = new DataTable(); cmd = new SqlCommand(cmdText, Getconn()); cmd.CommandType = ct; cmd.Parameters.AddRange(paras); using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); if (connect.State == ConnectionState.Open) { connect.Close(); } } return dt; } #endregion }}
代码说明:第一个参数cmdText:传入SQL语句或存储过程名
第二个参数 paras :SQL语句中的参数对象
第三个参数 ct :决定执行cmdText内容是SQL语句,还是存储过程,其中CommandType.Text执行的是SQL语句
返回值为List<string>的第二个参数length:为SQL查询结果的字段个数。
要改的地方 只有数据库连接字符串 connect.ConnectionString ,根据自己的需要改。
该SQLhelper使用范例:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using DAL;using System.Data.SqlClient;using System.Data;namespace MyProject{ public class UserDAL { SQLHelper sqlhelper; public UserDAL(){ sqlhelper = new SQLHelper();} #region 插入用户信息 public bool Insert(string phonenum,string name,string sex ,string password,string address,int isguide=0) { //TODO:增加用户 bool flag = false; SqlParameter[] para = new SqlParameter[]{ new SqlParameter("@phone",phonenum), new SqlParameter("@name",name), new SqlParameter("@sex",sex), new SqlParameter("@password",password), new SqlParameter("@address",address), new SqlParameter("@isguide",isguide) }; string cmdText = "insert into userTable (phoneNum,name,sex,password,address,isguide) values (@phone,@name,@sex,@password,@address,@isguide)"; int res = sqlhelper.ExecuteNonQuery(cmdText, para); if (res > 0) { flag = true; } return flag; }#endregion #region 用户是否存在 public bool IsExistUser(string phonenum) { bool flag = false; SqlParameter[] para = new SqlParameter[]{ new SqlParameter("@phonenum",phonenum), }; DataTable dt = sqlhelper.ExecuteQuery("select * from userTable where phoneNum=@phonenum ", para); if (dt.Rows.Count != 0) flag = true; return flag; } #endregion #region 密码和用户是否匹配 public bool IsMatchUser(string phonenum,string password) { bool flag=false; SqlParameter[] para = new SqlParameter[]{ new SqlParameter("@phonenum",phonenum), new SqlParameter("@password",password), }; DataTable dt = sqlhelper.ExecuteQuery("select * from userTable where phoneNum=@phonenum and password=@password",para); if (dt.Rows.Count !=0) flag = true; return flag; } #endregion #region 根据Phonenum修改name 和sex 和address和 signature 和 isguide /// <summary> /// 根据Phonenum修改name 和sex /// </summary> /// <param name="phonenum">电话号码</param> /// <param name="name">要修改的名字</param> /// <param name="sex">要修改的性别</param> /// <returns></returns> public bool ModifyImformation(string phonenum, string name,string sex,string address,string signature,string isguide) { bool flag = false; SqlParameter[] para = new SqlParameter[]{ new SqlParameter("@phonenum",phonenum), new SqlParameter("@name",name), new SqlParameter("@sex",sex), new SqlParameter("@address",address), new SqlParameter("@signature",signature), new SqlParameter("@isguide",isguide), }; string cmdText = "update userTable set name=@name,sex=@sex,address=@address,[signature]=@signature,isguide=@isguide where phoneNum=@phonenum "; int res = sqlhelper.ExecuteNonQuery(cmdText, para); if (res > 0) { flag = true; } return flag; } #endregion #region 修改密码 /// <summary> /// 修改密码 /// </summary> /// <param name="phonenum">电话号码</param> /// <param name="password">要修改的密码</param> /// <returns></returns> public bool ModifyPassword(string phonenum, string password) { bool flag = false; SqlParameter[] para = new SqlParameter[]{ new SqlParameter("@phonenum",phonenum), new SqlParameter("@password",password), }; string cmdText = "update userTable set password=@password where phoneNum= @phonenum"; int res = sqlhelper.ExecuteNonQuery(cmdText, para); if (res > 0) { flag = true; } return flag; } #endregion #region 判断账号是否为导游 public bool Isguide(string phonenum) { bool flag = false; SqlParameter[] para = new SqlParameter[]{ new SqlParameter("@phonenum",phonenum), }; DataTable dt = sqlhelper.ExecuteQuery("select * from userTable where isguide!='0' and phoneNum=@phonenum", para); if (dt.Rows.Count != 0) flag = true; return flag; } #endregion public List<string> SelectUserById(string phonenum) { SqlParameter[] para = new SqlParameter[]{ new SqlParameter("@phonenum",phonenum), }; List<string> str = sqlhelper.ExecuteQuery("select * from userTable where phoneNum=@phonenum", 7, para); return str; }}}
在WebService中加入如下代码
#region 用户注册:电话号码、姓名、性别、密码、是否为导游 [WebMethod(Description="用户注册")] public bool insertUser(string phonenum, string name, string sex, string password,string address, int isguide = 0) { return new UserDAL().Insert(phonenum, name, sex, password, address,isguide); } #endregion #region 账号密码是否匹配验证 [WebMethod (Description="账号和密码是否匹配")] public bool IsMatchUser(string phonenum, string password) { return new UserDAL().IsMatchUser(phonenum, password); } #endregion #region 判断账号是否为导游 [WebMethod(Description = "判断账号是否为导游")] public bool Isguide(string phonenum) { return new UserDAL().Isguide(phonenum); } #endregion #region 账号是否存在 [WebMethod(Description = "账号是否存在")] public bool IsExistUser(string phonenum) { return new UserDAL().IsExistUser(phonenum); } #endregion #region 修改密码 [WebMethod(Description="根据用户修改密码")] public bool ModifyUserPassword(string phonenum, string password) { return new UserDAL().ModifyPassword(phonenum, password); } #endregion #region 修改个人信息 [WebMethod(Description = "根据用户修改性别和名字")] public bool ModifyUserImformation(string phonenum, string name, string sex, string address, string signature,string isguide) { return new UserDAL().ModifyImformation(phonenum, name, sex, address, signature,isguide); } #endregion #region 有待测试的 根据用户名查找用户信息 [WebMethod(Description="有待测试的 根据用户名查找用户信息")] public string[] SelectUserById(string phonenum) { return new UserDAL().SelectUserById(phonenum).ToArray(); } #endregion
然后执行程序会有如下界面
最后任务就是将这Webservice挂到本地IIS上,VS2013菜单栏→项目→项目属性(最下方)→应用程序中的Web。找到选项服务器默认在IIS Express发布,选择本地IIS 添加虚拟目录,(注意:要用管理员的身份运行VS2013)。如果在Internet 信息服务IIS管理器上中看到发布的网站,那么就成功了。电脑中没有IIS的需要自己安装。
最最后,在web.config中添加如下代码段
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
和
<appSettings>
<add key="vs:EnableBrowserLink" value="false"/>
</appSettings>
清空系统自动添加的烦人的代码。
看看现在可不可以连接到服务器。使用安卓手机,在同一个网络下,可以开热点。用手机打开如下网址
http://<你的本地IP> 电脑IP可以在cmd中输入ipconfig 查询。
如果访问成功会有一个IIS的页面
接下来访问webservice,就是项目调试时的网址。例如:
http://localhost/TourismWeb/TourismService.asmx,在手机中访问时要把localhost改为本地ip
有什么不足望指正....
- android通过webservice连接SQL数据库(一)服务器端
- android通过webservice连接SQL数据库(二)客户端
- Android通过Webservice连接数据库
- Android通过webservice连接sqlserver数据库
- android通过webservice连接SQL Server详细教程(数据库+服务器+客户端)
- sql webservice连接数据库
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- 线程安全杂谈之锁
- 包含多个段的程序
- 344. Reverse String
- 通过流实现文件读写的方法(中)
- c 语言中的宏定义
- android通过webservice连接SQL数据库(一)服务器端
- tensorflow线性回归例子
- 贪心算法基础之活动时间安排(二) 51nod 贪心教程
- 腾讯加固脱壳
- 46. Permutations
- Binder的使用
- Linux下抓包工具tcpdump的使用
- 快排算法C++实现
- 【linux】编写一个简单的shell