天天看點

簡單三層架構項目一

1)系統使用者管理:使用者的密碼以md5散列值的形式儲存在資料庫中,密碼不能明文儲存。

2)客戶資料管理:使用NPOI實作從Excel檔案中批量導入客戶資料,還可以将客戶資料導出到Excel檔案中。

3)客戶資料的查詢支援按照拼音檢索。為了提高檢索速度,在使用者表中添加一個“姓名拼音”字段,在使用者增加,修改時,計算姓名對應的拼音。

4)客戶資料的檢索支援符合檢索,也就是根據使用者姓名、地區、購買日期、分店等資訊進行多條件符合檢索。

5)常見問題管理:将使用者常見的問題、回答儲存在系統中,并且可以動态的對常見問題進行增删改查。常見問題以樹狀資料儲存在資料庫中,這樣就可以支援常見問題的無限級分類

6)三層架構,重難點

7)筆試題讓敲代碼,是以現在所有的代碼都必須手寫。能手寫代碼才證明思路清晰。

8)使用SqlHelper+App.config+帶參數的sql語句實作登入功能

MD5是一種雜湊演算法,不是一種加密算法。任何長度的任意内容都可以使用MD5計算出散列值。主要作用是驗明真身。

MD5一般是長度為32位的16進制字元串。MD5算法不可逆。

系統明文密碼有哪些缺點? 個人資訊洩露

計算使用者輸入的密碼MD5值,與資料庫存儲的MD5值進行比較,如果相等則認為密碼正确。

應用:使用檔案的MD5值來檢驗檔案是否被篡改過。

MD5算法是不可逆的。

原理:計算完畢會傳回一個位元組數組,就是将128位除以8,是以就是16個位元組,再把每個byte轉化成兩位的16進制表示,最後看到的就是32位的字元串了。

對字元串進行MD5計算

SqlHelper的封裝

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 _49_ado.net複習
{
    /// <summary>
    /// 資料庫操作輔助類
    /// </summary>
    class SqlHelper
    {
        //私有:本類,隻讀,目前 配置管理器類ConfigurationManager
        private static readonly string connString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

        /// <summary>
        /// 執行增删改操作
        /// </summary>
        /// <param name="sql">要執行的sql語句或者存儲過程</param>
        /// <param name="type">類型</param>
        /// <param name="pms">資料庫參數</param>
        /// <returns></returns>
        public static int ExecuteNoQuery(string sql, CommandType type, params SqlParameter[] pms)
        {
            using (SqlConnection conn = new SqlConnection(connString))
            {
                using (SqlCommand comm = new SqlCommand(sql, conn))
                {
                    //要執行的sql的類型
                    comm.CommandType = type;
                    if (pms != null)
                    {
                        comm.Parameters.AddRange(pms);
                    }
                    conn.Open();
                    //隻傳回受影響的行數
                    return comm.ExecuteNonQuery();
                }
            }
        }

        public static object ExecuteScalsr(string sql, CommandType type, params SqlParameter[] pms)
        {
            using (SqlConnection conn = new SqlConnection(connString))
            {
                using (SqlCommand comm = new SqlCommand(sql, conn))
                {
                    //指令類型是sql還是存儲過程
                    comm.CommandType = type;
                    if (pms != null)
                    {
                        //往指令對象中添加請求參數
                        comm.Parameters.AddRange(pms);
                    }
                    conn.Open();
                    return comm.ExecuteScalar();
                }
            }
        }

        public static SqlDataReader ExecuteDataReader(string sql, CommandType type, params SqlParameter[] pms)
        {
            //如果連接配接關閉了,就讀取不到資料了。(查詢資料和讀取資料,必須使用同一個連接配接)
            SqlConnection conn = new SqlConnection(connString);
            using (SqlCommand comm = new SqlCommand(sql, conn))
            {
                comm.CommandType = type;
                if (pms != null)
                {
                    comm.Parameters.AddRange(pms);
                }
                try
                {
                    //判斷連接配接狀況
                    if (conn.State == ConnectionState.Closed)
                    {
                        //如果連接配接狀态是關閉的,就進行打開
                        conn.Open();
                    }
                    //讀取完畢後,關閉連接配接
                    return comm.ExecuteReader(CommandBehavior.CloseConnection);
                }
                catch (Exception)
                {
                    //如果出現異常,就進行捕獲
                    //一旦出現異常,因為連接配接是打開的,需要手動釋放資源
                    conn.Close();
                    conn.Dispose();
                    //捕獲目前程式運作出現的異常
                    throw;
                }
            }
        }

        //傳回DataTable
        public static DataTable ExecuteDataTable(String sql, CommandType type, params SqlParameter[] pms)
        {
            DataTable dt = new DataTable();
            using (SqlDataAdapter adapter = new SqlDataAdapter(sql, connString))
            {
                adapter.SelectCommand.CommandType = type;
                if (pms != null)
                {
                    adapter.SelectCommand.Parameters.AddRange(pms);
                }
                //執行查詢操作,擷取資料
                adapter.Fill(dt);
            }
            return dt;
        }
    }
}
           

//登入按鈕業務邏輯

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _49_ado.net複習
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

            //MD5了解:  為什麼要使用?  同一内容的MD5不會改變,根據這一特性進行對比
            //資料庫中存明文密碼的缺點是什麼?
            //為什麼要使用MD5算法?
            //MD5算法不可逆,有些内容的MD5值可能相同。
            //建立一個MD5對象,調用方法來建立MD5值。ComputerHash(數組)
            //計算某一個檔案的MD5值,計算某一個字元串的MD5值
        }

        /// <summary>
        /// 登入的業務邏輯處理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// 代碼已經能夠成功執行了

        private void button1_Click(object sender, EventArgs e)
        {
            string useName = tb1.Text.Trim();
            string password = tb2.Text;
            string sql = "select count(*) from UserTable where [email protected] and [email protected]";
            //這一塊的代碼不太熟練啊
            SqlParameter[] pms = new SqlParameter[] {
                //數組裡面存放的是每一個SqlParameter對象:sql參數對象;數組元素之間使用逗号分割
                new SqlParameter("@uid",SqlDbType.NVarChar,50) { Value= useName},
                new SqlParameter("@pwd",SqlDbType.NVarChar,50) { Value=password}
            };

            //記住這種寫法,一定要多敲代碼
            SqlParameter[] pms1 = new SqlParameter[] {
                new SqlParameter ("@uid",SqlDbType.NVarChar,50) {//這個值從哪裡來?
                    Value =useName
                },
                new SqlParameter("@pwd",SqlDbType.NVarChar,50) {Value=password }
            };
            //能夠查詢到資料
            int r = (int)SqlHelper.ExecuteScalsr(sql, CommandType.Text, pms);
            if (r > 0)
            {
                MessageBox.Show("登入成功!");
            }
            else
            {
                MessageBox.Show("登入失敗!");
            }
        }
    }
}

           

繼續閱讀