一、完整修改和查詢
在編寫c#語句時需考慮到用戶體驗,例如在編寫修改語句時,需要考慮到輸入的內容在數據庫中是否能夠找到。
中間變量運用。
1、先查
2、執行操作
完整修改語句:
bool has = false; Console.Write("請輸入要修改的用戶名:"); string Uname = Console.ReadLine(); //到數據庫中查詢輸入的用戶名是否存在 SqlConnection conn = new SqlConnection("server=.;database=Data0720;user=sa;pwd=123");//連接數據庫 SqlCommand cmd = conn.CreateCommand();//數據庫操作 cmd.CommandText = "select *from Users where UserName='" + Uname + "'"; conn.Open();//打開數據庫 SqlDataReader dr = cmd.ExecuteReader(); if (dr.HasRows) { has = true; } conn.Close();//關閉數據庫 if (has) { Console.WriteLine("已經查到[" + Uname + "]用戶信息,請進行修改"); Console.Write("請輸入修改后的密碼:"); string Pwd = Console.ReadLine(); Console.Write("請輸入修改后的昵稱:"); string Nname = Console.ReadLine(); Console.Write("請輸入修改后的性別:"); string Sex = Console.ReadLine(); Console.Write("請輸入修改后的生日:"); string Birthday = Console.ReadLine(); Console.Write("請輸入修改后的民族:"); string Nation = Console.ReadLine(); //@key 占位符 cmd.CommandText = " update Users set PassWord=@pwd,NickName=@nname,Sex=@sex,Birthday=@bir,Nation=@nat where UserName=@uname;"; cmd.Parameters.Clear(); cmd.Parameters.Add("@pwd", Pwd); cmd.Parameters.Add("@nname",Nname); cmd.Parameters.Add("@sex", (Sex=="男")?"1":"0"); cmd.Parameters.Add("@bir", Birthday); cmd.Parameters.Add("@nat", Nation); cmd.Parameters.Add("@uname", Uname); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); Console.WriteLine("修改完畢!"); } else { Console.WriteLine("未查到[" + Uname + "]用戶信息,請確認用戶名輸入是否正確!"); }
完整刪除語句:
bool has = false; Console.Write("請輸入要刪除的用戶名:"); string Uname = Console.ReadLine(); //查詢要刪除的用戶名在數據庫中是否存在 SqlConnection conn = new SqlConnection("server=.;database=Data0720;user=sa;pwd=123"); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "select *from Users where UserName='" + Uname + "'"; conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); if (dr.HasRows) { has = true; } conn.Close(); if (has) { Console.WriteLine("已經查到[" + Uname + "]用戶信息,是否確定要刪除嗎?(Y/N):"); string u = Console.ReadLine(); if (u.ToUpper() == "Y")//確定刪除 { cmd.CommandText = "delete from Users where UserName='" + Uname + "'"; conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); Console.WriteLine(Uname + "刪除成功!"); } } else { Console.WriteLine("未查到[" + Uname + "]用戶信息,請確認用戶名輸入是否正確!"); }
二、SQL數據庫字符串注入攻擊
需要使用cmd.Parameters這個集合
占位符: @key 代表這個位置用這個占位符占住了
arameters這個集合中將此占位符所代表的數據補全
cmd.Parameters.Clear(); --添加占位符數據之前,要清空此集合
cmd.Parameters.Add("@pwd", Pwd); --占位符內容填充
cmd.Parameters.Add("@nname",Nname);
cmd.Parameters.Add("@sex", (Sex=="男")?"1":"0");
cmd.Parameters.Add("@bir", Birthday);
cmd.Parameters.Add("@nat", Nation);
cmd.Parameters.Add("@uname", Uname);
三、實體類,數據訪問類
1.實體類:封裝
封裝一個類,類名與數據庫表名一致
成員變量名與列名一致,多一個下划線
成員變量封裝完的屬性,就會與數據表中的列名一致
每一行數據都可以存成一個對象,操作這個對象,就相當於對某一行數據進行整體操作
2.數據訪問類:
就是將對數據庫的一些操作,單獨寫到一個類中,封成一些方法,等待調用
結構看起來會非常清晰。
3.三層開發:
界面層 - UI層
業務邏輯層 - C#代碼部分
數據訪問層 - 實體類和數據訪問類

//實體類 public class stu { private string _xuehao; /// <summary> /// 學號 /// </summary> public string Xuehao { get { return _xuehao; } set { _xuehao = value; } } private string _name; /// <summary> /// 學生姓名 /// </summary> public string Name { get { return _name; } set { _name = value; } } private bool _sex; /// <summary> /// 性別 /// </summary> public bool Sex { get { return _sex; } set { _sex = value; } } private string _banji; /// <summary> /// 班級 /// </summary> public string Banji { get { return _banji; } set { _banji = value; } } private DateTime _bir; /// <summary> /// 出生年月 /// </summary> public DateTime Bir { get { return _bir; } set { _bir = value; } } //數據訪問類 public class studata { SqlConnection conn = null;//數據連接與操作 SqlCommand cmd = null; public studata()//構造函數 { conn = new SqlConnection("server=.;database=new01;user=sa;pwd=123"); cmd = conn.CreateCommand(); } /// <summary> /// 查詢數據庫 /// </summary> public void Select() { cmd.CommandText = "select *from stu";//查詢語句 conn.Open();//打開數據庫 SqlDataReader dr = cmd.ExecuteReader();//調用此方法用來查詢 while (dr.Read()) { Console.WriteLine(dr["xuehao"] + "\t" + dr["name"] + "\t" + ((bool)dr["sex"] ? "男" : "女") + "\t" + dr["banji"] + "\t" + Convert.ToDateTime(dr["bir"]).ToString("yyyy-MM-dd")); } conn.Close();//關閉數據庫 } /// <summary> /// stu表添加方法 /// </summary> /// <param name="s">要添加到數據庫的stu對象</param> public void insert(stu s) { cmd.CommandText = "insert into stu values(@xuehao,@name,@sex,@banji,@bir)"; cmd.Parameters.Clear();//清空此集合 cmd.Parameters.AddWithValue("@xuehao",s.Xuehao); cmd.Parameters.AddWithValue("@name", s.Name); cmd.Parameters.AddWithValue("@sex", s.Sex ); cmd.Parameters.AddWithValue("@banji", s.Banji); cmd.Parameters.AddWithValue("@bir", s.Bir); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); } /// <summary> /// 查詢是否存在 /// </summary> /// <param name="xuehao"></param> /// <returns></returns> public stu select(string xuehao) { stu s = null; cmd.CommandText = "select *from stu where xuehao=@a"; cmd.Parameters.Clear(); cmd.Parameters.Add("@a", xuehao); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); if(dr.HasRows) { dr.Read(); s = new stu(); s.Xuehao=dr["xuehao"].ToString(); s.Name=dr["name"].ToString(); s.Banji = dr["banji"].ToString(); s.Sex = Convert.ToBoolean(dr["sex"]); s.Bir = Convert.ToDateTime(dr["bir"]); } conn.Close(); return s; } /// <summary> /// 修改 /// </summary> /// <param name="s">要修改到數據庫的stu對象</param> public void update(stu s) { cmd.CommandText = "update stu set name=@name,sex=@sex,banji=@banji,bir=@bir where xuehao=@xuehao"; cmd.Parameters.Clear();//清空此集合 cmd.Parameters.AddWithValue("@xuehao", s.Xuehao); cmd.Parameters.AddWithValue("@name",s.Name); cmd.Parameters.AddWithValue("@sex", s.Sex); cmd.Parameters.AddWithValue("@banji", s.Banji); cmd.Parameters.AddWithValue("@bir",s.Bir); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); } /// <summary> /// 刪除 /// </summary> /// <param name="xuehao"></param> /// <returns></returns> public bool delete(string xuehao) { bool delOK = false; cmd.CommandText = "delete from stu where xuehao =@a"; cmd.Parameters.Clear(); cmd.Parameters.Add("@a", xuehao); conn.Open(); try { cmd.ExecuteNonQuery(); delOK = true; } catch { } conn.Close(); return delOK; } } //c#代碼部分 studata sdata = new studata();//實例化studata這個類 Console.WriteLine("學號" + "\t" + "姓名" + "\t" + "性別" + "\t" + "班級" + "\t" + "生日"); sdata.Select(); Console.ReadLine(); Console.Write("請輸入你想執行的操作(1添加,2修改,3刪除):"); try//異常保護 { int code = int.Parse(Console.ReadLine()); if (code == 1 || code == 2 || code == 3) { if (code == 1)//添加 { stu s = new stu();//實例化 string[] x = new string[3]; while (true) { Console.Write("請輸入您要輸入的學生學號:"); x[0] = Console.ReadLine(); if (x[0] == "") { Console.WriteLine("學號不能為空"); } else if (x[0].Length != 4 || x[0].StartsWith("S") != true) { Console.WriteLine("學號輸入有誤,必須以S開頭"); } else { stu s2 = sdata.select(x[0]); if (s2!=null) { Console.WriteLine("此學號已經存在,請重新輸入!"); } else { break; } } } s.Xuehao = x[0]; Console.Write("請輸入您要輸入的學生姓名:"); s.Name = Console.ReadLine(); while (true) { Console.Write("請輸入您要輸入的學生性別(false代表女,true代表男):"); x[1] = (Console.ReadLine()).ToLower(); if (x[1] == "true" || x[1] == "false") { break; } else { Console.WriteLine("性別代碼輸入有誤!"); } } s.Sex = Convert.ToBoolean(x[1]); Console.Write("請輸入您要輸入的學生班級:"); s.Banji = Console.ReadLine(); Console.Write("請輸入您要輸入的學生生日:"); s.Bir = Convert.ToDateTime(Console.ReadLine()); sdata.insert(s);//調用sdata中的insert方法 sdata.Select();//調用sdata中的Select方法 } //修改 else if (code == 2) { stu s = new stu();//實例化 Console.Write("請輸入您要修改的學生的學號:"); s.Xuehao = Console.ReadLine(); //判斷輸入的學號在數據庫中是否存在 stu s2 = sdata.select(s.Xuehao);//將輸入的學號調入sdata中的select方法中,並賦值給s2 if (s2 != null) { Console.WriteLine("已查到此信息,按任意鍵修改"); Console.ReadKey(); Console.Write("請輸入您修改后的學生姓名:"); s.Name = Console.ReadLine(); string[] x = new string[1]; while (true) { Console.Write("請輸入您修改后的學生性別(false代表女,true代表男):"); x[0] = (Console.ReadLine()).ToLower(); if (x[0] == "true" || x[0] == "false") { break; } else { Console.WriteLine("性別代碼輸入有誤!"); } } s.Sex = Convert.ToBoolean(x[0]); Console.Write("請輸入您修改后的學生班級:"); s.Banji = Console.ReadLine(); Console.Write("請輸入您修改后的學生生日:"); s.Bir = Convert.ToDateTime(Console.ReadLine()); sdata.update(s);//調用sdata中的update方法 Console.WriteLine("修改成功"); sdata.Select();//調用sdata中的Select方法 } else { Console.WriteLine("未查到有關信息,請查看是否輸錯"); } } else { stu s = new stu(); Console.Write("請輸入您要刪除的學生的學號:"); s.Xuehao = Console.ReadLine(); //判斷輸入的學號在數據庫中是否存在 stu s2 = sdata.select(s.Xuehao); if (s2 != null) { Console.WriteLine("已查到此信息,請按任意鍵刪除"); Console.ReadKey(); bool ok = sdata.delete(s.Xuehao); if (ok) { Console.WriteLine("刪除成功!"); sdata.Select(); } else Console.WriteLine("刪除失敗!"); } else Console.WriteLine("未查到有關信息,請查看是否輸錯"); } } else { Console.WriteLine("您輸入有誤!"); } } catch { Console.WriteLine("您輸入的不是數字!"); } Console.ReadLine();