android通過webservice連接SQL數據庫(一)服務器端

作爲一個學生黨,參加了一個比賽,需要開發一個安卓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

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章