android通过webservice连接SQL数据库(一)服务器端
作為一個學(xué)生黨,參加了一個比賽,需要開發(fā)一個安卓app,需要用到數(shù)據(jù)庫存儲。SQLite數(shù)據(jù)庫雖然是安卓常用的數(shù)據(jù)庫,但只能在手機本地上進行存儲,實現(xiàn)不了像QQ等其他軟件一樣實現(xiàn)用戶登錄功能。而且對于一個不小的程序來說,Android直連SQLsever也是非常不恰當?shù)摹T诰W(wǎng)絡(luò)上搜索相關(guān)服務(wù)器資料,實現(xiàn)Android通過webservice連接SQL數(shù)據(jù)庫。參考:http://blog.csdn.net/zhyl8157121/article/details/8169172#
剛好,本人對asp.net也不是太陌生,具體思路如下:在VisualStudio中的webservice中寫訪問SQLsever的代碼,獲取數(shù)據(jù)轉(zhuǎn)成XML文件形式再傳給android客戶端。
一、VisualStudio2013→新建→項目→Asp.netWeb應(yīng)用程序(空項目),我的語言是C#。創(chuàng)建好后 在對象資源管理器中右鍵項目名→添加→新建項→Web服務(wù)ASMX(即WebService.asmx) ?創(chuàng)建。創(chuàng)建后系統(tǒng)會自動生成如下代碼:
?
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 從腳本中調(diào)用此 Web 服務(wù),請取消注釋以下行。 // [System.Web.Script.Services.ScriptService]public class WebService1 : System.Web.Services.WebService{[WebMethod]public string HelloWorld(){return "Hello World";} }}可以調(diào)試一下,發(fā)現(xiàn)只有一個Helloworld可以調(diào)用,可以在helloworld方法中添加參數(shù)例如將helloworld方法改為
?
[WebMethod]public int HelloWorld(int a ,int b) {return a+b;}?
?
自己感受。在方法定義中添加[WebMethod]可以讓該方法在客戶端進行訪問。在客戶端調(diào)用這些方法時輸入的都是string類型的參數(shù),在可行的情況下,系統(tǒng)會自動的將輸入的參數(shù)轉(zhuǎn)化成該方法對應(yīng)的參數(shù)類型。
接下來就可以通過參考的博客,根據(jù)自己的需要來實現(xiàn)服務(wù)器端的編寫,這里由于項目內(nèi)容過多就不給展示了。
我的方法是:創(chuàng)建好數(shù)據(jù)庫,然后再Vs2013中進行連接。
這里貼出方便用戶連接SQL數(shù)據(jù)庫的代碼(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 =<服務(wù)器名>; Initial Catalog=<數(shù)據(jù)庫名>;User ID=sa;password=<密碼>"; }private SqlConnection Getconn(){if (connect.State == ConnectionState.Closed){connect.Open();}return connect;}#region 不帶參數(shù)的/// <summary>/// 該方法傳入sql語句,執(zhí)行并返回受影響的行數(shù) /// </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>/// 執(zhí)行帶參數(shù)集的sql增刪改語句/// </summary>/// <param name="sql">sql語句或存儲過程</param>/// <param name="paras">參數(shù)集合</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 不帶參數(shù)的查詢/// <summary>/// 該方法執(zhí)行傳入的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該方法執(zhí)行傳入的SQL查詢語句/// <summary>/// 該方法執(zhí)行傳入的SQL查詢語句/// </summary>/// <param name="cmdText">sql語句或存儲過程</param>/// <param name="paras">參數(shù)集合</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>/// 該方法執(zhí)行傳入的SQL查詢語句/// </summary>/// <param name="cmdText">sql語句或存儲過程</param>/// <param name="paras">參數(shù)集合</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} }
代碼說明:第一個參數(shù)cmdText:傳入SQL語句或存儲過程名
?
? ? ? ? ? ? ? ?第二個參數(shù) paras :SQL語句中的參數(shù)對象
? 第三個參數(shù) ?ct :決定執(zhí)行cmdText內(nèi)容是SQL語句,還是存儲過程,其中CommandType.Text執(zhí)行的是SQL語句
返回值為List<string>的第二個參數(shù)length:為SQL查詢結(jié)果的字段個數(shù)。
要改的地方 只有數(shù)據(jù)庫連接字符串 connect.ConnectionString ,根據(jù)自己的需要改。
該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 根據(jù)Phonenum修改name 和sex 和address和 signature 和 isguide/// <summary>/// 根據(jù)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 判斷賬號是否為導(dǎo)游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;}#endregionpublic 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 用戶注冊:電話號碼、姓名、性別、密碼、是否為導(dǎo)游[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 判斷賬號是否為導(dǎo)游[WebMethod(Description = "判斷賬號是否為導(dǎo)游")]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="根據(jù)用戶修改密碼")]public bool ModifyUserPassword(string phonenum, string password){return new UserDAL().ModifyPassword(phonenum, password);}#endregion#region 修改個人信息[WebMethod(Description = "根據(jù)用戶修改性別和名字")]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 有待測試的 根據(jù)用戶名查找用戶信息[WebMethod(Description="有待測試的 根據(jù)用戶名查找用戶信息")]public string[] SelectUserById(string phonenum){return new UserDAL().SelectUserById(phonenum).ToArray();}#endregion
然后執(zhí)行程序會有如下界面
?
?
最后任務(wù)就是將這Webservice掛到本地IIS上,VS2013菜單欄→項目→項目屬性(最下方)→應(yīng)用程序。把輸出類型設(shè)置成類庫。然后在Web欄,找到選項服務(wù)器(默認在IIS Express發(fā)布),選擇本地IIS 添加虛擬目錄,(注意:要用管理員的身份運行VS2013)。如果在Internet 信息服務(wù)IIS管理器上中看到發(fā)布的網(wǎng)站,那么就成功了。電腦中沒有IIS的需要自己安裝。
最最后,在web.config中添加如下代碼段
<webServices>
? ? ? <protocols>
? ? ? ? <add name="HttpGet"/>
? ? ? ? <add name="HttpPost"/>
? ? ? </protocols>
? ? </webServices>
和
? <appSettings>
? ? <add key="vs:EnableBrowserLink" value="false"/>
? </appSettings>
清空系統(tǒng)自動添加的煩人的代碼。
看看現(xiàn)在可不可以連接到服務(wù)器。使用安卓手機,在同一個網(wǎng)絡(luò)下,可以開熱點。用手機打開如下網(wǎng)址
http://<你的本地IP> ? ? ?電腦IP可以在cmd中輸入ipconfig 查詢。
如果訪問成功會有一個IIS的頁面
接下來訪問webservice,就是項目調(diào)試時的網(wǎng)址。例如:
http://localhost/TourismWeb/TourismService.asmx,在手機中訪問時要把localhost改為本地ip
?
有什么不足望指正....
總結(jié)
以上是生活随笔為你收集整理的android通过webservice连接SQL数据库(一)服务器端的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 题目整理(计网)
- 下一篇: android通过webservice连