asp.net 建多個項目實現三層的實例——讀取一張表中的記錄條數

来源:https://www.cnblogs.com/CherishTheYouth/archive/2018/07/31/CherishTheYouth.html
-Advertisement-
Play Games

簡單的不能再簡單的.net三層實例,只適合剛接觸的菜鳥們看,大神就不要看了。 ...


  學習asp.net兩周,通過學習發現,.net和php之間的區別還是蠻大的,比php要複雜一些,開始學習的有些吃力,後來跟著傳智播客里的老師學習,漸漸的學到了一些東西。

  今天要記錄一下.net里的簡單的三層架構是如何實現的,希望通過一次次的博客記錄能加深自己對知識點的理解和記憶,當然,如果有幸能幫到某些和我一樣的同學,那也是非常榮幸和欣喜的,好了,閑言少敘,下麵開始記錄。

  三層架構我自己也不是很熟,只是大概的知道其工作原理,以及構建流程,這裡貼出傳智博客的老師講解的一張原理圖,然後就略過了,畢竟本人太菜,不敢誤導別人。

  如上圖所示,是一張三層結構工作原理圖,三層結構分為

UI(視圖層):人眼直接能看到的內容,如winform,website等;

Bll(業務邏輯層):處理與業務相關的邏輯;

Dal(數據訪問層):只負責接收業務邏輯層的調用,處理相關的資料庫CURD操作,只跟資料庫打交道,與UI層完全分離;

Common和Model:一些三層之外的文件,這些文件可以寫一些靜態類,實體類等東西,這裡面的內容三個類都可以調用;

  關於三層結構的原理只做簡單說明,想要詳細瞭解的同學,請自行百度,閱讀技術大牛們的博客,下麵對該三層實現的步驟做詳盡的說明。

第一步:創建UI,BLL,和DAL

1.打開ide ,VS20XX,(我這裡用的是最新版的VS2017),點擊文件 ==》 新建 ==》項目,如下圖所示:

 

 2.選擇其他項目類型下的VS'解決方案 ==》空白解決方案,命名,選擇保存路徑後點擊確定;

 

3.右擊解決方案 ==》點擊添加 ==》新建項目 ==》選擇 Windows窗體應用 ==》命名為UI(這裡我們以窗體作為顯示層,這裡也可以把website空網站作為顯示層,用起來都是一樣的);

 

4.右擊解決方案,添加新項目 ==》選擇新建  類庫(.net Framework),這裡不要選錯,因為選項里有三個類庫選項,我們應該選擇 後面 括弧裡帶 .net Framework 的類庫,選其他的會出錯,至於為什麼,我也不知道,見諒見諒哈。

 

 5.同樣的方法,新建Bll,建好之後,應該有如圖所示的幾個東西,

 

 第二步:所要完成的功能的說明:

在這裡我要完成的功能其實非常非常的簡單,就是查詢一張表,看裡面有多少條數據,然後返回數據的條數,大致是這樣的,我們有一個窗體窗體上有個按鍵,點擊這個按鍵(查看XXX表中的數據條數),彈出視窗,顯示:XXX表中有XX條數據。

這裡我要操作的是一個名為TbAreas的表,如圖所示:

 

 第三步:三層實現流程介紹

1.確定sql語句

為了保證資料庫操作語句不出錯誤,我先在資料庫中新建查詢,看能不能查到我要的結果,我用的資料庫是sqlserver,資料庫管理軟體是微軟的 MSMS,查詢結果如圖所示:

如圖所示可以看到,用該語句查詢出的結果是表中有54條數據,下麵我看一下是否有誤:

 

 由圖可知,無誤,故我們的語句確定為:sql = "select count(*) from TbAreas" ;

2.在數據訪問層編寫執行該sql語句的函數

首先給DAL里的Class1.cs重命名為:表名+Dal+.cs,這裡餓哦們命名為:TbAreasDal.cs;

需要我知道的是,三層里,每個表對應一個類,以後操作同一張表的所有函數都寫在同一個類中。

然後,開始編寫代碼了,在Dal里的TbAreasDal類中編寫如下方法:

代碼如下:

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

namespace Dal
{
    public class TbAreasDal
    {
        //在這裡編寫資料庫操作函數
        public int GetRecordCount()
        {
            //sql語句
            string    sql = "select count(*) from TbAreas";
            //調用SqlHelper里的方法執行查操作語句
            return     (int)SqlHelper.ExcuteScalar(sql,System.Data.CommandType.Text);
        }
    }
}

 

這個裡面的代碼就是這樣了,但是,很遺憾,這個代碼是錯誤的,貼上圖片給你看:

 

 因為我的代碼里沒有SqlHelper這個類。SqlHelper這個類是需要自己封裝的一個資料庫操作類,這個類怎麼封裝不是我今天要記錄的內容,以後有時間會記錄一下的。這個類我已經封裝過,直接複製到Dal項目下,如下圖所示:

先給代碼:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 封裝SqlHelper類
{
   public class SqlHelper
    {
        //定義一個連接字元串
        //readonly修飾的變數,只能在初始化的時候賦值,以及構造函數中賦值
        private static readonly string conStr = ConfigurationManager.ConnectionStrings["mssqlserver"].ConnectionString;

        //1.執行增(insert)刪(delete)改(update)的方法 ExecuteNonQuery()
        public static int ExecuteNonQurey(string sql,CommandType cmdType,params SqlParameter[] pms)
        {
            using (SqlConnection con = new SqlConnection(conStr))
            {
                using (SqlCommand cmd = new SqlCommand(sql,con))
                {
                    cmd.CommandType = cmdType;
                    if (pms != null)
                    {
                        cmd.Parameters.AddRange(pms);
                    }
                    con.Open();
                    return cmd.ExecuteNonQuery();
                }
            }
        }


        //2.執行查詢,返回單個值的方法 ExecuteScalar
        public static object ExecuteScalar(string sql, CommandType cmdType, params SqlParameter[] pms)
        {
            using (SqlConnection con = new SqlConnection(conStr))
            {
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    cmd.CommandType = cmdType;
                    if (pms != null)
                    {
                        cmd.Parameters.AddRange(pms);
                    }
                    con.Open();
                    return cmd.ExecuteScalar();
                }
            }
        }

        //3.執行查詢,返回多行的方法ExecuteReader
        public static SqlDataReader ExecuteReader(string sql, CommandType cmdType, params SqlParameter[] pms)
        {
            SqlConnection con = new SqlConnection(conStr);
            using (SqlCommand cmd = new SqlCommand(sql,con))
            {
                cmd.CommandType = cmdType;
                if(pms != null)
                {
                    cmd.Parameters.AddRange(pms);
                }
                try
                {
                    if (con.State == ConnectionState.Closed)
                    {
                        con.Open();
                    }
                    
                    //System.Data.CommandBehavior.CloseConnection這個枚舉參數,表示將來使用完畢SqlDataReader後,在關閉reader的同時,在SqlDataReader內部會將關聯的Connection對象也關閉掉
                    return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
                }
                catch
                {
                    con.Close();
                    con.Dispose();
                    throw;
                }
            }

        }

        public static DataTable ExecuteDataTable(string sql,CommandType cmdType,params SqlParameter[] pms)
        {
            DataTable dt = new DataTable();
            using (SqlDataAdapter adapter = new SqlDataAdapter(sql,conStr))
            {
                adapter.SelectCommand.CommandType = cmdType;
                if (pms != null)
                {
                    adapter.SelectCommand.Parameters.AddRange(pms);
                }
                adapter.Fill(dt);

            }
            return dt;
        }
    }
}

 

然後看看圖片:

細心的你一定一眼就看到了這裡有個bug啦,當前文中不存在這個ConfigurationManager類,所以啊,我要把這個東西搞進來先。那麼問題來了,在哪裡搞呢,自己寫一個嗎,不,不是的,這是個系統自帶的東西,我只需要引用進來就行了;

怎麼引用,往下看:

(1)右擊Dal下的引用,點擊 添加引用 ==》程式集 ==》 框架(如果最近引用過可以點擊最近)==》找到這個東西 System.Configuration, 打上溝,點擊確定,就可以了

 

 

 (2)看一下引用後的結果吧:

現在可以看到,那個錯誤沒有了。

事實上,做到這一步,我們的這個SqlHelper還是不能正常使用的,為什麼,細心的你可能會發現,在SqlHelper里鏈接資料庫的字元串conStr後面的東西跟我們學的時候看到的語句不一樣啊,這裡既沒寫我要連那個伺服器,也沒寫要連那個資料庫,更沒寫是那個用戶登錄的,登錄密碼是啥?那咋辦呢,這是為啥呢?

下麵來講:因為資料庫的鏈接是一個很頻繁的操作,如果我們在每個資料庫連接的方法中都寫上一串下麵這個代碼:

string conStr = "Data Source = .;Initial Catalog = 資料庫名;User ID = sa;Password = XXXX";

那會是非常繁瑣的,而且如果有朝一日需要改動這個資料庫,那需要改的文件就太多了,因此啊,我們把這個東西放到了一個全局配置文件中,這個文件就是App.config,這個文件vs2017是預設就有的,以前版本的好像要自己新建。

下麵點擊打開App.config, 在裡面添加<connectionStrings><add XXXXXXXX/></connectionStrings>這樣的一串代碼:
代碼如下:

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
  <connectionStrings>
    <add name="mssqlserver" connectionString="Data Source = acer-pc;Initial Catalog = FirstDB;User ID = sa; Password = 168168"/>
  </connectionStrings>
</configuration>

 添加好後,把name = "XXX"里的這個XXX名字寫到SqlHelper里的那個位置去就可以了

 

  到這個地方這資料庫相關的東西就弄好了,下麵我們回到TbAreasDal.cs里來,

此時SqlHeiper這個類已經有了,但是還沒有引進來。

怎麼引,簡單,將游標定位到劃紅線的地方,使用快捷鍵  Ctrl + Alt +F10 ,會彈出提示語句,選中提示語句就可以了,這個快捷鍵還蠻好用,可以記一記。如圖所示:

下麵給出正確的TbAreasDal.cs代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 封裝SqlHelper類;

namespace Dal
{
    public class TbAreasDal
    {
        //在這裡編寫資料庫操作函數
        public int GetRecordCount()
        {
            //sql語句
            string    sql = "select count(*) from TbAreas";
            //調用SqlHelper里的方法執行查操作語句
            return     (int)SqlHelper.ExecuteScalar(sql,System.Data.CommandType.Text);
        }
    }
}

 到這裡Dal層就寫完了,下麵來看Blll層。

3.在業務層編寫業務邏輯代碼

  首先給Bll里的類重命名為TbAreasBll.cs,然後編寫代碼:

代碼如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Bll
 8 {
 9     public class TbAreasBll
10     {
11         TbAreasDal dal = new TbAreasDal();
12         public int GetRecordCount()
13         {
14             return    dal.GetRecordCount();
15         }
16     }
17 }

 

 但是,此時這個代碼還有問題,如下圖所示

 

 

 沒錯,這裡缺少Dal項目的引用啊,只有把他引進來,才能使用他啊。怎麼引,兩種辦法,一種、直接在上圖左邊的紅框上點一下,還有一種,右擊Bllx下的引用  ==》添加引用 ==》 項目 ==》勾上Dal,如圖所示:

就是這樣子了,引進來後就沒有錯誤了。咋的,不信啊,不信給你看圖啊:

到這裡,業務層也交代完了,接下來看UI層。

4.UI層——進行用戶操作,獲取反饋結果

  首先給UI層的窗體重命名為AreasNum.cs,然後在上面添加一個按鈕。,如下圖所示:

這樣就可以了,接下來雙擊按鈕,進行相應的代碼編輯:代碼如下:

 1    private void button1_Click(object sender, EventArgs e)
 2         {
 3             //實例化TbAreasBll類,這裡同樣要引用一下Bll這個命名空間,否則會報錯
 4             TbAreasBll bll = new TbAreasBll();
 5 
 6             //調用bll里的方法,獲取條數
 7             int row = bll.GetRecordCount();
 8 
 9             //顯示條數
10             MessageBox.Show("TbAreas表中有"+ row + "條記錄");
11 
12         }

 需要註意的是,這個代碼里同樣需要先引用Bll,不然同樣會出錯,程式運行的結果為:

 

 這與我前面用sql語句在資料庫直接查詢的數據是一致的。

  好了,這個最簡單的三層就記錄到這裡啦,雖然是如此的簡單,但還是寫了這麼長,沒辦法,誰叫我菜呢。

以上的內容是觀看傳智播客趙曉虎老師的視頻課所學,在此感謝傳智播客。對於以上所述內容,發現有重大謬誤的,歡迎口水留言,謝謝!

我的QQ:3074596466 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Given two binary strings, return their sum (also a binary string). The input strings are both non-empty and contains only characters 1 or 0. Example 1 ...
  • #!/usr/bin/env python# -*- coding: utf-8 -*-# Author:Caesar yangname = 'yuE yu \tqing is {my} net {name}'# print(name.capitalize())#首字母轉為大寫print(name. ...
  • public static void main(String[] args) {//菱形實心時,數量為1,2,3...... int a = 10;//菱形的邊為10個 * for (int i = 1; i <= a; i++) { for (int j = 1; j <= a - i; j++) ...
  • 導讀 有的初學者對於如何開始學習C#感到無從下手,不知看哪些書,或者是看什麼視頻,沒有目的性,這樣就會影響學習效率,也會影響學習的熱情。最重要的是很多同學學之前問很多和學習無關的問題,比如:C#是不是不如JAVA好?C#有前途嗎?等等。博主認為現在觀望還不如現在學習。本篇文章介紹了博主自己總結的C# ...
  • zooland 我叫它動物園地,一個構思很長時間的一個項目。起初只是覺得各種通信框架都封裝的很好了,但是就是差些相容,防錯,高可用。同時在使用上,不希望有多餘的代碼,像普通介面一樣使用就可以了。 基於這些想法,看了很多資料,有了很多啟發;也開發出這樣一個版本,而且也在實際項目中應用起來了,算是小有成 ...
  • 日常開發中,經常碰到圖片上傳的需求,尤其在商城系統開發的時候,商品列表商品圖片展示如果使用高清原圖,由於高清原圖比較大,載入原圖時間會大大增加,直接導致系統性能底下,用戶體驗不好,併發量高的時候直接就掛掉了,這時候後臺上傳圖片的時候,就必須將原高清圖進行壓縮,生成高質量縮略圖,然後在商品列表讀取縮略 ...
  • cobbler自動裝機配置如以上所示,謝謝~ ...
  • 一.out的形參變數無需再提前聲明 befor: after: 二.擴展了元組(Tuple的使用,需要Nuget引用 System.ValueTuple) 1.命名的改進: ①.無命名,僅能通過無意義的Item1,Item2進行訪問: befor: after: 混合型命名:(會有一個編譯警告,僅以 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...