当前位置:   article > 正文

android通过webservice连接SQL数据库(一)服务器端_android studio连接mssql 通过 web api 来处理所有的数据请求

android studio连接mssql 通过 web api 来处理所有的数据请求

作为一个学生党,参加了一个比赛,需要开发一个安卓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)  创建。创建后系统会自动生成如下代码:

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Services;
  6. namespace WebApplication3
  7. {
  8. /// <summary>
  9. /// WebService1 的摘要说明
  10. /// </summary>
  11. [WebService(Namespace = "http://tempuri.org/")]
  12. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  13. [System.ComponentModel.ToolboxItem(false)]
  14. // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
  15. // [System.Web.Script.Services.ScriptService]
  16. public class WebService1 : System.Web.Services.WebService
  17. {
  18. [WebMethod]
  19.         public string HelloWorld()
  20.         {
  21.             return "Hello World";
  22.         }
  23. }}
 
 

可以调试一下,发现只有一个Helloworld可以调用,可以在helloworld方法中添加参数例如将helloworld方法改为

 

  1. [WebMethod]
  2. public int HelloWorld(int a ,int b)
  3. {
  4. return a+b;
  5. }

 

 

 

自己感受。在方法定义中添加[WebMethod]可以让该方法在客户端进行访问。在客户端调用这些方法时输入的都是string类型的参数,在可行的情况下,系统会自动的将输入的参数转化成该方法对应的参数类型。

接下来就可以通过参考的博客,根据自己的需要来实现服务器端的编写,这里由于项目内容过多就不给展示了。

我的方法是:创建好数据库,然后再Vs2013中进行连接。

这里贴出方便用户连接SQL数据库的代码(SQLhelper)

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. /// <summary>
  6. /// SQLhelper 的摘要说明
  7. /// </summary>
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Data.SqlClient;
  11. using System.Data;
  12. using System.Configuration;
  13. namespace DAL
  14. {
  15. public class SQLHelper
  16. {
  17. private SqlConnection connect = null;
  18. private SqlCommand cmd = null;
  19. private SqlDataReader sdr = null;
  20. public SQLHelper()
  21. {
  22. connect = new SqlConnection();
  23. connect.ConnectionString = "Data Source =<服务器名>; Initial Catalog=<数据库名>;User ID=sa;password=<密码>";
  24. }
  25. private SqlConnection Getconn()
  26. {
  27. if (connect.State == ConnectionState.Closed)
  28. {
  29. connect.Open();
  30. }
  31. return connect;
  32. }
  33. #region 不带参数的
  34. /// <summary>
  35. /// 该方法传入sql语句,执行并返回受影响的行数
  36. /// </summary>
  37. /// <param name="sql"></param>
  38. /// <returns></returns>
  39. public int ExecuteNonQuery(string cmdText, CommandType ct = CommandType.Text)
  40. {
  41. int res;
  42. try
  43. {
  44. cmd = new SqlCommand(cmdText, Getconn());
  45. cmd.CommandType = ct;
  46. res = cmd.ExecuteNonQuery();
  47. }
  48. catch (Exception ex)
  49. {
  50. throw ex;
  51. }
  52. finally
  53. {
  54. if (connect.State == ConnectionState.Open)
  55. {
  56. connect.Close();
  57. }
  58. }
  59. return res;
  60. }
  61. #endregion
  62. /// <summary>
  63. /// 执行带参数集的sql增删改语句
  64. /// </summary>
  65. /// <param name="sql">sql语句或存储过程</param>
  66. /// <param name="paras">参数集合</param>
  67. /// <returns></returns>
  68. public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct = CommandType.Text)
  69. {
  70. int res;
  71. using (cmd = new SqlCommand(cmdText, Getconn()))
  72. {
  73. cmd.CommandType = ct;
  74. cmd.Parameters.AddRange(paras);
  75. res = cmd.ExecuteNonQuery();
  76. }
  77. if (connect.State == ConnectionState.Open)
  78. {
  79. connect.Close();
  80. }
  81. return res;
  82. }
  83. #region 不带参数的查询
  84. /// <summary>
  85. /// 该方法执行传入的SQL查询语句
  86. /// </summary>
  87. /// <param name="cmdText">SQL查询语句 或存储过程</param>
  88. /// <returns></returns>
  89. public DataTable ExecuteQuery(string cmdText, CommandType ct = CommandType.Text)
  90. {
  91. DataTable dt = new DataTable();
  92. cmd = new SqlCommand(cmdText, Getconn());
  93. cmd.CommandType = ct;
  94. using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
  95. {
  96. dt.Load(sdr);
  97. }
  98. return dt;
  99. }
  100. #endregion
  101. #region ExecuteQuery该方法执行传入的SQL查询语句
  102. /// <summary>
  103. /// 该方法执行传入的SQL查询语句
  104. /// </summary>
  105. /// <param name="cmdText">sql语句或存储过程</param>
  106. /// <param name="paras">参数集合</param>
  107. /// <returns></returns>
  108. public List<string> ExecuteQuery(string cmdText,int length,SqlParameter[] paras, CommandType ct = CommandType.Text)
  109. {
  110. List<string> list = new List<string>();
  111. cmd = new SqlCommand(cmdText, Getconn());
  112. try
  113. {
  114. cmd.CommandType = ct;
  115. cmd.Parameters.AddRange(paras);
  116. sdr = cmd.ExecuteReader();
  117. while (sdr.Read())
  118. {
  119. for (int i = 0; i < length; i++)
  120. {
  121. list.Add(sdr[i].ToString());
  122. }
  123. }
  124. sdr.Close();
  125. cmd.Dispose();
  126. }
  127. catch { }
  128. finally
  129. {
  130. if (connect.State == ConnectionState.Open)
  131. {
  132. connect.Close();
  133. }
  134. }
  135. return list;
  136. }
  137. /// <summary>
  138. /// 该方法执行传入的SQL查询语句
  139. /// </summary>
  140. /// <param name="cmdText">sql语句或存储过程</param>
  141. /// <param name="paras">参数集合</param>
  142. /// <returns></returns>
  143. public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct = CommandType.Text)
  144. {
  145. DataTable dt = new DataTable();
  146. cmd = new SqlCommand(cmdText, Getconn());
  147. cmd.CommandType = ct;
  148. cmd.Parameters.AddRange(paras);
  149. using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
  150. {
  151. dt.Load(sdr);
  152. if (connect.State == ConnectionState.Open)
  153. {
  154. connect.Close();
  155. }
  156. }
  157. return dt;
  158. }
  159. #endregion
  160. }
  161. }


代码说明:第一个参数cmdText:传入SQL语句或存储过程名

 

               第二个参数 paras :SQL语句中的参数对象

  第三个参数  ct :决定执行cmdText内容是SQL语句,还是存储过程,其中CommandType.Text执行的是SQL语句

返回值为List<string>的第二个参数length:为SQL查询结果的字段个数。

要改的地方 只有数据库连接字符串 connect.ConnectionString ,根据自己的需要改。

该SQLhelper使用范例:

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using DAL;
  6. using System.Data.SqlClient;
  7. using System.Data;
  8. namespace MyProject
  9. {
  10. public class UserDAL
  11. { SQLHelper sqlhelper;
  12. public UserDAL()
  13. {
  14. sqlhelper = new SQLHelper();
  15. }
  16. #region 插入用户信息
  17. public bool Insert(string phonenum,string name,string sex ,string password,string address,int isguide=0)
  18. {
  19. //TODO:增加用户
  20. bool flag = false;
  21. SqlParameter[] para = new SqlParameter[]{
  22. new SqlParameter("@phone",phonenum),
  23. new SqlParameter("@name",name),
  24. new SqlParameter("@sex",sex),
  25. new SqlParameter("@password",password),
  26. new SqlParameter("@address",address),
  27. new SqlParameter("@isguide",isguide)
  28. };
  29. string cmdText = "insert into userTable (phoneNum,name,sex,password,address,isguide) values (@phone,@name,@sex,@password,@address,@isguide)";
  30. int res = sqlhelper.ExecuteNonQuery(cmdText, para);
  31. if (res > 0)
  32. {
  33. flag = true;
  34. }
  35. return flag;
  36. }
  37. #endregion
  38. #region 用户是否存在
  39. public bool IsExistUser(string phonenum) {
  40. bool flag = false;
  41. SqlParameter[] para = new SqlParameter[]{
  42. new SqlParameter("@phonenum",phonenum),
  43. };
  44. DataTable dt = sqlhelper.ExecuteQuery("select * from userTable where phoneNum=@phonenum ", para);
  45. if (dt.Rows.Count != 0)
  46. flag = true;
  47. return flag;
  48. }
  49. #endregion
  50. #region 密码和用户是否匹配
  51. public bool IsMatchUser(string phonenum,string password)
  52. {
  53. bool flag=false;
  54. SqlParameter[] para = new SqlParameter[]{
  55. new SqlParameter("@phonenum",phonenum),
  56. new SqlParameter("@password",password),
  57. };
  58. DataTable dt = sqlhelper.ExecuteQuery("select * from userTable where phoneNum=@phonenum and password=@password",para);
  59. if (dt.Rows.Count !=0)
  60. flag = true;
  61. return flag;
  62. }
  63. #endregion
  64. #region 根据Phonenum修改name 和sex 和address和 signature 和 isguide
  65. /// <summary>
  66. /// 根据Phonenum修改name 和sex
  67. /// </summary>
  68. /// <param name="phonenum">电话号码</param>
  69. /// <param name="name">要修改的名字</param>
  70. /// <param name="sex">要修改的性别</param>
  71. /// <returns></returns>
  72. public bool ModifyImformation(string phonenum, string name,string sex,string address,string signature,string isguide)
  73. {
  74. bool flag = false;
  75. SqlParameter[] para = new SqlParameter[]{
  76. new SqlParameter("@phonenum",phonenum),
  77. new SqlParameter("@name",name),
  78. new SqlParameter("@sex",sex),
  79. new SqlParameter("@address",address),
  80. new SqlParameter("@signature",signature),
  81. new SqlParameter("@isguide",isguide),
  82. };
  83. string cmdText = "update userTable set name=@name,sex=@sex,address=@address,[signature]=@signature,isguide=@isguide where phoneNum=@phonenum ";
  84. int res = sqlhelper.ExecuteNonQuery(cmdText, para);
  85. if (res > 0)
  86. {
  87. flag = true;
  88. }
  89. return flag;
  90. }
  91. #endregion
  92. #region 修改密码
  93. /// <summary>
  94. /// 修改密码
  95. /// </summary>
  96. /// <param name="phonenum">电话号码</param>
  97. /// <param name="password">要修改的密码</param>
  98. /// <returns></returns>
  99. public bool ModifyPassword(string phonenum, string password)
  100. {
  101. bool flag = false;
  102. SqlParameter[] para = new SqlParameter[]{
  103. new SqlParameter("@phonenum",phonenum),
  104. new SqlParameter("@password",password),
  105. };
  106. string cmdText = "update userTable set password=@password where phoneNum= @phonenum";
  107. int res = sqlhelper.ExecuteNonQuery(cmdText, para);
  108. if (res > 0)
  109. {
  110. flag = true;
  111. }
  112. return flag;
  113. }
  114. #endregion
  115. #region 判断账号是否为导游
  116. public bool Isguide(string phonenum)
  117. {
  118. bool flag = false;
  119. SqlParameter[] para = new SqlParameter[]{
  120. new SqlParameter("@phonenum",phonenum),
  121. };
  122. DataTable dt = sqlhelper.ExecuteQuery("select * from userTable where isguide!='0' and phoneNum=@phonenum", para);
  123. if (dt.Rows.Count != 0)
  124. flag = true;
  125. return flag;
  126. }
  127. #endregion
  128. public List<string> SelectUserById(string phonenum)
  129. {
  130. SqlParameter[] para = new SqlParameter[]{
  131. new SqlParameter("@phonenum",phonenum),
  132. };
  133. List<string> str = sqlhelper.ExecuteQuery("select * from userTable where phoneNum=@phonenum", 7, para);
  134. return str;
  135. }}}

 

 

在WebService中加入如下代码

 

  1. #region 用户注册:电话号码、姓名、性别、密码、是否为导游
  2. [WebMethod(Description="用户注册")]
  3. public bool insertUser(string phonenum, string name, string sex, string password,string address, int isguide = 0)
  4. {
  5. return new UserDAL().Insert(phonenum, name, sex, password, address,isguide);
  6. }
  7. #endregion
  8. #region 账号密码是否匹配验证
  9. [WebMethod (Description="账号和密码是否匹配")]
  10. public bool IsMatchUser(string phonenum, string password)
  11. {
  12. return new UserDAL().IsMatchUser(phonenum, password);
  13. }
  14. #endregion
  15. #region 判断账号是否为导游
  16. [WebMethod(Description = "判断账号是否为导游")]
  17. public bool Isguide(string phonenum)
  18. {
  19. return new UserDAL().Isguide(phonenum);
  20. }
  21. #endregion
  22. #region 账号是否存在
  23. [WebMethod(Description = "账号是否存在")]
  24. public bool IsExistUser(string phonenum)
  25. {
  26. return new UserDAL().IsExistUser(phonenum);
  27. }
  28. #endregion
  29. #region 修改密码
  30. [WebMethod(Description="根据用户修改密码")]
  31. public bool ModifyUserPassword(string phonenum, string password)
  32. {
  33. return new UserDAL().ModifyPassword(phonenum, password);
  34. }
  35. #endregion
  36. #region 修改个人信息
  37. [WebMethod(Description = "根据用户修改性别和名字")]
  38. public bool ModifyUserImformation(string phonenum, string name, string sex, string address, string signature,string isguide)
  39. {
  40. return new UserDAL().ModifyImformation(phonenum, name, sex, address, signature,isguide);
  41. }
  42. #endregion
  43. #region 有待测试的 根据用户名查找用户信息
  44. [WebMethod(Description="有待测试的 根据用户名查找用户信息")]
  45. public string[] SelectUserById(string phonenum)
  46. {
  47. return new UserDAL().SelectUserById(phonenum).ToArray();
  48. }
  49. #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

 

有什么不足望指正....

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/314220
推荐阅读
相关标签
  

闽ICP备14008679号