iT邦幫忙

0

利用 dapper製作MVC的問題

  • 分享至 

  • twitterImage

  小弟剛入code這條道路,目前是自學階段,對於現今網頁的架構請各位前輩指教。
  之前自學我是使用EF來去撈DB的資料,可是公司的前輩要我用dapper就好,畢竟公司的系統是小系統也是利用dapper的方式做(我知道EF跟dapper的比較與優缺點,在此不多討論),只是我上網去找尋相關資料,可惜google技術沒有很好,找不到相關的範例可以練習,只是懂了相關觀念之後,卻無從下手。小弟愚鈍,想問各位前輩我的觀念是否錯誤?(我利用會員註冊系統說明)
  Browser端顯示欄位輸入帳號密碼姓名信箱,密碼少於一個大寫英文、非email格式皆會在Broser端顯示錯誤,在此不經過server端與DB端去做驗證動作。輸入帳號後會有確認帳號是否重複,會有一個button的去做判斷,此時點下button時會利用dapper去跟DB做溝通,撈出帳號欄位去判斷是否有重複,如果有,則會顯示一個alert。
  如果資料輸入完畢之後,在按下註冊button則會再次利用dapper對DB做insert的動作。
  請問我該把dapper這個動作放在controller之內嗎?公司的前輩跟我說我之前做的會員系統都是寫在controller裡面,這樣會造成後端的處理器一直處於運算動作的狀態,所以要改成dapper去做DATA的CRUD動作。可是如果我把dapper放在view卻放不進去(?)我知道應該放不進去,可是我卻不知道dapper這個動作該放在哪裡?是不是要做dapper之前要先給她一串連現地指令,還是說連線的指令可以寫在webconfig內?麻煩各位前輩不吝指教(謝謝)
  另外想問,dapper我的觀念是,有需要去DB裡面做資料比對的時後才會open,然後取完資料會先放在temp檔裡面去做比對,比對完之後才會close,去釋放空間,這樣是正確的觀念嗎(?)
  麻煩各位前輩可以指教(要鞭要打都可以),虛心願意學習。或者有前輩可以給我一個google的關鍵字。
  我知道自己的google技術沒有很好,很多關鍵字都找不到答案,還在多多練習階段。
 (喔,對了,我不是在軟體公司上班,所以我沒有其他同事可以幫我解決問題。)

Dapper的介紹 -- 9vs1.com/course-introduction-ADO-NET-MIS2000Lab

我是因為使用 ADO.NET + T-SQL指令,才會用Dapper來寫MVC的。

看了您上面的問題,我覺得您應該先瞭解ADO.NET程式(自己寫程式連結資料庫,您說的Open & Close,執行SQL指令等等)這些關鍵的動作不是Dapper在做,但您的說法卻像是 Dapper做掉的 :-)
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
暐翰
iT邦大師 1 級 ‧ 2019-05-29 18:18:10

公司的前輩跟我說我之前做的會員系統都是寫在controller裡面,這樣會造成後端的處理器一直處於運算動作的狀態

不應該一直運算,前端送完reqeust處理完資料之後就停止運算

如果我把dapper放在view卻放不進去(?)我知道應該放不進去

對,不要放在view

Dapper很簡單,像是查詢會員資料
只要需要建立Connection物件並查詢 + 導入參數

有需要去DB裡面做資料比對的時後才會open,然後取完資料會先放在temp檔裡面去做比對,比對完之後才會close,去釋放空間,這樣是正確的觀念嗎(?)

可以使用語法糖using,系統會幫你close跟釋放connection資源
以下簡單舉例,以ID取得會員資料

using (var connection = new SqlConnection(你的連線字串))
{			
	var member = connection.QueryFirst<Member>("select * from member where id = @id",new { id = "會員ID"});
}

Dapper強調簡單易用
看完這連結Dapper Dapper | Dapper Tutorial and Documentation差不多就會有概念了

雖然Dapper簡單,但是難在SQL的正確概念

看更多先前的回應...收起先前的回應...
小魚 iT邦大師 1 級 ‧ 2019-05-29 18:25:38 檢舉

又有新的東西了...

小魚 iT邦大師 1 級 ‧ 2019-05-29 18:33:44 檢舉

不過看起來蠻好上手的, 有空來做個筆記吧...

暐翰 iT邦大師 1 級 ‧ 2019-05-29 22:08:11 檢舉

Dapper + EF 是我目前的最愛 :D

Homura iT邦高手 1 級 ‧ 2019-05-30 00:17:53 檢舉

暐翰
不是Dapper+LINQ?

暐翰 iT邦大師 1 級 ‧ 2019-05-30 00:43:13 檢舉

增刪改簡單查詢使用EF,複雜查詢使用Dapper Homura

Homura iT邦高手 1 級 ‧ 2019-05-30 08:44:28 檢舉

原來如此

米歐 iT邦新手 3 級 ‧ 2019-05-30 11:15:07 檢舉

大大,範例少一個 )
話說,教學沒有特地去執行 open 方法,dapper 會幫你開啟,範例會加是個人習慣還是有什麼用途?
還有就是 QueryFirst 與 在查詢語法中加入 TOP 1,是習慣考量還是有什麼效能差異。
謝大大。

暐翰 iT邦大師 1 級 ‧ 2019-05-30 12:17:52 檢舉

米歐

話說,教學沒有特地去執行 open 方法,dapper 會幫你開啟,範例會加是個人習慣還是有什麼用途?

是,可以省略Open,圖片Dapper source code區段有特別幫忙判斷

還有就是 QueryFirst 與 在查詢語法中加入 TOP 1,是習慣考量還是有什麼效能差異。

QueryFirst 等於告知AP端只會取得一筆資料
QueryFirst 通常跟top 1做搭配,假如sql使用top 1,最好使用QueryFirst(orDefault),不要使用Query + Linq First,效能前者好很多

可以看圖片Dapper Source Code這邊判斷,要求程式只讀取單行資料

米歐 iT邦新手 3 級 ‧ 2019-05-31 15:27:45 檢舉

感謝 暐翰 大大

暐翰
你好,請問範例中『((你的連線字串))』這個字串是要從哪裡操作才能得知?

暐翰 iT邦大師 1 級 ‧ 2019-06-04 14:40:25 檢舉

terpoo1250
連線字串把它看成登入google需要的帳號密碼
可以參考官方說明
連接字串語法 | Microsoft Docs

有點不懂該怎麼設連線字串,嘗試了幾次都無法成功...
我只是想要先測試看看帳號是否跟在DB裡面的資料一致而已。
SQL:https://ithelp.ithome.com.tw/upload/images/20190604/20116639sccgMYlDUh.png
我的註冊model:

  public class RegisterModel
    {
        public int Num { get; set; }
        [Required(ErrorMessage = "請輸入帳號")]
        [Display(Name = "帳號")]

        public string ID { get; set; }

        [Required(ErrorMessage = "請輸入密碼")]
        [DataType(DataType.Password)]
        [Display(Name = "密碼")]
        public string Password { get; set; }

        }

我的contorl語法:

   [HttpPost]
        public ActionResult Register(RegisterModel model)
        {
            string sql = "SELECT * FROM Menber WHERE ID=@ID";
            using (var connection = new SqlConnection("Data Source=MySqlServer/MSSQL1;Persist Security Info = true;User ID=sa;Password=123456; Initial Catalog = AdventureWorks; "))
            {
                var menber = connection.Query<RegisterModel>("select * from menber where id=@id", new { ID = "@ID" });
                if (menber.ToString()==model.ID)
                {
                    TempData["message"] = "帳號已重複";
                    return View();
                }

                else
                {
                    TempData["message"] = "此帳號可使用";
                    return View();
                }
            }
        }

到底是哪裡寫錯...

暐翰 iT邦大師 1 級 ‧ 2019-06-04 19:29:43 檢舉

你的cataloag是test1但是系統connectionstring是AdventureWorks

暐翰
還是無法成功,我是參考她的連線字串做的這邊,可是他的是伺服器IP我是設定自己電腦上的SQL根目錄地址,這樣的方法是對的嗎?

我要發表回答

立即登入回答