手麻培訓08第八天上_第1頁
手麻培訓08第八天上_第2頁
手麻培訓08第八天上_第3頁
手麻培訓08第八天上_第4頁
手麻培訓08第八天上_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

廣州傳智播客ADO.Net講師:嚴海彬ADO.NET為什么要學ADO.NET之前我們所學只能在查詢分析器里查看數據,操作數據,我們不能讓普通用戶去學sql,所以我們搭建一個界面(WebWinform)讓用戶方便的操作數據庫中的數據什么是ADO.NETADO.NET就是一組類庫,這組類庫可以讓我們通過程序的方式訪問數據庫,就像System.IO下的類用類操作文件一樣,System.Data.這組類是用來操作數據庫(不光是MSSqlServer),它提供了統(tǒng)一的編程接口讓操作其它數據庫(Access、Oracle等)的方式和操作MSSqlServer一致ADO.NET組成第一部分:數據提供程序(常用類)Connection(連接通道),用來連接數據庫Command(命令對象),用來執(zhí)行SQL語句(增刪改,查詢單個值)DataReader(數據讀取器)只讀、只進的結果集,一條一條讀取數據(StreamReader微軟的類庫中這些Reader的使用方式都差不多)DataAdapter(數據適配器),一個封裝了上面3個對象的對象。第二部分:數據集(DataSet),臨時數據庫。斷開式數據操作ADO.NET中的其他常見類ConnectionStringBuilder//自動生成連接字符串Parameter//帶參數的SQL語句Transaction//在ADO.NET中使用事務與DataSet相關的類:*DataView//視圖類,DataTable中的數據以不同的視角查看*DataRowView//DataView中的行。DataTable//DataSet中的數據表DataRow//DataTable中的行DataColumn//DataTable中的列*DataRealation//DataTable與DataTable的關系*Constraint//DataTable中建立的約束1.增刪改2.查詢單個的值負責讀取行每次讀一行一次讀取整個結果集需要將讀取的數據存入數據集客戶端的臨時倉庫訪問數據庫的方式。11.連接數據用Connection2.執(zhí)行SQL語句Command3.執(zhí)行完畢之后將結果一條一條返回。DataReader2使用DataAdapter+DataSet,這種方法本質還是通過Connection、Command、DataReader將數據全部取出來然后放到了DataSet中。第一個對象Connection如何讓應用程序與數據庫建立連接?Connection對象。讀取數據庫數據之前先要創(chuàng)建一條路讀取SqlServer數據庫使用創(chuàng)建SqlConnection對象獲取連接字符串VS視圖-服務器資源管理器-數據庫連接上點右鍵-添加連接

在新添的數據庫上點右鍵屬性里有連接字符串使用SqlConnectionStringBuilder幫助獲取連接字符串使用PropertyGrid控件的SelectedObject屬性與SqlConnectionStringBuilder配合使用。打開連接.(多次打開問題:ConnectionState枚舉)關閉連接//相當于設置了路障釋放資源//相當于把路拆了調用Connection.Dispose()【繼承自Component類的方法】方法時,內部調用了Close()connection不能重復打開。連接SQLServer連接字符串:程序通過連接字符串指定要連哪臺服務器上的、哪個實例的哪個數據庫、用什么用戶名密碼等。ADO.Net中通過SqlConnection類創(chuàng)建到SQLServer的連接,SqlConnection代表一個數據庫連接,ADO.Net中的連接等資源都實現(xiàn)了IDisposable接口,可以使用using進行資源管理。執(zhí)行備注中的代碼如果成功了就ok。Connection的StateChange事件(ADO.NET連接池)由于每次正常連接數據庫都會至少執(zhí)行3個操作(1.登錄數據庫服務器2.執(zhí)行操作3.注銷用戶),所以每次通過Connection向數據庫服務器申請一個連接都比較耗時。【默認啟用了連接池】演示:有池沒池的差別(見備注1.)通過事件查看器查看效果。為了解決上述問題:ADO.Net采用了連接池的概念。*如何清空連接池?Connection的靜態(tài)方法ClearAllPools()、ClearPool()第二個對象Command操作SqlServer數據庫使用SqlCommand對象,SqlCommand表示向服務器提交的一個命令(SQL語句等)

,CommandText屬性為要執(zhí)行的SQL語句.創(chuàng)建SqlCommand對象:1.通過new關鍵字創(chuàng)建2.通過IDbConnection.CreateCommand()方法創(chuàng)建(編寫通用代碼的時候使用(多態(tài)))常用的三個方法ExecuteNonQuery()

執(zhí)行對數據庫的增刪改,返回受影響的行數,適合:insert、delete、update(對于其他語句返回-1)ExecuteScalar()

執(zhí)行查詢,返回結果集的首行首列ExecuteReader()

執(zhí)行查詢,返回DataReader對象StatementCompleted事件每條SQL語句執(zhí)行完畢之后觸發(fā)。多條語句同時執(zhí)行(用分號隔開),如何獲取每條語句所影響的行數?//實際返回值為每條語句所影響的行數的和。執(zhí)行簡單的增刪改語句SqlCommand的ExecuteNonQuery執(zhí)行增刪改操作ExecuteNonQuery返回值是執(zhí)行的影響行數//執(zhí)行數據庫操作3步

//打開連接conn.Open();

//執(zhí)行操作result=cmd.ExecuteNonQuery();

//關閉連接conn.Close();使用using語句即使釋放連接資源,不用再考慮是否關閉連接,推薦使用案例,對班級表操作1.增加一個班級2.修改一個班級的名稱3.刪除一個班級的信息。異常處理在執(zhí)行數據庫操作時,如果數據庫服務器未打開,或者sql語句寫錯了會怎么樣?con.Open();cmd.Execute….();可以使用try…catch…finally來捕獲異常使用異常處理可以保證一個功能出錯不影響另一個功能,比如添加操作失敗,不影響查詢的操作一般不用try…catch,用using練習添加學生編輯學生刪除學生ExecuteScalarSqlCommand的ExecuteScalar方法用于執(zhí)行查詢,并返回查詢所返回的結果集中第一行的第一列,因為不能確定返回值的類型,所以返回值是object類型。//ExecuteScalar()方法內部也是調用ExecuteReader()實現(xiàn)的。cmd.CommandText="selectcount(*)fromstudent";inti=Convert.ToInt32(cmd.ExecuteScalar())cmd.CommandText="selectgetdate()";DateTimedt=Convert.ToDateTime(cmd.ExecuteScalar());得到自動增長字段的主鍵值,在values關鍵詞前加上outputinserted.Id,其中Id為主鍵字段名。執(zhí)行結果就試插入的主鍵值,用ExecuteScalar執(zhí)行最方便。(output語句使用的是inserted、deleted兩個臨時表)cmd.CommandText=“insertintoclass(cName,cDescription)outputinserted.classIdvalues(‘高三一班’,‘描述’)”;inti=Convert.ToInt32(cmd.ExecuteScalar());練習:添加班級窗體。返回最新添加的班級的自動編號Id執(zhí)行查詢執(zhí)行有多行結果集的用ExecuteReaderHasRow屬性返回是否有行SqlDataReaderreader=cmd.ExecuteReader();...while(reader.Read()){Console.WriteLine(reader.GetString(1));}reader的GetString、GetInt32等方法只接受整數參數,也就是序號,用GetOrdinal方法根據列名動態(tài)得到序號更簡單的方法reader[‘uUserName’]為什么用using。Close:關閉以后還能打開。Dispose:直接銷毀,不能再次使用。using在出了作用域以后調用Dispose,SqlConnection、SqlDataReader等的Dispose內部都會做這樣的判斷:判斷有沒有close,如果沒有Close就先Close再Dispose。DataReader必須獨享一個Connection。(除非設置了允許MARS,多活動結果集,在連接字符串中)案例:登陸練習第一條之前最后一條之后SqlDataReader使用注意事項返回reader后數據在哪里?數據庫服務器緩存當使用DataReader的時候必須保證Connection為Open狀態(tài)。reader只讀(不能通過reader修改數據。)、只進reader每次讀取一條就釋放一條所以只能向前不能后退由于功能有限,所以讀取速度很快,適合從數據庫中讀取大量數據使用reader根據列索引讀取列數據而不是列名(即使是使用了列名索引區(qū)讀取數據,內部也是通過列名找到對應列的下標,再返回)使用強類型的GetString()、GetInt32、GetFloat(1)、GetDouble()….數據庫中的類型與C#的不太一樣,數據庫中的float,得用c#的GetDouble()來獲取。IsDbNull()如果返回多個結果集則用NextResult()方法。SQL注入漏洞攻擊登錄判斷:select*fromT_UserswhereUserName=...andPassword=...,將參數拼到SQL語句中。構造惡意的Password:hello'or1=1--if(dataReader.Read())

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

}else

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

}防范注入漏洞攻擊的方法:不使用SQL語句拼接,通過參數賦值查詢參數SQL語句使用@UserName表示“此處用參數代替”,向SqlCommand的Parameters中添加參數cmd.CommandText="select*from[user]whereuUserName=@UserNameanduPwd=@Password";cmd.Parameters.Add(newSqlParameter(“@UserName","admin"));cmd.Parameters.Add(newSqlParameter(“@Password",password));參數在SQLServer內部不是簡單的字符串替換,SQLServer直接用添加的值進行數據比較,因此不會有注入漏洞攻擊。使用事件查看器查看。SQLServer僅支持已命名參數@arg1,而Oledb、Odbc僅支持通用參數標記(?),不同數據提供程序對參數的寫法可能不同。案例V1.0:用戶界面中進行登錄判斷。V1.1:輸錯三次禁止登陸,15分鐘后才能繼續(xù)。用數據庫記錄ErrorTimes,最后出錯時間lastErrorDateTime。數據導入:從文本文件導入用戶信息數據導出:將用戶信息導出到文本文件案例(省市聯(lián)動)省市選擇程序,數據全部來自于數據庫:把createtable中的varchar改為nvarchar,在Insert語句的漢字前面加上N(查找“,'”替換為“,N'”)ComboBox的顯示值:Items.Add的參數是Object類型,也就是可以放任意數據類型的數據,可以設置DisplayMember屬性設定顯示的屬性,通過SelectedItem屬性取得到就是選擇的條目對應的對象。例子。疑問:取出來的是Object,怎么能轉換為對應的類型?變量名只是“標簽”。顯示的值和實際的對象不一樣,在ASP.Net中也有相同的東西創(chuàng)建一個ProvinceItem類,將數據填充在這個對象中添加到ComboBox中。將連接字符串寫在代碼中的缺點:多次重復,違反了DRY(Don'tRepeatYourself)原則;如果要修改連接字符串就要修改代碼。將連接字符串寫在App.Config中:添加App.config文件(文件名不能改):添加→新建項→常規(guī)→應用程序配置文件。App.config是.Net的通用配置文件,在ASP.Net中也能同樣使用。在App.config中添加connectionStrings段,添加一個add項,用name屬性起一個名字(比如DbConnStr),connectionString屬性指定連接字符串。在“引用”節(jié)點上點右鍵“添加引用”,找到System.configuration。不是所有.Net中的類都能直接調用,類所在的Assembly要被添加到項目的引用中才可以。ConfigurationManager.ConnectionStrings["DbConnStr"].ConnectionString得到連接字符串。如何在部署的程序中修改配置。注意事項:在app.config配置文件中寫連接字符串的時候不需要要加轉義符。例如:DataSource=.\SQLEXPRESS即可,不需要寫成DataSource=.\\EXPRESS練習資料管理器升級為某個類別下導入數據功能(文件夾下的文本文件)。在選中的子類別下增加一篇文章。在選中父類別下增加一個子類別實現(xiàn)一個刪除節(jié)點的功能類別的導出,導出的記事本。DataSet結構DataSetDataTableDataColumnCollectionDataRowCollectionDataColumnDataRowDataTableCollection數據集數據表的集合數據表數據列的集合數據行的集合數據列數據行DataSet(斷開式數據訪問)DataSet是什么?數據的集合、臨時數據庫、內存數據庫。(B/S程序與C/S程序對DataSet的不同處理方式)每次讀取數據都創(chuàng)建連接、執(zhí)行Command得到SqlDataReader太麻煩,讓我們封裝一個方法吧!SqlDataReader是連接相關的,SqlDataReader中的查詢結果并不是放到程序中的,而是放在數據庫服務器中,SqlDataReader只是相當于放了一個指針(游標),只能讀取當前游標指向的行,一旦連接斷開就不能再讀取。這樣做的好處就是無論查詢結果有多少條,對程序占用的內存都幾乎沒有影響。SqlDataReader為速度而生,只讀、只進,功能有限。ADO.Net中提供了數據集的機制,將查詢結果填充到本地內存中,這樣連接斷開、服務器斷開都不影響數據的讀取。DataSet對于多層應用程序之間傳遞數據。(現(xiàn)在大都用List<T>)DataSetdataset=newDataSet();SqlDataAdapteradapter=newSqlDataAdapter(cmd);adapter.Fill(dataset);SqlDataAdapter是DataSet和數據庫之間溝通的橋梁。數據集DataSet包含若干表DataTable,DataTable包含若干行DataRow。foreach(DataRowrowindataset.Tables[0].Rows)

row["Name"]。1.什么是DataSet?數據集合、臨時數據庫、內存數據庫。2.手動創(chuàng)建一個DataSet,并添加數據,遍歷輸出。3.通過DataReader填充DataSet。4.通過DataAdapter填充DataSet,Fill()也可以分頁(并不高效,會在服務端數據庫存儲所有的數據,然后用DataReader跳過前面的數據,只取后面要的數據,真正的分頁應該是在數據庫中就只查詢出當前頁的數據。)5.斷開式數據訪問,操作完成以后調用Update()方法。(*)案例制作一個添加學生的窗體,其中的班級Id不是輸入的而是根據下拉菜單選擇的。下拉菜單的數據綁定可以使用DataSet的方式。(ComboBox的數據源綁定方法,會觸發(fā)“選擇項改變事件”,不要將DataSource綁定寫在前面。)解決辦法:將cbo.DisplayMember=“cityName”;與cbo.ValueMember=“cityId”寫在cbo.DataSource=dt;之前。cbo.DisplayMember=“cityName”;→[1]cbo.ValueMember=“cityId”→[2]cbo.DataSource=dt;→[3]1.通過DataAdapter的Fill方法填充DataSet中的表。2.創(chuàng)建DataAdapter的時候,只需指定連接字符串和查詢語句,會自動生成SelectCommand.3.通過SqlCommandBuilder自動創(chuàng)建InsertCommand

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論