從零開始完成一個三層架構案例-2(步驟01)

步驟01


2.操作步驟

在開始之前,要確保 Visual Studio 和 SQL Server Management Studio 已經安裝成功,並且SQL服務已經打開了。

2.1 建庫、建表

將下圖中的名字複製下來。後面的步驟中會用到。(DESKTOP-ADKCETM)

image.png

image.png

Y_strong
image.png

image.png

根據題目要求建立表結構。(注意這裏並沒有按照題目要求的設置性別字段的數據類型爲Char(4),而是設置爲了Char(2),因爲一箇中文佔2位)image.png

然後將Oid設置爲主鍵,並將其設置爲自動增加。
image.png
(注意下圖中的Char(4)爲未修改之前,應該爲Char(2),不要被下圖混淆了,我給上錯了圖。。。)
image.png

2.2 添加測試數據

設置好表的結構後,就點擊下圖中的刷新按鈕,然後再去選擇編輯前200行。
image.png

image.png

隨便添加幾條測試數據。
這裏先統一一下規則,就是姓名只能2-4箇中文,性別只能男或者女,電話是11位數字,後面的三個字段都是1-3位數字。會在B層進行邏輯判斷的時候,主要對描述的這些規則進行驗證。 
image.png

2.3 在VS中創建項目

選擇ASP.NET Web應用程序  (YYYDemo   P_ULayer)
image.png

點擊確定image.png

現在是這個樣子
image.png

在解決方案上右鍵—添加—新建項目。image.png

選擇類庫項目。   (P_BLayer)image.png

同樣的步驟,再新建一個類庫項目。(P_DLayer)
現在的解決方案是下圖所示的情況。
image.png

2.4 添加引用

在P_ULayer項目中添加對P_BLayer項目的引用,在P_BLayer項目中添加對P_DLayer項目的引用。

U中添加對B的引用:
image.png
image.png

B中添加對D的引用:
image.png

image.png

現在是這個樣子:
image.png

修改程序集名稱和默認命名空間名稱 
image.png

image.png

同樣的方法,修改B層和D層項目的這兩個屬性,都是修改爲 YYYDemo.XXX
image.png

image.png

2.5 添加類和頁面

①:B中添加類:
image.png

BLayer
image.png

②:同樣的方法,在D中添加一個類(DLayer)
③:在U層項目中,添加一個.aspx web窗體和一個.master母版頁
③-1:添加web窗體
image.png

ShowAll
image.png

③-2:添加母版頁
image.png


Site
image.png




完成上述操作,現在的結構應該是這樣的:
image.png

2.6 建立VS與SSMS的連接

image.png

image.png

image.png

現在將 “2.1 建庫、建表” 步驟中的名字拿過來
image.png

可以看到,連接已經建立。
image.png

image.png

把下圖的連接字符串複製下來 
Data Source=DESKTOP-ADKCETM;Initial Catalog=Y_strong;Integrated Security=True
image.png

2.7 實現顯示功能

①:修改D_Layer.cs的代碼,把 “2.6 步驟”  中的連接字符串拿過來。
紅框爲新增或修改的代碼,後續的步驟中也是同樣的意思。
image.png

image.png

代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;

namespace YYYDemo.P_DLayer
{
    public class DLayer
    {
        //創建數據庫連接
        private SqlConnection CreateConnection()
        {
            return new SqlConnection(
                "Data Source=DESKTOP-ADKCETM;Initial Catalog=Y_strong;Integrated Security=True"
                );
        }

        //關閉連接
        public void D_CloseConn()
        {
            CreateConnection().Close();
        }

        //獲取全部的賬戶信息,以DataSet數據類型返回
        public DataSet GetAllAccount_TO_DataSet()
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                "SELECT * FROM owner", conn
                );
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            return dSet;
        }
    }
}

②:修改B_Layer的代碼
image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using YYYDemo.P_DLayer;
using System.Data;
using System.Text.RegularExpressions;//正則表達式
using System.Runtime.InteropServices;//爲了實現一個彈窗


namespace YYYDemo.P_BLayer
{
    public class BLayer
    {
        //提示框,這兩行照着寫上即可,不必理解原理,會使用就行
        [DllImport("User32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern int MessageBox(IntPtr handle, String message, String title, int type);

        public DataSet GetAllAccount_TO_DataSet()
        {
            return new DLayer().GetAllAccount_TO_DataSet();
        }

        public void B_CloseConn()
        {
            new DLayer().D_CloseConn();
        }
    }
}

③-1:修改U層ShowAll頁面
image.png

然後到設計界面去修改GridView。
image.png

這個數據字段很關鍵,是跟數據表中的字段一一對應的,所以需要跟數據表中的字段的名稱一樣。
頁眉文本就是顯示在界面上的文本。
image.png

同樣的方法,添加如下幾列:
image.png

對應的GridView的代碼如下:image.png
(那個SortExpression屬性可以刪掉,因爲我們並不使用它實現任何功能。)

截止到現在ShowAll.aspx的代碼

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ShowAll.aspx.cs" Inherits="P_ULayer.ShowAll" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>小區業主列表</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            
            <div id="Div_lbl_Topic">
                <asp:Label runat="server" ID="lbl_Topic" Text="小 區 業 主 列 表"></asp:Label>
            </div>
            
            <asp:GridView ID="gView" runat="server"
                AllowPaging="True"
                AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField DataField="Name" HeaderText="姓名" SortExpression="Name" />
                    <asp:BoundField DataField="Sex" HeaderText="性別" />
                    <asp:BoundField DataField="Phone" HeaderText="聯繫電話" SortExpression="Phone" />
                    <asp:BoundField DataField="BuildNum" HeaderText="樓號" SortExpression="BuildNum" />
                    <asp:BoundField DataField="Unit" HeaderText="單元" SortExpression="Unit" />
                    <asp:BoundField DataField="RoomNum" HeaderText="房間號" SortExpression="RoomNum" />
                </Columns>
            </asp:GridView>
        </div>
    </form>
</body>
</html>

編寫ShowAll.aspx.cs的代碼
image.png

image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using YYYDemo.P_BLayer;

namespace P_ULayer
{
    public partial class ShowAll : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.gView.DataSource = new BLayer().GetAllAccount_TO_DataSet();
            this.gView.DataBind();
            new BLayer().B_CloseConn();
        }
    }
}

運行測試:( 一定要讓VS當前活動窗口爲ShowAll.aspx或者是****ShowAll.aspx.cs纔可以摁下F5運行
image.png
可以看到已經能夠正常顯示出數據表的信息了。

2.8 新建內容頁,並編輯母版頁和內容頁以及ShowAll頁的UI

①:編寫Site.Master
image.png
隱藏起來的table內容可以直接查看下面的代碼。

image.png

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="P_ULayer.Site" %>

<!DOCTYPE html>

<html>
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <div id="Div_hLink_TO_01">
                <asp:HyperLink ID="hLink_TO_ShowAll" runat="server" NavigateUrl="~/ShowAll.aspx" Target="_self" Text="返回主頁"></asp:HyperLink>
            </div>
            

            <asp:ContentPlaceHolder ID="ContentPlaceHolder_DivLabel" runat="server">
            </asp:ContentPlaceHolder>

            <br />
            <br />

            <table id="tableUI">
                <tr>
                    <td style="width: 48%" class="td_Left">
                        <asp:Label ID="lbl_Name" runat="server" Text="姓名:"></asp:Label>
                    </td>
                    <td style="width: 50%">
                        <asp:TextBox ID="textBox_Name" runat="server" Font-Size="16pt"></asp:TextBox>
                    </td>
                </tr>
                <tr>
                    <td class="td_Left">
                        <asp:Label ID="lbl_Sex" runat="server" Text="性別:"></asp:Label>
                    </td>
                    <td>
                        <asp:RadioButton ID="radioBtn_Boy" runat="server" GroupName="Sex" Text="男" Checked="True" />
                        <asp:RadioButton ID="radioBtn_Girl" runat="server" GroupName="Sex" Text="女" />
                    </td>
                </tr>
                <tr>
                    <td class="td_Left">
                        <asp:Label ID="lbl_Phone" runat="server" Text="聯繫電話:"></asp:Label>
                    </td>
                    <td>
                        <asp:TextBox ID="textBox_Phone" runat="server" Font-Size="16pt"></asp:TextBox>
                    </td>
                </tr>
                <tr>
                    <td class="td_Left">
                        <asp:Label ID="lbl_BuildNum" runat="server" Text="樓號:"></asp:Label>
                    </td>
                    <td>
                        <asp:TextBox ID="textBox_BuildNum" runat="server" Font-Size="16pt"></asp:TextBox>
                    </td>
                </tr>
                <tr>
                    <td class="td_Left">
                        <asp:Label ID="lbl_Unit" runat="server" Text="單元:"></asp:Label>
                    </td>
                    <td>
                        <asp:TextBox ID="textBox_Unit" runat="server" Font-Size="16pt"></asp:TextBox>
                    </td>
                </tr>
                <tr>
                    <td class="td_Left">
                        <asp:Label ID="lbl_RoomNum" runat="server" Text="房間號:"></asp:Label>
                    </td>
                    <td>
                        <asp:TextBox ID="textBox_RoomNum" runat="server" Font-Size="16pt"></asp:TextBox>
                    </td>
                </tr>
            </table>

            <br />
            <br />
            
            <asp:ContentPlaceHolder ID="ContentPlaceHolder_DivButton" runat="server">
            </asp:ContentPlaceHolder>
        </div>
    </form>
</body>
</html>

②:添加內容頁:
image.png
可以看到新建的內容頁爲下圖所示:
image.png

同樣的方法,再新建一個內容頁,然後修改兩個內容頁的名字,具體效果如下:
image.png

③:編輯內容頁的代碼
③-1:編輯後的AddAccount內容頁:image.png

在設計界面,雙擊Button,爲其添加一個點擊事件。
image.png
下圖這個函數是雙擊後自動創建的image.png

回到AddAccount這個內容頁的.aspx中,可以看到:
image.png
自動多了一個這個屬性。

截止到目前,AddAccount.aspx內容頁的代碼如下:

<%@ Page Title="新增業主" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="AddAccount.aspx.cs" Inherits="YYYDemo.P_ULayer.WebForm1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder_DivLabel" runat="server">
    <div id="Div_lbl_Topic">
        <asp:Label ID="lbl_Topic" runat="server" Text="新 增 業 主"></asp:Label>
    </div>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder_DivButton" runat="server">
    <div id="Div_btnSubmit">
        <asp:Button ID="btnSubmit" runat="server" class="CSS_class_btnSubmit" Text="提交" OnClick="btnSubmit_Click"/>
    </div>
</asp:Content>

③-2:跟③-1同樣的 步驟,去修改AlterAccount內容頁的代碼。
image.png

image.png

image.png

截止到目前,AlterAccount.aspx的代碼:

<%@ Page Title="修改業主" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="AlterAccount.aspx.cs" Inherits="YYYDemo.P_ULayer.WebForm2" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder_DivLabel" runat="server">
    <div id="Div_lbl_Topic">
        <asp:Label ID="lbl_Topic" runat="server" Text="修 改 業 主"></asp:Label>
    </div>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder_DivButton" runat="server">
    <div id="Div_btnSubmit">
        <asp:Button ID="btnSubmit" runat="server" Text="提交" class="CSS_class_btnSubmit" OnClick="btnSubmit_Click" />
    </div>
</asp:Content>

④:爲ShowAll頁面新加一個鏈接控件
image.png

image.png

截止到目前,ShowAll頁面的代碼:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ShowAll.aspx.cs" Inherits="P_ULayer.ShowAll" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>小區業主列表</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            
            <div id="Div_lbl_Topic">
                <asp:Label runat="server" ID="lbl_Topic" Text="小 區 業 主 列 表"></asp:Label>
            </div>
            
            <div>
                <br /><br />
                <asp:HyperLink Target="_self" NavigateUrl="~/AddAccount.aspx" runat="server" ID="hLink_AddAccount" Text="新增業主"></asp:HyperLink>
                <br /><br /><br /><br />
            </div>

            <asp:GridView ID="gView" runat="server"
                AllowPaging="True"
                AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField DataField="Name" HeaderText="姓名" SortExpression="Name" />
                    <asp:BoundField DataField="Sex" HeaderText="性別" />
                    <asp:BoundField DataField="Phone" HeaderText="聯繫電話" SortExpression="Phone" />
                    <asp:BoundField DataField="BuildNum" HeaderText="樓號" SortExpression="BuildNum" />
                    <asp:BoundField DataField="Unit" HeaderText="單元" SortExpression="Unit" />
                    <asp:BoundField DataField="RoomNum" HeaderText="房間號" SortExpression="RoomNum" />
                </Columns>
            </asp:GridView>
        </div>
    </form>
</body>
</html>

運行測試:
image.png
image.png

可以正常的進入到新增業主界面和返回主頁。

2.9 實現新增業主功能

先修改DLayer的代碼
image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;

namespace YYYDemo.P_DLayer
{
    public class DLayer
    {
        //創建數據庫連接
        private SqlConnection CreateConnection()
        {
            return new SqlConnection(
                "Data Source=DESKTOP-ADKCETM;Initial Catalog=Y_strong;Integrated Security=True"
                );
        }

        //關閉連接
        public void D_CloseConn()
        {
            CreateConnection().Close();
        }

        //獲取全部的賬戶信息,以DataSet數據類型返回
        public DataSet GetAllAccount_TO_DataSet()
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                "SELECT * FROM owner", conn
                );
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            return dSet;
        }
        
        //添加一個賬戶
        public void AddAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format(
                "INSERT INTO owner(name,sex,phone,buildnum,unit,roomnum) " +
                "VALUES(N'{0}','{1}',N'{2}',N'{3}',N'{4}',N'{5}')"
                , name, sex, phone, buildNum, unit, roomNum),
                conn
                );
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
    }
}

再修改BLayer的代碼
image.png

image.png

image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using YYYDemo.P_DLayer;
using System.Data;
using System.Text.RegularExpressions;//正則表達式
using System.Runtime.InteropServices;//爲了實現一個彈窗


namespace YYYDemo.P_BLayer
{
    public class BLayer
    {
        //提示框,這兩行照着寫上即可,不必理解原理,會使用就行
        [DllImport("User32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern int MessageBox(IntPtr handle, String message, String title, int type);

        public DataSet GetAllAccount_TO_DataSet()
        {
            return new DLayer().GetAllAccount_TO_DataSet();
        }

        public void B_CloseConn()
        {
            new DLayer().D_CloseConn();
        }


        string errorStr = "";//這個也可以設置成局部變量,只不過讓RegularCheck_Add(Update)_TO_Bool函數多傳遞一個參數而已。
        //添加賬戶時正則表達式對輸入數據的驗證
        private bool RegularCheck_Add_TO_Bool(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            errorStr = "";
            bool flag = true;
            string rStr_Name = "^[\u4e00-\u9fa5]{2,4}$";//2-4箇中文
            string rStr_Phone = @"^\d{11}$";//11位數字
            string rStr_BuildNum_Unit_RoomNum = @"^\d{1,3}$";//1-3位數字

            if (!Regex.IsMatch(name, rStr_Name))
            {
                errorStr += "姓名應爲2-4個漢字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(phone, rStr_Phone))
            {
                errorStr += "號碼應爲11位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(buildNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "樓號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(unit, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "單元號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(roomNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "房間號應爲1-3位數字!\n";
                flag = false;
            }

            DataTable table = GetAllAccount_TO_DataSet().Tables[0];

            bool equal_Phone = false;
            bool equal_Position = false;

            for (int i = 0; i < table.Rows.Count; i++)
            {

                if (phone == table.Rows[i][3].ToString())
                    equal_Phone = true;

                if (
                    buildNum == table.Rows[i][4].ToString() &&
                    unit == table.Rows[i][5].ToString() &&
                    roomNum == table.Rows[i][6].ToString()
                    )
                    equal_Position = true;
            }
            if (equal_Phone)
            {
                errorStr += "聯繫電話不能重複!\n";
                flag = false;
            }
            if (equal_Position)
            {
                errorStr += "住房位置不能重複!\n";
                flag = false;
            }

            B_CloseConn();
            return flag;
        }

        //添加一個賬戶
        public string AddAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            if (RegularCheck_Add_TO_Bool(name, sex, phone, buildNum, unit, roomNum))
            {
                errorStr = "新增業主信息成功!";
                new DLayer().AddAnAccount(name, sex, phone, buildNum, unit, roomNum);
            }
            else
                errorStr += "\n新增業主信息失敗!";
            return errorStr;
        }
    }
}

修改AddAccount.aspx.cs文件
image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using YYYDemo.P_BLayer;

namespace YYYDemo.P_ULayer
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            char sex = '男';
            if ((Master.FindControl("radioBtn_Girl") as RadioButton).Checked)
                sex = '女';


            string message = new BLayer().AddAnAccount(
                        (Master.FindControl("textBox_Name") as TextBox).Text.ToString(),
                        sex,
                        (Master.FindControl("textBox_Phone") as TextBox).Text.ToString(),
                        (Master.FindControl("textBox_BuildNum") as TextBox).Text.ToString(),
                        (Master.FindControl("textBox_Unit") as TextBox).Text.ToString(),
                        (Master.FindControl("textBox_RoomNum") as TextBox).Text.ToString()
                        );
            BLayer.MessageBox(IntPtr.Zero, message, "提示!", 0);
        }
    }
}

  1. Master.FindControl(“IDName”) 
    這個代碼的意思是通過id尋找在母版頁上的控件
  2. BLayer.MessageBox(IntPtr.Zero, message, “提示!”, 0); 
    第二個參數(string 類型)表示的是提示框顯示的文本,第三個參數(string 類型)是提示框左上角的文本,第四個參數(int 類型)是按鈕的個數,0就是一個確定按鈕,1就是一個確定按鈕、一個取消按鈕(後面在刪除功能上用到)。

運行測試:
輸入正確數據的時候:
image.png

輸入錯誤數據的時候:image.png

可以看到已經可以正常的進行驗證與添加,添加成功後去SQLserver上看一下表的數據,發現已經添加上了。
image.png

2.10 實現修改業主信息功能

先修改DLayer的代碼
image.png

image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;

namespace YYYDemo.P_DLayer
{
    public class DLayer
    {
        //創建數據庫連接
        private SqlConnection CreateConnection()
        {
            return new SqlConnection(
                "Data Source=DESKTOP-ADKCETM;Initial Catalog=Y_strong;Integrated Security=True"
                );
        }

        //關閉連接
        public void D_CloseConn()
        {
            CreateConnection().Close();
        }

        //獲取全部的賬戶信息,以DataSet數據類型返回
        public DataSet GetAllAccount_TO_DataSet()
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                "SELECT * FROM owner", conn
                );
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            return dSet;
        }
        
        //添加一個賬戶
        public void AddAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format(
                "INSERT INTO owner(name,sex,phone,buildnum,unit,roomnum) " +
                "VALUES(N'{0}','{1}',N'{2}',N'{3}',N'{4}',N'{5}')"
                , name, sex, phone, buildNum, unit, roomNum),
                conn
                );
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }

        //通過手機號獲得一個賬戶的信息,以DataSet數據類型返回;
        //這個函數是爲了在B層通過手機號獲取賬戶的id
        public DataSet GetAnAccountByPhone_TO_DataSet(string phone)
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                string.Format("SELECT * FROM owner WHERE phone=N'{0}'", phone),
                conn);
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            return dSet;
        }

        //通過id獲得一個賬戶的信息,以DataSet數據類型返回
        public DataSet GetAnAccountByIndex_TO_DataSet(int index)
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                string.Format("SELECT * FROM owner WHERE Oid={0}", index),
                conn);
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            return dSet;
        }


        //修改一行信息
        public void UpdateAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum, int index)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format(
                    "UPDATE owner SET name=N'{0}',sex='{1}',phone=N'{2}',buildnum=N'{3}',unit=N'{4}',roomnum=N'{5}' " +
                    "WHERE Oid={6}; ", name, sex, phone, buildNum, unit, roomNum, index),
                conn
                );
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
    }
}

修改BLayer的代碼
image.png

image.png

image.png

image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using YYYDemo.P_DLayer;
using System.Data;
using System.Text.RegularExpressions;//正則表達式
using System.Runtime.InteropServices;//爲了實現一個彈窗


namespace YYYDemo.P_BLayer
{
    public class BLayer
    {
        //提示框,這兩行照着寫上即可,不必理解原理,會使用就行
        [DllImport("User32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern int MessageBox(IntPtr handle, String message, String title, int type);

        public DataSet GetAllAccount_TO_DataSet()
        {
            return new DLayer().GetAllAccount_TO_DataSet();
        }

        public void B_CloseConn()
        {
            new DLayer().D_CloseConn();
        }


        string errorStr = "";//這個也可以設置成局部變量,只不過讓RegularCheck_Add(Update)_TO_Bool函數多傳遞一個參數而已。
        //添加賬戶時正則表達式對輸入數據的驗證
        private bool RegularCheck_Add_TO_Bool(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            errorStr = "";
            bool flag = true;
            string rStr_Name = "^[\u4e00-\u9fa5]{2,4}$";//2-4箇中文
            string rStr_Phone = @"^\d{11}$";//11位數字
            string rStr_BuildNum_Unit_RoomNum = @"^\d{1,3}$";//1-3位數字

            if (!Regex.IsMatch(name, rStr_Name))
            {
                errorStr += "姓名應爲2-4個漢字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(phone, rStr_Phone))
            {
                errorStr += "號碼應爲11位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(buildNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "樓號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(unit, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "單元號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(roomNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "房間號應爲1-3位數字!\n";
                flag = false;
            }

            DataTable table = GetAllAccount_TO_DataSet().Tables[0];

            bool equal_Phone = false;
            bool equal_Position = false;

            for (int i = 0; i < table.Rows.Count; i++)
            {

                if (phone == table.Rows[i][3].ToString())
                    equal_Phone = true;

                if (
                    buildNum == table.Rows[i][4].ToString() &&
                    unit == table.Rows[i][5].ToString() &&
                    roomNum == table.Rows[i][6].ToString()
                    )
                    equal_Position = true;
            }
            if (equal_Phone)
            {
                errorStr += "聯繫電話不能重複!\n";
                flag = false;
            }
            if (equal_Position)
            {
                errorStr += "住房位置不能重複!\n";
                flag = false;
            }

            B_CloseConn();
            return flag;
        }

        //添加一個賬戶
        public string AddAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            if (RegularCheck_Add_TO_Bool(name, sex, phone, buildNum, unit, roomNum))
            {
                errorStr = "新增業主信息成功!";
                new DLayer().AddAnAccount(name, sex, phone, buildNum, unit, roomNum);
            }
            else
                errorStr += "\n新增業主信息失敗!";
            return errorStr;
        }
        
        
        //通過手機號獲取該行數據的索引,爲下面的GetAnAccountByIndex_TO_DataSet()函數提供作用
        public int GetIndexByPhone_TO_Int(string phone)
        {
            return Convert.ToInt32(
                new DLayer().GetAnAccountByPhone_TO_DataSet(phone).Tables[0].Rows[0][0].ToString());
        }

        //通過索引獲取該行數據的全部信息,以DataSet數據類型返回
        public DataSet GetAnAccountByIndex_TO_DataSet(int index)
        {
            return new DLayer().GetAnAccountByIndex_TO_DataSet(index);
        }

        //修改一個賬戶的信息
        public string UpdateAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum, int index)
        {
            if (RegularCheck_Update_TO_Bool(name, sex, phone, buildNum, unit, roomNum, index))
            {
                errorStr = "修改業主信息成功!";
                new DLayer().UpdateAnAccount(name, sex, phone, buildNum, unit, roomNum, index);
            }
            else
                errorStr += "\n修改業主信息失敗!";
            return errorStr;
        }



        //修改賬戶時正則表達式對輸入數據的驗證
        //修改個人信息,需要驗證 手機號 和 住房位置 是否 *跟別人* 重複;還需驗證數據是否合理
        private bool RegularCheck_Update_TO_Bool(string name, char sex, string phone, string buildNum, string unit, string roomNum, int index)
        {
            errorStr = "";
            bool flag = true;
            string rStr_Name = "^[\u4e00-\u9fa5]{2,4}$";
            string rStr_Phone = @"^\d{11}$";
            string rStr_BuildNum_Unit_RoomNum = @"^\d{1,3}$";

            if (!Regex.IsMatch(name, rStr_Name))
            {
                errorStr += "姓名應爲2-4個漢字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(phone, rStr_Phone))
            {
                errorStr += "號碼應爲11位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(buildNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "樓號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(unit, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "單元號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(roomNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "房間號應爲1-3位數字!\n";
                flag = false;
            }

            DataTable table = GetAllAccount_TO_DataSet().Tables[0];

            bool equal_Phone = false;
            bool equal_Position = false;

            for (int i = 0; i < table.Rows.Count; i++)
            {
                if (Convert.ToInt32(table.Rows[i][0].ToString())
                    != index)
                {
                    if (phone == table.Rows[i][3].ToString())
                        equal_Phone = true;

                    if (
                        buildNum == table.Rows[i][4].ToString() &&
                        unit == table.Rows[i][5].ToString() &&
                        roomNum == table.Rows[i][6].ToString()
                        )
                        equal_Position = true;
                }

            }
            if (equal_Phone)
            {
                errorStr += "聯繫電話不能重複!\n";
                flag = false;
            }
            if (equal_Position)
            {
                errorStr += "住房位置不能重複!\n";
                flag = false;
            }

            B_CloseConn();
            return flag;
        }

    }
}

修改ShowAll頁面的GridView控件的事件,雙擊下圖這兩個事件處,讓其自動添加兩個方法。
image.png

image.png

image.png

爲GridView添加兩列ButtonField列。
image.png

image.png

可以看到這一列已經出來了。
繼續編輯列。
image.png

將 修改 這一列的CommandName修改爲Y_Update
image.png

可以在ShowALl.aspx頁面的源碼上看到如下圖所示的代碼:
image.png

截止目前,ShowAll.aspx的代碼:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ShowAll.aspx.cs" Inherits="P_ULayer.ShowAll" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>小區業主列表</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            
            <div id="Div_lbl_Topic">
                <asp:Label runat="server" ID="lbl_Topic" Text="小 區 業 主 列 表"></asp:Label>
            </div>
            
            <div>
                <br /><br />
                <asp:HyperLink Target="_self" NavigateUrl="~/AddAccount.aspx" runat="server" ID="hLink_AddAccount" Text="新增業主"></asp:HyperLink>
                <br /><br /><br /><br />
            </div>

            <asp:GridView ID="gView" runat="server"
                AllowPaging="True"
                AutoGenerateColumns="False" OnPageIndexChanging="gView_PageIndexChanging" OnRowCommand="gView_RowCommand">
                <Columns>
                    <asp:BoundField DataField="Name" HeaderText="姓名" SortExpression="Name" />
                    <asp:BoundField DataField="Sex" HeaderText="性別" />
                    <asp:BoundField DataField="Phone" HeaderText="聯繫電話" SortExpression="Phone" />
                    <asp:BoundField DataField="BuildNum" HeaderText="樓號" SortExpression="BuildNum" />
                    <asp:BoundField DataField="Unit" HeaderText="單元" SortExpression="Unit" />
                    <asp:BoundField DataField="RoomNum" HeaderText="房間號" SortExpression="RoomNum" />
                    <asp:ButtonField CommandName="Y_Update" HeaderText="操作" ShowHeader="True" Text="修改" />
                </Columns>
            </asp:GridView>
        </div>
    </form>
</body>
</html>

繼續修改ShowAll.aspx.cs的代碼,在ShowAll頁面上實現換頁功能和跳轉到AlterAccount頁面的功能。
image.png

截止目前,ShowAll.aspx.cs的代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using YYYDemo.P_BLayer;

namespace P_ULayer
{
    public partial class ShowAll : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.gView.DataSource = new BLayer().GetAllAccount_TO_DataSet();
            this.gView.DataBind();
            new BLayer().B_CloseConn();
        }

        protected void gView_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Y_Update" || e.CommandName == "Y_Delete")
            {
                //獲取 操作列 或者 刪除列 點擊的是GridView的哪一行
                int gViewSelect_Index = Convert.ToInt32(e.CommandArgument);
                //將點擊的這一行的手機號(因爲手機號不可重複)的業主的Oid字段的值傳給 全局變量 Application["Index"] 
                Application["Index"] = new BLayer().GetIndexByPhone_TO_Int(
                    this.gView.Rows[gViewSelect_Index].Cells[2].Text.ToString()
                    );

                //這個代碼塊也就是實現了 : 點擊的哪一行 ---> 手機號 ---> Oid ---> Application["Index"]
            }

            if (e.CommandName == "Y_Update")
                Response.Redirect("AlterAccount.aspx");

            if (e.CommandName == "Y_Delete")
            {
                //TODO
            }

            new BLayer().B_CloseConn();
        }

        protected void gView_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.gView.PageIndex = e.NewPageIndex;
            gView.DataBind();
        }
    }
}

修改AlterAccount.cs的代碼:
image.png

image.png

運行測試:
image.png

image.png

沒問題

2.11 實現刪除業主信息功能

DLayer
image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;

namespace YYYDemo.P_DLayer
{
    public class DLayer
    {
        //創建數據庫連接
        private SqlConnection CreateConnection()
        {
            return new SqlConnection(
                "Data Source=DESKTOP-ADKCETM;Initial Catalog=Y_strong;Integrated Security=True"
                );
        }

        //關閉連接
        public void D_CloseConn()
        {
            CreateConnection().Close();
        }

        //獲取全部的賬戶信息,以DataSet數據類型返回
        public DataSet GetAllAccount_TO_DataSet()
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                "SELECT * FROM owner", conn
                );
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            return dSet;
        }
        
        //添加一個賬戶
        public void AddAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format(
                "INSERT INTO owner(name,sex,phone,buildnum,unit,roomnum) " +
                "VALUES(N'{0}','{1}',N'{2}',N'{3}',N'{4}',N'{5}')"
                , name, sex, phone, buildNum, unit, roomNum),
                conn
                );
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }

        //通過手機號獲得一個賬戶的信息,以DataSet數據類型返回;
        //這個函數是爲了在B層通過手機號獲取賬戶的id
        public DataSet GetAnAccountByPhone_TO_DataSet(string phone)
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                string.Format("SELECT * FROM owner WHERE phone=N'{0}'", phone),
                conn);
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            return dSet;
        }

        //通過id獲得一個賬戶的信息,以DataSet數據類型返回
        public DataSet GetAnAccountByIndex_TO_DataSet(int index)
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                string.Format("SELECT * FROM owner WHERE Oid={0}", index),
                conn);
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            return dSet;
        }


        //修改一行信息
        public void UpdateAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum, int index)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format(
                    "UPDATE owner SET name=N'{0}',sex='{1}',phone=N'{2}',buildnum=N'{3}',unit=N'{4}',roomnum=N'{5}' " +
                    "WHERE Oid={6}; ", name, sex, phone, buildNum, unit, roomNum, index),
                conn
                );
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }

        //刪除一行信息
        public void DeleteAnAccount(int index)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format("DELETE FROM owner WHERE Oid = {0}", index),
                conn);
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
    }
}

BLayer
image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using YYYDemo.P_DLayer;
using System.Data;
using System.Text.RegularExpressions;//正則表達式
using System.Runtime.InteropServices;//爲了實現一個彈窗


namespace YYYDemo.P_BLayer
{
    public class BLayer
    {
        //提示框,這兩行照着寫上即可,不必理解原理,會使用就行
        [DllImport("User32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern int MessageBox(IntPtr handle, String message, String title, int type);

        public DataSet GetAllAccount_TO_DataSet()
        {
            return new DLayer().GetAllAccount_TO_DataSet();
        }

        public void B_CloseConn()
        {
            new DLayer().D_CloseConn();
        }


        string errorStr = "";//這個也可以設置成局部變量,只不過讓RegularCheck_Add(Update)_TO_Bool函數多傳遞一個參數而已。
        //添加賬戶時正則表達式對輸入數據的驗證
        private bool RegularCheck_Add_TO_Bool(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            errorStr = "";
            bool flag = true;
            string rStr_Name = "^[\u4e00-\u9fa5]{2,4}$";//2-4箇中文
            string rStr_Phone = @"^\d{11}$";//11位數字
            string rStr_BuildNum_Unit_RoomNum = @"^\d{1,3}$";//1-3位數字

            if (!Regex.IsMatch(name, rStr_Name))
            {
                errorStr += "姓名應爲2-4個漢字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(phone, rStr_Phone))
            {
                errorStr += "號碼應爲11位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(buildNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "樓號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(unit, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "單元號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(roomNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "房間號應爲1-3位數字!\n";
                flag = false;
            }

            DataTable table = GetAllAccount_TO_DataSet().Tables[0];

            bool equal_Phone = false;
            bool equal_Position = false;

            for (int i = 0; i < table.Rows.Count; i++)
            {

                if (phone == table.Rows[i][3].ToString())
                    equal_Phone = true;

                if (
                    buildNum == table.Rows[i][4].ToString() &&
                    unit == table.Rows[i][5].ToString() &&
                    roomNum == table.Rows[i][6].ToString()
                    )
                    equal_Position = true;
            }
            if (equal_Phone)
            {
                errorStr += "聯繫電話不能重複!\n";
                flag = false;
            }
            if (equal_Position)
            {
                errorStr += "住房位置不能重複!\n";
                flag = false;
            }

            B_CloseConn();
            return flag;
        }

        //添加一個賬戶
        public string AddAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            if (RegularCheck_Add_TO_Bool(name, sex, phone, buildNum, unit, roomNum))
            {
                errorStr = "新增業主信息成功!";
                new DLayer().AddAnAccount(name, sex, phone, buildNum, unit, roomNum);
            }
            else
                errorStr += "\n新增業主信息失敗!";
            return errorStr;
        }
        
        
        //通過手機號獲取該行數據的索引,爲下面的GetAnAccountByIndex_TO_DataSet()函數提供作用
        public int GetIndexByPhone_TO_Int(string phone)
        {
            return Convert.ToInt32(
                new DLayer().GetAnAccountByPhone_TO_DataSet(phone).Tables[0].Rows[0][0].ToString());
        }

        //通過索引獲取該行數據的全部信息,以DataSet數據類型返回
        public DataSet GetAnAccountByIndex_TO_DataSet(int index)
        {
            return new DLayer().GetAnAccountByIndex_TO_DataSet(index);
        }

        //修改一個賬戶的信息
        public string UpdateAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum, int index)
        {
            if (RegularCheck_Update_TO_Bool(name, sex, phone, buildNum, unit, roomNum, index))
            {
                errorStr = "修改業主信息成功!";
                new DLayer().UpdateAnAccount(name, sex, phone, buildNum, unit, roomNum, index);
            }
            else
                errorStr += "\n修改業主信息失敗!";
            return errorStr;
        }



        //修改賬戶時正則表達式對輸入數據的驗證
        //修改個人信息,需要驗證 手機號 和 住房位置 是否 *跟別人* 重複;還需驗證數據是否合理
        private bool RegularCheck_Update_TO_Bool(string name, char sex, string phone, string buildNum, string unit, string roomNum, int index)
        {
            errorStr = "";
            bool flag = true;
            string rStr_Name = "^[\u4e00-\u9fa5]{2,4}$";
            string rStr_Phone = @"^\d{11}$";
            string rStr_BuildNum_Unit_RoomNum = @"^\d{1,3}$";

            if (!Regex.IsMatch(name, rStr_Name))
            {
                errorStr += "姓名應爲2-4個漢字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(phone, rStr_Phone))
            {
                errorStr += "號碼應爲11位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(buildNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "樓號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(unit, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "單元號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(roomNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "房間號應爲1-3位數字!\n";
                flag = false;
            }

            DataTable table = GetAllAccount_TO_DataSet().Tables[0];

            bool equal_Phone = false;
            bool equal_Position = false;

            for (int i = 0; i < table.Rows.Count; i++)
            {
                if (Convert.ToInt32(table.Rows[i][0].ToString())
                    != index)
                {
                    if (phone == table.Rows[i][3].ToString())
                        equal_Phone = true;

                    if (
                        buildNum == table.Rows[i][4].ToString() &&
                        unit == table.Rows[i][5].ToString() &&
                        roomNum == table.Rows[i][6].ToString()
                        )
                        equal_Position = true;
                }

            }
            if (equal_Phone)
            {
                errorStr += "聯繫電話不能重複!\n";
                flag = false;
            }
            if (equal_Position)
            {
                errorStr += "住房位置不能重複!\n";
                flag = false;
            }

            B_CloseConn();
            return flag;
        }

        //刪除一個賬戶
        public string DeleteAnAccount(int index)
        {
            errorStr = "刪除業主信息成功!";
            new DLayer().DeleteAnAccount(index);
            return errorStr;
        }

    }
}

ShowAll.aspx
image.png

image.png

image.png

image.png

image.png

image.png

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ShowAll.aspx.cs" Inherits="P_ULayer.ShowAll" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>小區業主列表</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            
            <div id="Div_lbl_Topic">
                <asp:Label runat="server" ID="lbl_Topic" Text="小 區 業 主 列 表"></asp:Label>
            </div>
            
            <div>
                <br /><br />
                <asp:HyperLink Target="_self" NavigateUrl="~/AddAccount.aspx" runat="server" ID="hLink_AddAccount" Text="新增業主"></asp:HyperLink>
                <br /><br /><br /><br />
            </div>

            <asp:GridView ID="gView" runat="server"
                AllowPaging="True"
                AutoGenerateColumns="False" OnPageIndexChanging="gView_PageIndexChanging" OnRowCommand="gView_RowCommand">
                <Columns>
                    <asp:BoundField DataField="Name" HeaderText="姓名" SortExpression="Name" />
                    <asp:BoundField DataField="Sex" HeaderText="性別" />
                    <asp:BoundField DataField="Phone" HeaderText="聯繫電話" SortExpression="Phone" />
                    <asp:BoundField DataField="BuildNum" HeaderText="樓號" SortExpression="BuildNum" />
                    <asp:BoundField DataField="Unit" HeaderText="單元" SortExpression="Unit" />
                    <asp:BoundField DataField="RoomNum" HeaderText="房間號" SortExpression="RoomNum" />
                    <asp:ButtonField CommandName="Y_Update" HeaderText="操作" ShowHeader="True" Text="修改" />
                    <asp:ButtonField CommandName="Y_Delete" HeaderText="操作" ShowHeader="True" Text="刪除" />
                </Columns>
            </asp:GridView>
        </div>
    </form>
</body>
</html>

修改ShowAll.aspx.cs的代碼
image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using YYYDemo.P_BLayer;

namespace P_ULayer
{
    public partial class ShowAll : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.gView.DataSource = new BLayer().GetAllAccount_TO_DataSet();
            this.gView.DataBind();
            new BLayer().B_CloseConn();
        }

        protected void gView_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Y_Update" || e.CommandName == "Y_Delete")
            {
                //獲取 操作列 或者 刪除列 點擊的是GridView的哪一行
                int gViewSelect_Index = Convert.ToInt32(e.CommandArgument);
                //將點擊的這一行的手機號(因爲手機號不可重複)的業主的Oid字段的值傳給 全局變量 Application["Index"] 
                Application["Index"] = new BLayer().GetIndexByPhone_TO_Int(
                    this.gView.Rows[gViewSelect_Index].Cells[2].Text.ToString()
                    );

                //這個代碼塊也就是實現了 : 點擊的哪一行 ---> 手機號 ---> Oid ---> Application["Index"]
            }

            if (e.CommandName == "Y_Update")
                Response.Redirect("AlterAccount.aspx");

            if (e.CommandName == "Y_Delete")
            {
                if (BtnDelete() == 1)
                {
                    new BLayer().DeleteAnAccount(Convert.ToInt32(Application["Index"]));
                    Response.Redirect("ShowAll.aspx");
                }
            }

            new BLayer().B_CloseConn();
        }

        protected void gView_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.gView.PageIndex = e.NewPageIndex;
            gView.DataBind();
        }
        private int BtnDelete()
        {
            return BLayer.MessageBox(IntPtr.Zero, "確定要刪除這條數據嗎?", "警告!", 1);
        }
    }
}

運行測試:
我這裏先隨便添加了多條數據:
image.png

可以看到,換頁功能正常:
image.png

image.png

下面進行進行刪除操作:
image.png

image.png

正常


分割線一

截止到現在,已經完成了SQLserver數據庫上的增刪改查,樣式表我還沒怎麼添加,好像只是給修改和刪除頁面的TextBox添加了一個字體大小爲16pt的樣式。
接下來的部分我會添加樣式表和樣式,並且完成連接MySQL的操作。
可能還會添加實體類和對不同數據庫的支持,主題和皮膚功能也在預定之列吧。或許還會添加一個頭像。

以上內容完成後的當前時間:2019年5月22日00:32:39


2.12 添加實體類,替代DataSet傳遞數據

新建一個Entity類庫項目
image.png

image.png

修改Entity項目的程序集名稱和默認命名空間名稱
image.png

並添加一個Owner類
image.png

編輯Owner.cs的代碼
image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace YYYDemo.Entity
{
    public class Owner
    {
        private int oid;
        private string name;
        private char sex;
        private string phone;
        private string buildNum;
        private string unit;
        private string roomNum;
        public int Oid
        {
            set { oid = value; }
            get { return oid; }
        }
        public string Name
        {
            set { name = value; }
            get { return name; }
        }
        public char Sex
        {
            set { sex = value; }
            get { return sex; }
        }
        public string Phone
        {
            set { phone = value; }
            get { return phone; }
        }
        public string BuildNum
        {
            set { buildNum = value; }
            get { return buildNum; }
        }
        public string Unit
        {
            set { unit = value; }
            get { return unit; }
        }
        public string RoomNum
        {
            set { roomNum = value; }
            get { return roomNum; }
        }
    }
}

添加引用,添加完後應該是下圖所示的情況:
image.png


 
修改D層的P_DLayer項目的DLayer類
image.png

修改B層的P_BLayer項目的BLayer類
image.png

修改U層的P_ULayer項目的ShowAll.aspx.cs
image.png

修改U層的P_ULayer項目的AlterAccount.aspx.cs 的代碼
image.png

運行測試,發現沒問題。


2.13 目前的代碼

1. 未刪減多餘代碼時:

DLayer.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;
using YYYDemo.Entity;

namespace YYYDemo.P_DLayer
{
    public class DLayer
    {
        //創建數據庫連接
        private SqlConnection CreateConnection()
        {
            return new SqlConnection(
                "Data Source=DESKTOP-ADKCETM;Initial Catalog=Y_strong;Integrated Security=True"
                );
        }

        //關閉連接
        public void D_CloseConn()
        {
            CreateConnection().Close();
        }

        //獲取全部的賬戶信息,以DataSet數據類型返回
        public DataSet GetAllAccount_TO_DataSet()
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                "SELECT * FROM owner", conn
                );
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            return dSet;
        }
        public IList<Owner> GetAllAccount()
        {
            List<Owner> owners = new List<Owner>();

            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                "SELECT * FROM owner", conn
                );
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            for (int i = 0; i < dSet.Tables[0].Rows.Count; i++)
            {
                Owner owner = new Owner();
                owner.Oid = Convert.ToInt32(dSet.Tables[0].Rows[i][0].ToString());
                owner.Name = dSet.Tables[0].Rows[i][1].ToString();
                owner.Sex = Convert.ToChar(dSet.Tables[0].Rows[i][2].ToString());
                owner.Phone = dSet.Tables[0].Rows[i][3].ToString();
                owner.BuildNum = dSet.Tables[0].Rows[i][4].ToString();
                owner.Unit = dSet.Tables[0].Rows[i][5].ToString();
                owner.RoomNum = dSet.Tables[0].Rows[i][6].ToString();
                owners.Add(owner);
            }
            conn.Close();
            return owners;
        }

        //添加一個賬戶
        public void AddAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format(
                "INSERT INTO owner(name,sex,phone,buildnum,unit,roomnum) " +
                "VALUES(N'{0}','{1}',N'{2}',N'{3}',N'{4}',N'{5}')"
                , name, sex, phone, buildNum, unit, roomNum),
                conn
                );
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
        

        //通過手機號獲得一個賬戶的信息,以DataSet數據類型返回;
        //這個函數是爲了在B層通過手機號獲取賬戶的id
        public DataSet GetAnAccountByPhone_TO_DataSet(string phone)
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                string.Format("SELECT * FROM owner WHERE phone=N'{0}'", phone),
                conn);
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            return dSet;
        }
        public Owner GetAnAccountByPhone_TO_Owner(string phone)
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                string.Format("SELECT * FROM owner WHERE phone=N'{0}'", phone),
                conn);
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");

            Owner owner = new Owner();
            owner.Oid = Convert.ToInt32(dSet.Tables[0].Rows[0][0].ToString());
            owner.Name = dSet.Tables[0].Rows[0][1].ToString();
            owner.Sex = Convert.ToChar(dSet.Tables[0].Rows[0][2].ToString());
            owner.Phone = dSet.Tables[0].Rows[0][3].ToString();
            owner.BuildNum = dSet.Tables[0].Rows[0][4].ToString();
            owner.Unit = dSet.Tables[0].Rows[0][5].ToString();
            owner.RoomNum = dSet.Tables[0].Rows[0][6].ToString();
            conn.Close();
            return owner;
        }

        //通過id獲得一個賬戶的信息,以DataSet數據類型返回
        public DataSet GetAnAccountByIndex_TO_DataSet(int index)
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                string.Format("SELECT * FROM owner WHERE Oid={0}", index),
                conn);
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            return dSet;
        }
        public Owner GetAnAccountByIndex_TO_Owner(int index)
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                string.Format("SELECT * FROM owner WHERE Oid={0}", index),
                conn);
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");

            Owner owner = new Owner();
            owner.Oid = Convert.ToInt32(dSet.Tables[0].Rows[0][0].ToString());
            owner.Name = dSet.Tables[0].Rows[0][1].ToString();
            owner.Sex = Convert.ToChar(dSet.Tables[0].Rows[0][2].ToString());
            owner.Phone = dSet.Tables[0].Rows[0][3].ToString();
            owner.BuildNum = dSet.Tables[0].Rows[0][4].ToString();
            owner.Unit = dSet.Tables[0].Rows[0][5].ToString();
            owner.RoomNum = dSet.Tables[0].Rows[0][6].ToString();
            conn.Close();
            return owner;
        }


        //修改一行信息
        public void UpdateAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum, int index)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format(
                    "UPDATE owner SET name=N'{0}',sex='{1}',phone=N'{2}',buildnum=N'{3}',unit=N'{4}',roomnum=N'{5}' " +
                    "WHERE Oid={6}; ", name, sex, phone, buildNum, unit, roomNum, index),
                conn
                );
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
        

        //刪除一行信息
        public void DeleteAnAccount(int index)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format("DELETE FROM owner WHERE Oid = {0}", index),
                conn);
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
    }
}

BLayer:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using YYYDemo.P_DLayer;
using System.Data;
using System.Text.RegularExpressions;//正則表達式
using System.Runtime.InteropServices;//爲了實現一個彈窗
using YYYDemo.Entity;

namespace YYYDemo.P_BLayer
{
    public class BLayer
    {
        //提示框,這兩行照着寫上即可,不必理解原理,會使用就行
        [DllImport("User32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern int MessageBox(IntPtr handle, String message, String title, int type);

        public DataSet GetAllAccount_TO_DataSet()
        {
            return new DLayer().GetAllAccount_TO_DataSet();
        }
        public IList<Owner> GetAllAccount()
        {
            return new DLayer().GetAllAccount();
        }

        public void B_CloseConn()
        {
            new DLayer().D_CloseConn();
        }


        string errorStr = "";//這個也可以設置成局部變量,只不過讓RegularCheck_Add(Update)_TO_Bool函數多傳遞一個參數而已。
        //添加賬戶時正則表達式對輸入數據的驗證
        private bool RegularCheck_Add_TO_Bool(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            errorStr = "";
            bool flag = true;
            string rStr_Name = "^[\u4e00-\u9fa5]{2,4}$";//2-4箇中文
            string rStr_Phone = @"^\d{11}$";//11位數字
            string rStr_BuildNum_Unit_RoomNum = @"^\d{1,3}$";//1-3位數字

            if (!Regex.IsMatch(name, rStr_Name))
            {
                errorStr += "姓名應爲2-4個漢字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(phone, rStr_Phone))
            {
                errorStr += "號碼應爲11位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(buildNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "樓號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(unit, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "單元號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(roomNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "房間號應爲1-3位數字!\n";
                flag = false;
            }

            var owners = GetAllAccount();

            bool equal_Phone = false;
            bool equal_Position = false;

            for (int i = 0; i < owners.Count; i++)
            {

                if (phone == owners[i].Phone)
                    equal_Phone = true;

                if (
                    buildNum == owners[i].BuildNum &&
                    unit == owners[i].Unit &&
                    roomNum == owners[i].RoomNum
                    )
                    equal_Position = true;
            }
            if (equal_Phone)
            {
                errorStr += "聯繫電話不能重複!\n";
                flag = false;
            }
            if (equal_Position)
            {
                errorStr += "住房位置不能重複!\n";
                flag = false;
            }
            
            return flag;
        }
        
        //添加一個賬戶
        public string AddAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            if (RegularCheck_Add_TO_Bool(name, sex, phone, buildNum, unit, roomNum))
            {
                errorStr = "新增業主信息成功!";
                new DLayer().AddAnAccount(name, sex, phone, buildNum, unit, roomNum);
            }
            else
                errorStr += "\n新增業主信息失敗!";
            return errorStr;
        }
        
        //通過手機號獲取該行數據的索引,在U層中爲下面的GetAnAccountByIndex_TO_DataSet()函數提供作用
        public int GetIndexByPhone_TO_Int(string phone)
        {
            return Convert.ToInt32(
                new DLayer().GetAnAccountByPhone_TO_Owner(phone).Oid);
            //return Convert.ToInt32(
                //new DLayer().GetAnAccountByPhone_TO_DataSet(phone).Tables[0].Rows[0][0].ToString());
        }
        
        //通過索引獲取該行數據的全部信息,以DataSet數據類型返回
        public DataSet GetAnAccountByIndex_TO_DataSet(int index)
        {
            return new DLayer().GetAnAccountByIndex_TO_DataSet(index);
        }
        public Owner GetAnAccountBydIndex_TO_Owner(int index)
        {
            return new DLayer().GetAnAccountByIndex_TO_Owner(index);
        }
        
        //修改一個賬戶的信息
        public string UpdateAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum, int index)
        {
            if (RegularCheck_Update_TO_Bool(name, sex, phone, buildNum, unit, roomNum, index))
            {
                errorStr = "修改業主信息成功!";
                new DLayer().UpdateAnAccount(name, sex, phone, buildNum, unit, roomNum, index);
            }
            else
                errorStr += "\n修改業主信息失敗!";
            return errorStr;
        }
        //修改賬戶時正則表達式對輸入數據的驗證
        //修改個人信息,需要驗證 手機號 和 住房位置 是否 *跟別人* 重複;還需驗證數據是否合理
        private bool RegularCheck_Update_TO_Bool(string name, char sex, string phone, string buildNum, string unit, string roomNum, int index)
        {
            errorStr = "";
            bool flag = true;
            string rStr_Name = "^[\u4e00-\u9fa5]{2,4}$";
            string rStr_Phone = @"^\d{11}$";
            string rStr_BuildNum_Unit_RoomNum = @"^\d{1,3}$";

            if (!Regex.IsMatch(name, rStr_Name))
            {
                errorStr += "姓名應爲2-4個漢字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(phone, rStr_Phone))
            {
                errorStr += "號碼應爲11位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(buildNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "樓號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(unit, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "單元號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(roomNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "房間號應爲1-3位數字!\n";
                flag = false;
            }
            
            var owners = GetAllAccount();

            bool equal_Phone = false;
            bool equal_Position = false;

            for (int i = 0; i < owners.Count; i++)
            {
                if (owners[i].Oid != index)
                {
                    if (phone == owners[i].Phone)
                        equal_Phone = true;

                    if (
                        buildNum == owners[i].BuildNum &&
                        unit == owners[i].Unit &&
                        roomNum == owners[i].RoomNum
                        )
                        equal_Position = true;
                }

            }
            if (equal_Phone)
            {
                errorStr += "聯繫電話不能重複!\n";
                flag = false;
            }
            if (equal_Position)
            {
                errorStr += "住房位置不能重複!\n";
                flag = false;
            }
            
            return flag;
        }
        
        //刪除一個賬戶
        public string DeleteAnAccount(int index)
        {
            errorStr = "刪除業主信息成功!";
            new DLayer().DeleteAnAccount(index);
            return errorStr;
        }

    }
}

ShowAll.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using YYYDemo.P_BLayer;

namespace P_ULayer
{
    public partial class ShowAll : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.gView.DataSource = new BLayer().GetAllAccount();
            this.gView.DataBind();
        }

        protected void gView_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Y_Update" || e.CommandName == "Y_Delete")
            {
                //獲取 操作列 或者 刪除列 點擊的是GridView的哪一行
                int gViewSelect_Index = Convert.ToInt32(e.CommandArgument);
                //將點擊的這一行的手機號(因爲手機號不可重複)的業主的Oid字段的值傳給 全局變量 Application["Index"] 
                Application["Index"] = new BLayer().GetIndexByPhone_TO_Int(
                    this.gView.Rows[gViewSelect_Index].Cells[2].Text.ToString()
                    );

                //這個代碼塊也就是實現了 : 點擊的哪一行 ---> 手機號 ---> Oid ---> Application["Index"]
            }

            if (e.CommandName == "Y_Update")
                Response.Redirect("AlterAccount.aspx");

            if (e.CommandName == "Y_Delete")
            {
                if (BtnDelete() == 1)
                {
                    new BLayer().DeleteAnAccount(Convert.ToInt32(Application["Index"]));
                    Response.Redirect("ShowAll.aspx");
                }
            }
        }

        protected void gView_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.gView.PageIndex = e.NewPageIndex;
            gView.DataBind();
        }
        private int BtnDelete()
        {
            return BLayer.MessageBox(IntPtr.Zero, "確定要刪除這條數據嗎?", "警告!", 1);
        }
    }
}

Alteraccount.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

//using System.Data;
using YYYDemo.P_BLayer;
using YYYDemo.Entity;

namespace YYYDemo.P_ULayer
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //這裏若不加此判斷,則每次點擊未修改成功的按鈕後,頁面都會重傳,然後恢復一開始的值,不會保存修改的值
            if (!IsPostBack)
            {
                Owner owner = new BLayer().GetAnAccountBydIndex_TO_Owner(Convert.ToInt32(Application["Index"]));
               
                (Master.FindControl("textBox_Name") as TextBox).Text = owner.Name;
                if (owner.Sex == '男')
                    (Master.FindControl("radioBtn_Boy") as RadioButton).Checked = true;
                if (owner.Sex == '女')
                    (Master.FindControl("radioBtn_Girl") as RadioButton).Checked = true;
                (Master.FindControl("textBox_Phone") as TextBox).Text = owner.Phone;
                (Master.FindControl("textBox_BuildNum") as TextBox).Text = owner.BuildNum;
                (Master.FindControl("textBox_Unit") as TextBox).Text = owner.Unit;
                (Master.FindControl("textBox_RoomNum") as TextBox).Text = owner.RoomNum;
                
            }
        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            char sex = '男';
            if ((Master.FindControl("radioBtn_Girl") as RadioButton).Checked)
                sex = '女';


            string message = new BLayer().UpdateAnAccount(
                        (Master.FindControl("textBox_Name") as TextBox).Text.ToString(),
                        sex,
                        (Master.FindControl("textBox_Phone") as TextBox).Text.ToString(),
                        (Master.FindControl("textBox_BuildNum") as TextBox).Text.ToString(),
                        (Master.FindControl("textBox_Unit") as TextBox).Text.ToString(),
                        (Master.FindControl("textBox_RoomNum") as TextBox).Text.ToString(),
                        Convert.ToInt32(Application["index"])
                        );
            BLayer.MessageBox(IntPtr.Zero, message, "提示!", 0);
        }
    }
}

2. 刪減多餘代碼後:

DLayer.cs
image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;
using YYYDemo.Entity;

namespace YYYDemo.P_DLayer
{
    public class DLayer
    {
        //創建數據庫連接
        private SqlConnection CreateConnection()
        {
            return new SqlConnection(
                "Data Source=DESKTOP-ADKCETM;Initial Catalog=Y_strong;Integrated Security=True"
                );
        }
        //獲取全部的賬戶信息,以Owner實體類類型返回
        public IList<Owner> GetAllAccount()
        {
            List<Owner> owners = new List<Owner>();

            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                "SELECT * FROM owner", conn
                );
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            for (int i = 0; i < dSet.Tables[0].Rows.Count; i++)
            {
                Owner owner = new Owner();
                owner.Oid = Convert.ToInt32(dSet.Tables[0].Rows[i][0].ToString());
                owner.Name = dSet.Tables[0].Rows[i][1].ToString();
                owner.Sex = Convert.ToChar(dSet.Tables[0].Rows[i][2].ToString());
                owner.Phone = dSet.Tables[0].Rows[i][3].ToString();
                owner.BuildNum = dSet.Tables[0].Rows[i][4].ToString();
                owner.Unit = dSet.Tables[0].Rows[i][5].ToString();
                owner.RoomNum = dSet.Tables[0].Rows[i][6].ToString();
                owners.Add(owner);
            }
            conn.Close();
            return owners;
        }
        //添加一個賬戶
        public void AddAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format(
                "INSERT INTO owner(name,sex,phone,buildnum,unit,roomnum) " +
                "VALUES(N'{0}','{1}',N'{2}',N'{3}',N'{4}',N'{5}')"
                , name, sex, phone, buildNum, unit, roomNum),
                conn
                );
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
        //通過手機號獲得一個賬戶的信息,以Owner實體類類型返回;
        //這個函數是爲了在B層通過手機號獲取賬戶的id
        public Owner GetAnAccountByPhone_TO_Owner(string phone)
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                string.Format("SELECT * FROM owner WHERE phone=N'{0}'", phone),
                conn);
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");

            Owner owner = new Owner();
            owner.Oid = Convert.ToInt32(dSet.Tables[0].Rows[0][0].ToString());
            owner.Name = dSet.Tables[0].Rows[0][1].ToString();
            owner.Sex = Convert.ToChar(dSet.Tables[0].Rows[0][2].ToString());
            owner.Phone = dSet.Tables[0].Rows[0][3].ToString();
            owner.BuildNum = dSet.Tables[0].Rows[0][4].ToString();
            owner.Unit = dSet.Tables[0].Rows[0][5].ToString();
            owner.RoomNum = dSet.Tables[0].Rows[0][6].ToString();
            conn.Close();
            return owner;
        }
        //通過id獲得一個賬戶的信息,以Owner實體類類型返回
        public Owner GetAnAccountByIndex_TO_Owner(int index)
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                string.Format("SELECT * FROM owner WHERE Oid={0}", index),
                conn);
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");

            Owner owner = new Owner();
            owner.Oid = Convert.ToInt32(dSet.Tables[0].Rows[0][0].ToString());
            owner.Name = dSet.Tables[0].Rows[0][1].ToString();
            owner.Sex = Convert.ToChar(dSet.Tables[0].Rows[0][2].ToString());
            owner.Phone = dSet.Tables[0].Rows[0][3].ToString();
            owner.BuildNum = dSet.Tables[0].Rows[0][4].ToString();
            owner.Unit = dSet.Tables[0].Rows[0][5].ToString();
            owner.RoomNum = dSet.Tables[0].Rows[0][6].ToString();
            conn.Close();
            return owner;
        }
        //修改一行信息
        public void UpdateAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum, int index)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format(
                    "UPDATE owner SET name=N'{0}',sex='{1}',phone=N'{2}',buildnum=N'{3}',unit=N'{4}',roomnum=N'{5}' " +
                    "WHERE Oid={6}; ", name, sex, phone, buildNum, unit, roomNum, index),
                conn
                );
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
        //刪除一行信息
        public void DeleteAnAccount(int index)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format("DELETE FROM owner WHERE Oid = {0}", index),
                conn);
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
    }
}

BLayer.cs
image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using YYYDemo.P_DLayer;
using System.Text.RegularExpressions;//正則表達式
using System.Runtime.InteropServices;//爲了實現一個彈窗
using YYYDemo.Entity;

namespace YYYDemo.P_BLayer
{
    public class BLayer
    {
        //提示框,這兩行照着寫上即可,不必理解原理,會使用就行
        [DllImport("User32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern int MessageBox(IntPtr handle, String message, String title, int type);
        public IList<Owner> GetAllAccount()
        {
            return new DLayer().GetAllAccount();
        }
        string errorStr = "";//這個也可以設置成局部變量,只不過讓RegularCheck_Add(Update)_TO_Bool函數多傳遞一個參數而已。
        //添加賬戶時正則表達式對輸入數據的驗證
        private bool RegularCheck_Add_TO_Bool(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            errorStr = "";
            bool flag = true;
            string rStr_Name = "^[\u4e00-\u9fa5]{2,4}$";//2-4箇中文
            string rStr_Phone = @"^\d{11}$";//11位數字
            string rStr_BuildNum_Unit_RoomNum = @"^\d{1,3}$";//1-3位數字

            if (!Regex.IsMatch(name, rStr_Name))
            {
                errorStr += "姓名應爲2-4個漢字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(phone, rStr_Phone))
            {
                errorStr += "號碼應爲11位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(buildNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "樓號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(unit, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "單元號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(roomNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "房間號應爲1-3位數字!\n";
                flag = false;
            }

            var owners = GetAllAccount();

            bool equal_Phone = false;
            bool equal_Position = false;

            for (int i = 0; i < owners.Count; i++)
            {

                if (phone == owners[i].Phone)
                    equal_Phone = true;

                if (
                    buildNum == owners[i].BuildNum &&
                    unit == owners[i].Unit &&
                    roomNum == owners[i].RoomNum
                    )
                    equal_Position = true;
            }
            if (equal_Phone)
            {
                errorStr += "聯繫電話不能重複!\n";
                flag = false;
            }
            if (equal_Position)
            {
                errorStr += "住房位置不能重複!\n";
                flag = false;
            }
            
            return flag;
        }
        //添加一個賬戶
        public string AddAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum)
        {
            if (RegularCheck_Add_TO_Bool(name, sex, phone, buildNum, unit, roomNum))
            {
                errorStr = "新增業主信息成功!";
                new DLayer().AddAnAccount(name, sex, phone, buildNum, unit, roomNum);
            }
            else
                errorStr += "\n新增業主信息失敗!";
            return errorStr;
        }
        //通過手機號獲取該行數據的索引,在U層中爲下面的GetAnAccountByIndex_TO_DataSet()函數提供作用
        public int GetIndexByPhone_TO_Int(string phone)
        {
            return Convert.ToInt32(
                new DLayer().GetAnAccountByPhone_TO_Owner(phone).Oid);
        }
        //通過索引獲取該行數據的全部信息,以Owner實體類類型返回
        public Owner GetAnAccountBydIndex_TO_Owner(int index)
        {
            return new DLayer().GetAnAccountByIndex_TO_Owner(index);
        }
        //修改一個賬戶的信息
        public string UpdateAnAccount(string name, char sex, string phone, string buildNum, string unit, string roomNum, int index)
        {
            if (RegularCheck_Update_TO_Bool(name, sex, phone, buildNum, unit, roomNum, index))
            {
                errorStr = "修改業主信息成功!";
                new DLayer().UpdateAnAccount(name, sex, phone, buildNum, unit, roomNum, index);
            }
            else
                errorStr += "\n修改業主信息失敗!";
            return errorStr;
        }
        //修改賬戶時正則表達式對輸入數據的驗證
        //修改個人信息,需要驗證 手機號 和 住房位置 是否 *跟別人* 重複;還需驗證數據是否合理
        private bool RegularCheck_Update_TO_Bool(string name, char sex, string phone, string buildNum, string unit, string roomNum, int index)
        {
            errorStr = "";
            bool flag = true;
            string rStr_Name = "^[\u4e00-\u9fa5]{2,4}$";
            string rStr_Phone = @"^\d{11}$";
            string rStr_BuildNum_Unit_RoomNum = @"^\d{1,3}$";

            if (!Regex.IsMatch(name, rStr_Name))
            {
                errorStr += "姓名應爲2-4個漢字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(phone, rStr_Phone))
            {
                errorStr += "號碼應爲11位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(buildNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "樓號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(unit, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "單元號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(roomNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "房間號應爲1-3位數字!\n";
                flag = false;
            }
            
            var owners = GetAllAccount();

            bool equal_Phone = false;
            bool equal_Position = false;

            for (int i = 0; i < owners.Count; i++)
            {
                if (owners[i].Oid != index)
                {
                    if (phone == owners[i].Phone)
                        equal_Phone = true;

                    if (
                        buildNum == owners[i].BuildNum &&
                        unit == owners[i].Unit &&
                        roomNum == owners[i].RoomNum
                        )
                        equal_Position = true;
                }

            }
            if (equal_Phone)
            {
                errorStr += "聯繫電話不能重複!\n";
                flag = false;
            }
            if (equal_Position)
            {
                errorStr += "住房位置不能重複!\n";
                flag = false;
            }
            
            return flag;
        }
        //刪除一個賬戶
        public string DeleteAnAccount(int index)
        {
            errorStr = "刪除業主信息成功!";
            new DLayer().DeleteAnAccount(index);
            return errorStr;
        }

    }
}

ShowAll.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using YYYDemo.P_BLayer;

namespace P_ULayer
{
    public partial class ShowAll : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.gView.DataSource = new BLayer().GetAllAccount();
            this.gView.DataBind();
        }

        protected void gView_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Y_Update" || e.CommandName == "Y_Delete")
            {
                //獲取 操作列 或者 刪除列 點擊的是GridView的哪一行
                int gViewSelect_Index = Convert.ToInt32(e.CommandArgument);
                //將點擊的這一行的手機號(因爲手機號不可重複)的業主的Oid字段的值傳給 全局變量 Application["Index"] 
                Application["Index"] = new BLayer().GetIndexByPhone_TO_Int(
                    this.gView.Rows[gViewSelect_Index].Cells[2].Text.ToString()
                    );

                //這個代碼塊也就是實現了 : 點擊的哪一行 ---> 手機號 ---> Oid ---> Application["Index"]
            }

            if (e.CommandName == "Y_Update")
                Response.Redirect("AlterAccount.aspx");

            if (e.CommandName == "Y_Delete")
            {
                if (BtnDelete() == 1)
                {
                    new BLayer().DeleteAnAccount(Convert.ToInt32(Application["Index"]));
                    Response.Redirect("ShowAll.aspx");
                }
            }
        }

        protected void gView_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            this.gView.PageIndex = e.NewPageIndex;
            gView.DataBind();
        }
        private int BtnDelete()
        {
            return BLayer.MessageBox(IntPtr.Zero, "確定要刪除這條數據嗎?", "警告!", 1);
        }
    }
}

AlterAccount.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using YYYDemo.P_BLayer;
using YYYDemo.Entity;

namespace YYYDemo.P_ULayer
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //這裏若不加此判斷,則每次點擊未修改成功的按鈕後,頁面都會重傳,然後恢復一開始的值,不會保存修改的值
            if (!IsPostBack)
            {
                Owner owner = new BLayer().GetAnAccountBydIndex_TO_Owner(Convert.ToInt32(Application["Index"]));
               
                (Master.FindControl("textBox_Name") as TextBox).Text = owner.Name;
                if (owner.Sex == '男')
                    (Master.FindControl("radioBtn_Boy") as RadioButton).Checked = true;
                if (owner.Sex == '女')
                    (Master.FindControl("radioBtn_Girl") as RadioButton).Checked = true;
                (Master.FindControl("textBox_Phone") as TextBox).Text = owner.Phone;
                (Master.FindControl("textBox_BuildNum") as TextBox).Text = owner.BuildNum;
                (Master.FindControl("textBox_Unit") as TextBox).Text = owner.Unit;
                (Master.FindControl("textBox_RoomNum") as TextBox).Text = owner.RoomNum;
                
            }
        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            char sex = '男';
            if ((Master.FindControl("radioBtn_Girl") as RadioButton).Checked)
                sex = '女';


            string message = new BLayer().UpdateAnAccount(
                        (Master.FindControl("textBox_Name") as TextBox).Text.ToString(),
                        sex,
                        (Master.FindControl("textBox_Phone") as TextBox).Text.ToString(),
                        (Master.FindControl("textBox_BuildNum") as TextBox).Text.ToString(),
                        (Master.FindControl("textBox_Unit") as TextBox).Text.ToString(),
                        (Master.FindControl("textBox_RoomNum") as TextBox).Text.ToString(),
                        Convert.ToInt32(Application["index"])
                        );
            BLayer.MessageBox(IntPtr.Zero, message, "提示!", 0);
        }
    }
}

運行測試,都正常

注:

  1. 添加實體類後,修改DLayer的代碼,是將以DataSet爲返回值的函數作爲想要修改的函數去修改
  2. 修改完代碼後,要保證,除了在D層的DLayer代碼有 System.Data 的引用後,其餘各層均沒有

把多餘的Class1刪掉,現在的結構是下圖所示:
image.png


在不適用實體類的時候,GridView的列的DataField的值必須對應數據表中的字段的名稱,若數據表的結構修改,則程序會報錯。
現在使用上了實體類之後,U層的GridView 的列的DataField 的值是對應了實體類的屬性名稱,這裏雖然沒變,是因爲我在設計實體類的時候,寫實體類的屬性名稱是仿照着數據表的字段名稱來的,所以這裏的DataField的值雖然沒變,但是其實是已經映射到了實體類的屬性名稱上,而不是數據表的字段名稱上。
也就是說,比如我將實體類的Name屬性的名稱修改爲MMMM,然後在DLayer和AlterAccount頁面上用到該實體類的Name屬性的地方全部修改爲MMMM,最後將ShowAll頁面的GridView的某一列的DataField屬性的值設置爲MMMM,則程序正常運行。
image.png

2.14 繼續修改代碼,將D層的新增和修改函數的形參修改爲Owner實體類對象

D層項目:
將一連串的形參修改爲了一個Owner類型的形參
image.png

image.png

B層項目:
image.png

image.png

image.png

同樣的,修改B層的AlterAccount函數,也是需要像AddAccount函數一樣去改變形參。
接下來就不上圖了,直接放B層和D層目前的代碼。

B層BLayer:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using YYYDemo.P_DLayer;
using System.Text.RegularExpressions;//正則表達式
using System.Runtime.InteropServices;//爲了實現一個彈窗
using YYYDemo.Entity;

namespace YYYDemo.P_BLayer
{
    public class BLayer
    {
        //提示框,這兩行照着寫上即可,不必理解原理,會使用就行
        [DllImport("User32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern int MessageBox(IntPtr handle, String message, String title, int type);
        public IList<Owner> GetAllAccount()
        {
            return new DLayer().GetAllAccount();
        }
        string errorStr = "";//這個也可以設置成局部變量,只不過讓RegularCheck_Add(Update)_TO_Bool函數多傳遞一個參數而已。
        //添加賬戶時正則表達式對輸入數據的驗證
        private bool RegularCheck_Add_TO_Bool(Owner _owner)
        {
            errorStr = "";
            bool flag = true;
            string rStr_Name = "^[\u4e00-\u9fa5]{2,4}$";//2-4箇中文
            string rStr_Phone = @"^\d{11}$";//11位數字
            string rStr_BuildNum_Unit_RoomNum = @"^\d{1,3}$";//1-3位數字

            if (!Regex.IsMatch(_owner.Name, rStr_Name))
            {
                errorStr += "姓名應爲2-4個漢字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(_owner.Phone, rStr_Phone))
            {
                errorStr += "號碼應爲11位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(_owner.BuildNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "樓號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(_owner.Unit, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "單元號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(_owner.RoomNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "房間號應爲1-3位數字!\n";
                flag = false;
            }

            var owners = GetAllAccount();

            bool equal_Phone = false;
            bool equal_Position = false;

            for (int i = 0; i < owners.Count; i++)
            {

                if (_owner.Phone == owners[i].Phone)
                    equal_Phone = true;

                if (
                    _owner.BuildNum == owners[i].BuildNum &&
                    _owner.Unit == owners[i].Unit &&
                    _owner.RoomNum == owners[i].RoomNum
                    )
                    equal_Position = true;
            }
            if (equal_Phone)
            {
                errorStr += "聯繫電話不能重複!\n";
                flag = false;
            }
            if (equal_Position)
            {
                errorStr += "住房位置不能重複!\n";
                flag = false;
            }
            
            return flag;
        }
        //添加一個賬戶
        public string AddAnAccount(Owner owner)
        {
            if (RegularCheck_Add_TO_Bool(owner))
            {
                errorStr = "新增業主信息成功!";
                new DLayer().AddAnAccount(owner);
            }
            else
                errorStr += "\n新增業主信息失敗!";
            return errorStr;
        }
        //通過手機號獲取該行數據的索引,在U層中爲下面的GetAnAccountByIndex_TO_DataSet()函數提供作用
        public int GetIndexByPhone_TO_Int(string phone)
        {
            return Convert.ToInt32(
                new DLayer().GetAnAccountByPhone_TO_Owner(phone).Oid);
        }
        //通過索引獲取該行數據的全部信息,以Owner實體類類型返回
        public Owner GetAnAccountBydIndex_TO_Owner(int index)
        {
            return new DLayer().GetAnAccountByIndex_TO_Owner(index);
        }
        //修改賬戶時正則表達式對輸入數據的驗證
        //修改個人信息,需要驗證 手機號 和 住房位置 是否 *跟別人* 重複;還需驗證數據是否合理
        private bool RegularCheck_Update_TO_Bool(Owner _owner)
        {
            errorStr = "";
            bool flag = true;
            string rStr_Name = "^[\u4e00-\u9fa5]{2,4}$";
            string rStr_Phone = @"^\d{11}$";
            string rStr_BuildNum_Unit_RoomNum = @"^\d{1,3}$";

            if (!Regex.IsMatch(_owner.Name, rStr_Name))
            {
                errorStr += "姓名應爲2-4個漢字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(_owner.Phone, rStr_Phone))
            {
                errorStr += "號碼應爲11位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(_owner.BuildNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "樓號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(_owner.Unit, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "單元號應爲1-3位數字!\n";
                flag = false;
            }
            if (!Regex.IsMatch(_owner.RoomNum, rStr_BuildNum_Unit_RoomNum))
            {
                errorStr += "房間號應爲1-3位數字!\n";
                flag = false;
            }
            
            var owners = GetAllAccount();

            bool equal_Phone = false;
            bool equal_Position = false;

            for (int i = 0; i < owners.Count; i++)
            {
                if (owners[i].Oid != _owner.Oid)
                {
                    if (_owner.Phone == owners[i].Phone)
                        equal_Phone = true;

                    if (
                        _owner.BuildNum == owners[i].BuildNum &&
                        _owner.Unit == owners[i].Unit &&
                        _owner.RoomNum == owners[i].RoomNum
                        )
                        equal_Position = true;
                }

            }
            if (equal_Phone)
            {
                errorStr += "聯繫電話不能重複!\n";
                flag = false;
            }
            if (equal_Position)
            {
                errorStr += "住房位置不能重複!\n";
                flag = false;
            }
            
            return flag;
        }
        //修改一個賬戶的信息
        public string UpdateAnAccount(Owner owner)
        {
            if (RegularCheck_Update_TO_Bool(owner))
            {
                errorStr = "修改業主信息成功!";
                new DLayer().UpdateAnAccount(owner);
            }
            else
                errorStr += "\n修改業主信息失敗!";
            return errorStr;
        }
        //刪除一個賬戶
        public string DeleteAnAccount(int index)
        {
            errorStr = "刪除業主信息成功!";
            new DLayer().DeleteAnAccount(index);
            return errorStr;
        }

    }
}

D層DLayer:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;
using YYYDemo.Entity;

namespace YYYDemo.P_DLayer
{
    public class DLayer
    {
        //創建數據庫連接
        private SqlConnection CreateConnection()
        {
            return new SqlConnection(
                "Data Source=DESKTOP-ADKCETM;Initial Catalog=Y_strong;Integrated Security=True"
                );
        }
        //獲取全部的賬戶信息,以Owner實體類類型返回
        public IList<Owner> GetAllAccount()
        {
            List<Owner> owners = new List<Owner>();

            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                "SELECT * FROM owner", conn
                );
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");
            for (int i = 0; i < dSet.Tables[0].Rows.Count; i++)
            {
                Owner owner = new Owner();
                owner.Oid = Convert.ToInt32(dSet.Tables[0].Rows[i][0].ToString());
                owner.Name = dSet.Tables[0].Rows[i][1].ToString();
                owner.Sex = Convert.ToChar(dSet.Tables[0].Rows[i][2].ToString());
                owner.Phone = dSet.Tables[0].Rows[i][3].ToString();
                owner.BuildNum = dSet.Tables[0].Rows[i][4].ToString();
                owner.Unit = dSet.Tables[0].Rows[i][5].ToString();
                owner.RoomNum = dSet.Tables[0].Rows[i][6].ToString();
                owners.Add(owner);
            }
            conn.Close();
            return owners;
        }
        //添加一個賬戶
        public void AddAnAccount(Owner owner)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format(
                "INSERT INTO owner(name,sex,phone,buildnum,unit,roomnum) " +
                "VALUES(N'{0}','{1}',N'{2}',N'{3}',N'{4}',N'{5}')"
                , owner.Name, owner.Sex, owner.Phone, owner.BuildNum, owner.Unit, owner.RoomNum),
                conn
                );
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
        //通過手機號獲得一個賬戶的信息,以Owner實體類類型返回;
        //這個函數是爲了在B層通過手機號獲取賬戶的id
        public Owner GetAnAccountByPhone_TO_Owner(string phone)
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                string.Format("SELECT * FROM owner WHERE phone=N'{0}'", phone),
                conn);
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");

            Owner owner = new Owner();
            owner.Oid = Convert.ToInt32(dSet.Tables[0].Rows[0][0].ToString());
            owner.Name = dSet.Tables[0].Rows[0][1].ToString();
            owner.Sex = Convert.ToChar(dSet.Tables[0].Rows[0][2].ToString());
            owner.Phone = dSet.Tables[0].Rows[0][3].ToString();
            owner.BuildNum = dSet.Tables[0].Rows[0][4].ToString();
            owner.Unit = dSet.Tables[0].Rows[0][5].ToString();
            owner.RoomNum = dSet.Tables[0].Rows[0][6].ToString();
            conn.Close();
            return owner;
        }
        //通過id獲得一個賬戶的信息,以Owner實體類類型返回
        public Owner GetAnAccountByIndex_TO_Owner(int index)
        {
            SqlConnection conn = CreateConnection();
            conn.Open();
            SqlDataAdapter dAdp = new SqlDataAdapter(
                string.Format("SELECT * FROM owner WHERE Oid={0}", index),
                conn);
            DataSet dSet = new DataSet();
            dAdp.Fill(dSet, "owner");

            Owner owner = new Owner();
            owner.Oid = Convert.ToInt32(dSet.Tables[0].Rows[0][0].ToString());
            owner.Name = dSet.Tables[0].Rows[0][1].ToString();
            owner.Sex = Convert.ToChar(dSet.Tables[0].Rows[0][2].ToString());
            owner.Phone = dSet.Tables[0].Rows[0][3].ToString();
            owner.BuildNum = dSet.Tables[0].Rows[0][4].ToString();
            owner.Unit = dSet.Tables[0].Rows[0][5].ToString();
            owner.RoomNum = dSet.Tables[0].Rows[0][6].ToString();
            conn.Close();
            return owner;
        }
        //修改一行信息
        public void UpdateAnAccount(Owner owner)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format(
                    "UPDATE owner SET name=N'{0}',sex='{1}',phone=N'{2}',buildnum=N'{3}',unit=N'{4}',roomnum=N'{5}' " +
                    "WHERE Oid={6}; ", owner.Name, owner.Sex, owner.Phone, owner.BuildNum, owner.Unit, owner.RoomNum, owner.Oid),
                conn
                );
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
        //刪除一行信息
        public void DeleteAnAccount(int index)
        {
            SqlConnection conn = CreateConnection();
            SqlCommand cmd = new SqlCommand(
                string.Format("DELETE FROM owner WHERE Oid = {0}", index),
                conn);
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                conn.Close();
            }
        }
    }
}

修改U層的新增和修改部分的代碼:
image.png

image.png

AddAccount.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using YYYDemo.P_BLayer;
using YYYDemo.Entity;

namespace YYYDemo.P_ULayer
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            char sex = '男';
            if ((Master.FindControl("radioBtn_Girl") as RadioButton).Checked)
                sex = '女';

            Owner owner = new Owner();

            owner.Name = (Master.FindControl("textBox_Name") as TextBox).Text.ToString();
            owner.Sex = sex;
            owner.Phone = (Master.FindControl("textBox_Phone") as TextBox).Text.ToString();
            owner.BuildNum = (Master.FindControl("textBox_BuildNum") as TextBox).Text.ToString();
            owner.Unit = (Master.FindControl("textBox_Unit") as TextBox).Text.ToString();
            owner.RoomNum = (Master.FindControl("textBox_RoomNum") as TextBox).Text.ToString();

            string message = new BLayer().AddAnAccount(owner);
            BLayer.MessageBox(IntPtr.Zero, message, "提示!", 0);
        }
    }
}

AlterAccount.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using YYYDemo.P_BLayer;
using YYYDemo.Entity;

namespace YYYDemo.P_ULayer
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //這裏若不加此判斷,則每次點擊未修改成功的按鈕後,頁面都會重傳,然後恢復一開始的值,不會保存修改的值
            if (!IsPostBack)
            {
                Owner owner = new BLayer().GetAnAccountBydIndex_TO_Owner(Convert.ToInt32(Application["Index"]));
               
                (Master.FindControl("textBox_Name") as TextBox).Text = owner.Name;
                if (owner.Sex == '男')
                    (Master.FindControl("radioBtn_Boy") as RadioButton).Checked = true;
                if (owner.Sex == '女')
                    (Master.FindControl("radioBtn_Girl") as RadioButton).Checked = true;
                (Master.FindControl("textBox_Phone") as TextBox).Text = owner.Phone;
                (Master.FindControl("textBox_BuildNum") as TextBox).Text = owner.BuildNum;
                (Master.FindControl("textBox_Unit") as TextBox).Text = owner.Unit;
                (Master.FindControl("textBox_RoomNum") as TextBox).Text = owner.RoomNum;
                
            }
        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            char sex = '男';
            if ((Master.FindControl("radioBtn_Girl") as RadioButton).Checked)
                sex = '女';

            Owner owner = new Owner();

            owner.Oid = Convert.ToInt32(Application["index"]);
            owner.Name = (Master.FindControl("textBox_Name") as TextBox).Text.ToString();
            owner.Sex = sex;
            owner.Phone = (Master.FindControl("textBox_Phone") as TextBox).Text.ToString();
            owner.BuildNum = (Master.FindControl("textBox_BuildNum") as TextBox).Text.ToString();
            owner.Unit = (Master.FindControl("textBox_Unit") as TextBox).Text.ToString();
            owner.RoomNum = (Master.FindControl("textBox_RoomNum") as TextBox).Text.ToString();

            string message = new BLayer().UpdateAnAccount(owner);
            BLayer.MessageBox(IntPtr.Zero, message, "提示!", 0);
        }
    }
}

運行,測試功能,沒問題。


分割線二

到這裏已經實現實現了實體類。

2019年5月22日23:39:08


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