ADO.NET知識的運用一(Day 26)


   哈哈,又到了總結的時間了,來回顧一下今天主要學了關於ADO.NET的哪些知識吧。(這次學的ADO訪問數據庫主要以訪問SQL數據庫為主)

 

理論:

 首先我們要知道為什么要學習ADO.NET?

因為我們之前所學只能在查詢分析器里查看數據,操作數據,我們不能讓普通用戶去學sql,所以我們搭建一個界面(web或winform)讓用戶方便的操作數據庫中的數據

什么是ADO.NET?

ADO.NET就是一組類庫,這組類庫可以讓我們通過程序的方式訪問數據庫,就像System.IO下的類操作文件一樣, System.Data.這組類是用來操作數據庫(不光是MSSql Server),它提供了統一的編程接口讓操作其它數據庫(AccessOracle)的方式和操作MSSql Server一致

 

ADO.NET組成
—數據提供程序(常用類)
 
Connection連接對象,用來連接數據庫
 
Command:  命令對象,用來執行SQL語句並返回結果
 
DataReader數據讀取器對象,只讀、只進的結果集,一條一條讀取數據(StreamReader、XmlReader微軟的類庫中這些Reader的使用方式都差不多)
 
DataAdapter讀取適配器對象,用來執行SQL語句並返回結果在DataSet與數據源之間建立通道,將數據源中的數據寫入DataSet中,或者根據DataSet中的數據更新數據源。俗稱“數據搬運工”
 
—DataSet    :   數據集對象,在內存中的臨時數據庫,是一個虛擬的數據源。利用數據適配器所執行的SQL命令或存儲過程來填充數據。一旦填充后就可以斷開與數據源的連接
 
 
ADO.NET的其他常見類
 
—ConnectionStringBuilder           自動生成連接字符串
—Parameter                                 帶參數的SQL語句
—Transaction                               在ADO.NET中使用事務
 
—與DataSet相關的類
 
DataView                   視圖類,DataTable中的數據以不同的視角查看
DataRowView             DataView中的行。
DataTable                   DataSet中的數據表
DataRow                    DataTable中的行
DataColumn              DataTable中的列
DataRealation           DataTable與DataTable的關系
onstraint                   DataTable中建立的約束
 
ADO.NET各類在開發中的職能
  

 

ADO.NET訪問數據庫的方式(有兩種)

 

 

 

—方式一:
 
1.連接數據用Connection
 
2.執行SQL語句Command
 
3.執行完畢之后將結果一條一條返回。DataReader
 
—方式二:
 
使用DataAdapter+DataSet,這種方法本質還是通過Connection、Command、DataReader將數據全部取出來然后放到了DataSet中
 
實操:
 
在做項目之前首先要引進命名空間using System.Data.SqlClient;
 
1.插入數據
 
 
主要代碼:
 static void Main(string[] args) { //創建連接字符串 string connstr = "Data Source=.;Initial Catalog=db_buiness;Integrated Security=True"; //打開連接 using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); //執行數據庫操作 string sql = "insert into info values('jany',19,'女','123456')"; using (SqlCommand comm = new SqlCommand(sql, conn)) //創建命令對象  { int i = comm.ExecuteNonQuery(); //執行對數據庫的增刪改,返回受影響的行數 if (i > 0) { Console.WriteLine("插入成功"); } else { Console.WriteLine("插入失敗"); } } Console.ReadKey(); } }

 

 結果:

 


 

2. 更新數據(刪除數據類似於更新數據和插入數據,只是執行的sql語句不一樣而已)

static void Main(string[] args) { //創建連接字符串 string connstr = "Data Source=.;Initial Catalog=db_buiness;Integrated Security=True"; //打開連接 using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); //執行數據庫操作 string sql = "update info set name='rose' where id=4"; using (SqlCommand comm = new SqlCommand(sql, conn)) //創建命令對象  { int i = comm.ExecuteNonQuery(); //執行對數據庫的增刪改,返回受影響的行數 if (i > 0) { Console.WriteLine("更新成功"); } else { Console.WriteLine("更新失敗"); } } Console.ReadKey(); } }

 

結果:

 

 

 

3.讀取數據(運用SqlDataReader)

static void Main(string[] args) { //創建連接字符串 string connstr = "Data Source=.;Initial Catalog=db_buiness;Integrated Security=True"; using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); //打開連接 string sqltext = "select * from 職工"; using (SqlCommand comm = new SqlCommand(sqltext, conn)) { using (SqlDataReader sda = comm.ExecuteReader()) //創建數據讀取器,獲取SqlDataReader的對象  { while (sda.Read()) //一條一條來讀取  { Console.WriteLine("職工ID{0},職工號{1},倉庫號{2},姓名{3},性別{4},工資{5}", sda[0], sda[1], sda[2], sda[3], sda[4], sda[5]); } Console.ReadKey(); } } }

 

 結果:

 

3.DataSet運用(窗體程序)

首先設計窗體界面

 

主要代碼:

private void Form1_Load(object sender, EventArgs e) { //創建連接字符串 string connstr = "Data Source=.;Initial Catalog=db_buiness;Integrated Security=True"; //打開連接 using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); //執行數據庫操作 string sqltext = "Select * from 職工"; using (SqlCommand comm = new SqlCommand(sqltext, conn)) //創建命令對象  { DataSet sds = new DataSet(); //創建數據集 using (SqlDataAdapter sda= new SqlDataAdapter(comm) ) //創建數據適配器  { sda.Fill(sds); //填充數據  } this.dataGridView1.DataSource =sds.Tables[0]; //綁定數據  } } }


結果:

 

4.用戶登錄(窗體程序)

窗體界面

 

主要代碼:

 

private void btnok_Click(object sender, EventArgs e) { string user = this.txtname.Text; string pwd = this.txtpwd.Text; //創建連接字符串 string connstr = "Data Source=.;Initial Catalog=db_buiness;Integrated Security=True"; //打開連接 using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); //執行數據庫操作。 (向SqlCommand的Parameters中添加參數) string sqltext = "select * from info where name=@user and pwd=@pwd"; SqlParameter sp = new SqlParameter("@user", user); SqlParameter sp1 = new SqlParameter("@pwd", pwd); using (SqlCommand cmd = new SqlCommand(sqltext, conn)) { cmd.Parameters.Add(sp); cmd.Parameters.Add(sp1); DataTable dt = new DataTable(); //表示一個內存中數據表 using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) //創建數據適配器  { sda.Fill(dt); //填充數據  } if (dt.Rows.Count > 0) { MessageBox.Show("登陸成功"); } else { MessageBox.Show("登錄失敗"); } } } } private void btnclo_Click(object sender, EventArgs e) { this.txtname.Text= ""; this.txtpwd.Text = ""; }

 

運行結果:

 

補充:

SQL注入漏洞攻擊

—登錄判斷:select * from T_Users where UserName=... and Password=...,將參數拼到SQL語句中。
—構造惡意的Password:hello' or 1=1 --
 
—                      if (dataReader.Read())
 
—                        {

 

—                            MessageBox.Show("登陸成功");

 

—                        }

 

—                        else

 

—                        {

 

—                            MessageBox.Show("登陸失敗");

 

—                        }

 

—防范注入漏洞攻擊的方法:不使用SQL語句拼接,通過參數賦值

 

參數在SQLServer內部不是簡單的字符串替換,SQLServer直接用添加的值進行數據比較,因此不會有注入漏洞攻擊。(帶參數的sql語句內部是調用了存儲過程)

 

 

 


呵呵,今天就先寫到這里吧。其他的一些知識等用到的時候在記錄下來吧。加油!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM