版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
廣州傳智播客ADO.Net講師:嚴(yán)海彬ADO.NET為什么要學(xué)ADO.NET之前我們所學(xué)只能在查詢分析器里查看數(shù)據(jù),操作數(shù)據(jù),我們不能讓普通用戶去學(xué)sql,所以我們搭建一個界面(WebWinform)讓用戶方便的操作數(shù)據(jù)庫中的數(shù)據(jù)什么是ADO.NETADO.NET就是一組類庫,這組類庫可以讓我們通過程序的方式訪問數(shù)據(jù)庫,就像System.IO下的類用類操作文件一樣,System.Data.這組類是用來操作數(shù)據(jù)庫(不光是MSSqlServer),它提供了統(tǒng)一的編程接口讓操作其它數(shù)據(jù)庫(Access、Oracle等)的方式和操作MSSqlServer一致ADO.NET組成第一部分:數(shù)據(jù)提供程序(常用類)Connection(連接通道),用來連接數(shù)據(jù)庫Command(命令對象),用來執(zhí)行SQL語句(增刪改,查詢單個值)DataReader(數(shù)據(jù)讀取器)只讀、只進的結(jié)果集,一條一條讀取數(shù)據(jù)(StreamReader微軟的類庫中這些Reader的使用方式都差不多)DataAdapter(數(shù)據(jù)適配器),一個封裝了上面3個對象的對象。第二部分:數(shù)據(jù)集(DataSet),臨時數(shù)據(jù)庫。斷開式數(shù)據(jù)操作ADO.NET中的其他常見類ConnectionStringBuilder//自動生成連接字符串Parameter//帶參數(shù)的SQL語句Transaction//在ADO.NET中使用事務(wù)與DataSet相關(guān)的類:*DataView//視圖類,DataTable中的數(shù)據(jù)以不同的視角查看*DataRowView//DataView中的行。DataTable//DataSet中的數(shù)據(jù)表DataRow//DataTable中的行DataColumn//DataTable中的列*DataRealation//DataTable與DataTable的關(guān)系*Constraint//DataTable中建立的約束1.增刪改2.查詢單個的值負責(zé)讀取行每次讀一行一次讀取整個結(jié)果集需要將讀取的數(shù)據(jù)存入數(shù)據(jù)集客戶端的臨時倉庫訪問數(shù)據(jù)庫的方式。11.連接數(shù)據(jù)用Connection2.執(zhí)行SQL語句Command3.執(zhí)行完畢之后將結(jié)果一條一條返回。DataReader2使用DataAdapter+DataSet,這種方法本質(zhì)還是通過Connection、Command、DataReader將數(shù)據(jù)全部取出來然后放到了DataSet中。第一個對象Connection如何讓應(yīng)用程序與數(shù)據(jù)庫建立連接?Connection對象。讀取數(shù)據(jù)庫數(shù)據(jù)之前先要創(chuàng)建一條路讀取SqlServer數(shù)據(jù)庫使用創(chuàng)建SqlConnection對象獲取連接字符串VS視圖-服務(wù)器資源管理器-數(shù)據(jù)庫連接上點右鍵-添加連接
在新添的數(shù)據(jù)庫上點右鍵屬性里有連接字符串使用SqlConnectionStringBuilder幫助獲取連接字符串使用PropertyGrid控件的SelectedObject屬性與SqlConnectionStringBuilder配合使用。打開連接.(多次打開問題:ConnectionState枚舉)關(guān)閉連接//相當(dāng)于設(shè)置了路障釋放資源//相當(dāng)于把路拆了調(diào)用Connection.Dispose()【繼承自Component類的方法】方法時,內(nèi)部調(diào)用了Close()connection不能重復(fù)打開。連接SQLServer連接字符串:程序通過連接字符串指定要連哪臺服務(wù)器上的、哪個實例的哪個數(shù)據(jù)庫、用什么用戶名密碼等。ADO.Net中通過SqlConnection類創(chuàng)建到SQLServer的連接,SqlConnection代表一個數(shù)據(jù)庫連接,ADO.Net中的連接等資源都實現(xiàn)了IDisposable接口,可以使用using進行資源管理。執(zhí)行備注中的代碼如果成功了就ok。Connection的StateChange事件(ADO.NET連接池)由于每次正常連接數(shù)據(jù)庫都會至少執(zhí)行3個操作(1.登錄數(shù)據(jù)庫服務(wù)器2.執(zhí)行操作3.注銷用戶),所以每次通過Connection向數(shù)據(jù)庫服務(wù)器申請一個連接都比較耗時?!灸J(rèn)啟用了連接池】演示:有池沒池的差別(見備注1.)通過事件查看器查看效果。為了解決上述問題:ADO.Net采用了連接池的概念。*如何清空連接池?Connection的靜態(tài)方法ClearAllPools()、ClearPool()第二個對象Command操作SqlServer數(shù)據(jù)庫使用SqlCommand對象,SqlCommand表示向服務(wù)器提交的一個命令(SQL語句等)
,CommandText屬性為要執(zhí)行的SQL語句.創(chuàng)建SqlCommand對象:1.通過new關(guān)鍵字創(chuàng)建2.通過IDbConnection.CreateCommand()方法創(chuàng)建(編寫通用代碼的時候使用(多態(tài)))常用的三個方法ExecuteNonQuery()
執(zhí)行對數(shù)據(jù)庫的增刪改,返回受影響的行數(shù),適合:insert、delete、update(對于其他語句返回-1)ExecuteScalar()
執(zhí)行查詢,返回結(jié)果集的首行首列ExecuteReader()
執(zhí)行查詢,返回DataReader對象StatementCompleted事件每條SQL語句執(zhí)行完畢之后觸發(fā)。多條語句同時執(zhí)行(用分號隔開),如何獲取每條語句所影響的行數(shù)?//實際返回值為每條語句所影響的行數(shù)的和。執(zhí)行簡單的增刪改語句SqlCommand的ExecuteNonQuery執(zhí)行增刪改操作ExecuteNonQuery返回值是執(zhí)行的影響行數(shù)//執(zhí)行數(shù)據(jù)庫操作3步
//打開連接conn.Open();
//執(zhí)行操作result=cmd.ExecuteNonQuery();
//關(guān)閉連接conn.Close();使用using語句即使釋放連接資源,不用再考慮是否關(guān)閉連接,推薦使用案例,對班級表操作1.增加一個班級2.修改一個班級的名稱3.刪除一個班級的信息。異常處理在執(zhí)行數(shù)據(jù)庫操作時,如果數(shù)據(jù)庫服務(wù)器未打開,或者sql語句寫錯了會怎么樣?con.Open();cmd.Execute….();可以使用try…catch…finally來捕獲異常使用異常處理可以保證一個功能出錯不影響另一個功能,比如添加操作失敗,不影響查詢的操作一般不用try…catch,用using練習(xí)添加學(xué)生編輯學(xué)生刪除學(xué)生ExecuteScalarSqlCommand的ExecuteScalar方法用于執(zhí)行查詢,并返回查詢所返回的結(jié)果集中第一行的第一列,因為不能確定返回值的類型,所以返回值是object類型。//ExecuteScalar()方法內(nèi)部也是調(diào)用ExecuteReader()實現(xiàn)的。cmd.CommandText="selectcount(*)fromstudent";inti=Convert.ToInt32(cmd.ExecuteScalar())cmd.CommandText="selectgetdate()";DateTimedt=Convert.ToDateTime(cmd.ExecuteScalar());得到自動增長字段的主鍵值,在values關(guān)鍵詞前加上outputinserted.Id,其中Id為主鍵字段名。執(zhí)行結(jié)果就試插入的主鍵值,用ExecuteScalar執(zhí)行最方便。(output語句使用的是inserted、deleted兩個臨時表)cmd.CommandText=“insertintoclass(cName,cDescription)outputinserted.classIdvalues(‘高三一班’,‘描述’)”;inti=Convert.ToInt32(cmd.ExecuteScalar());練習(xí):添加班級窗體。返回最新添加的班級的自動編號Id執(zhí)行查詢執(zhí)行有多行結(jié)果集的用ExecuteReaderHasRow屬性返回是否有行SqlDataReaderreader=cmd.ExecuteReader();...while(reader.Read()){Console.WriteLine(reader.GetString(1));}reader的GetString、GetInt32等方法只接受整數(shù)參數(shù),也就是序號,用GetOrdinal方法根據(jù)列名動態(tài)得到序號更簡單的方法reader[‘uUserName’]為什么用using。Close:關(guān)閉以后還能打開。Dispose:直接銷毀,不能再次使用。using在出了作用域以后調(diào)用Dispose,SqlConnection、SqlDataReader等的Dispose內(nèi)部都會做這樣的判斷:判斷有沒有close,如果沒有Close就先Close再Dispose。DataReader必須獨享一個Connection。(除非設(shè)置了允許MARS,多活動結(jié)果集,在連接字符串中)案例:登陸練習(xí)第一條之前最后一條之后SqlDataReader使用注意事項返回reader后數(shù)據(jù)在哪里?數(shù)據(jù)庫服務(wù)器緩存當(dāng)使用DataReader的時候必須保證Connection為Open狀態(tài)。reader只讀(不能通過reader修改數(shù)據(jù)。)、只進reader每次讀取一條就釋放一條所以只能向前不能后退由于功能有限,所以讀取速度很快,適合從數(shù)據(jù)庫中讀取大量數(shù)據(jù)使用reader根據(jù)列索引讀取列數(shù)據(jù)而不是列名(即使是使用了列名索引區(qū)讀取數(shù)據(jù),內(nèi)部也是通過列名找到對應(yīng)列的下標(biāo),再返回)使用強類型的GetString()、GetInt32、GetFloat(1)、GetDouble()….數(shù)據(jù)庫中的類型與C#的不太一樣,數(shù)據(jù)庫中的float,得用c#的GetDouble()來獲取。IsDbNull()如果返回多個結(jié)果集則用NextResult()方法。SQL注入漏洞攻擊登錄判斷:select*fromT_UserswhereUserName=...andPassword=...,將參數(shù)拼到SQL語句中。構(gòu)造惡意的Password:hello'or1=1--if(dataReader.Read())
{MessageBox.Show("登陸成功");
}else
{MessageBox.Show("登陸失敗");
}防范注入漏洞攻擊的方法:不使用SQL語句拼接,通過參數(shù)賦值查詢參數(shù)SQL語句使用@UserName表示“此處用參數(shù)代替”,向SqlCommand的Parameters中添加參數(shù)cmd.CommandText="select*from[user]whereuUserName=@UserNameanduPwd=@Password";cmd.Parameters.Add(newSqlParameter(“@UserName","admin"));cmd.Parameters.Add(newSqlParameter(“@Password",password));參數(shù)在SQLServer內(nèi)部不是簡單的字符串替換,SQLServer直接用添加的值進行數(shù)據(jù)比較,因此不會有注入漏洞攻擊。使用事件查看器查看。SQLServer僅支持已命名參數(shù)@arg1,而Oledb、Odbc僅支持通用參數(shù)標(biāo)記(?),不同數(shù)據(jù)提供程序?qū)?shù)的寫法可能不同。案例V1.0:用戶界面中進行登錄判斷。V1.1:輸錯三次禁止登陸,15分鐘后才能繼續(xù)。用數(shù)據(jù)庫記錄ErrorTimes,最后出錯時間lastErrorDateTime。數(shù)據(jù)導(dǎo)入:從文本文件導(dǎo)入用戶信息數(shù)據(jù)導(dǎo)出:將用戶信息導(dǎo)出到文本文件案例(省市聯(lián)動)省市選擇程序,數(shù)據(jù)全部來自于數(shù)據(jù)庫:把createtable中的varchar改為nvarchar,在Insert語句的漢字前面加上N(查找“,'”替換為“,N'”)ComboBox的顯示值:Items.Add的參數(shù)是Object類型,也就是可以放任意數(shù)據(jù)類型的數(shù)據(jù),可以設(shè)置DisplayMember屬性設(shè)定顯示的屬性,通過SelectedItem屬性取得到就是選擇的條目對應(yīng)的對象。例子。疑問:取出來的是Object,怎么能轉(zhuǎn)換為對應(yīng)的類型?變量名只是“標(biāo)簽”。顯示的值和實際的對象不一樣,在ASP.Net中也有相同的東西創(chuàng)建一個ProvinceItem類,將數(shù)據(jù)填充在這個對象中添加到ComboBox中。將連接字符串寫在代碼中的缺點:多次重復(fù),違反了DRY(Don'tRepeatYourself)原則;如果要修改連接字符串就要修改代碼。將連接字符串寫在App.Config中:添加App.config文件(文件名不能改):添加→新建項→常規(guī)→應(yīng)用程序配置文件。App.config是.Net的通用配置文件,在ASP.Net中也能同樣使用。在App.config中添加connectionStrings段,添加一個add項,用name屬性起一個名字(比如DbConnStr),connectionString屬性指定連接字符串。在“引用”節(jié)點上點右鍵“添加引用”,找到System.configuration。不是所有.Net中的類都能直接調(diào)用,類所在的Assembly要被添加到項目的引用中才可以。ConfigurationManager.ConnectionStrings["DbConnStr"].ConnectionString得到連接字符串。如何在部署的程序中修改配置。注意事項:在app.config配置文件中寫連接字符串的時候不需要要加轉(zhuǎn)義符。例如:DataSource=.\SQLEXPRESS即可,不需要寫成DataSource=.\\EXPRESS練習(xí)資料管理器升級為某個類別下導(dǎo)入數(shù)據(jù)功能(文件夾下的文本文件)。在選中的子類別下增加一篇文章。在選中父類別下增加一個子類別實現(xiàn)一個刪除節(jié)點的功能類別的導(dǎo)出,導(dǎo)出的記事本。DataSet結(jié)構(gòu)DataSetDataTableDataColumnCollectionDataRowCollectionDataColumnDataRowDataTableCollection數(shù)據(jù)集數(shù)據(jù)表的集合數(shù)據(jù)表數(shù)據(jù)列的集合數(shù)據(jù)行的集合數(shù)據(jù)列數(shù)據(jù)行DataSet(斷開式數(shù)據(jù)訪問)DataSet是什么?數(shù)據(jù)的集合、臨時數(shù)據(jù)庫、內(nèi)存數(shù)據(jù)庫。(B/S程序與C/S程序?qū)ataSet的不同處理方式)每次讀取數(shù)據(jù)都創(chuàng)建連接、執(zhí)行Command得到SqlDataReader太麻煩,讓我們封裝一個方法吧!SqlDataReader是連接相關(guān)的,SqlDataReader中的查詢結(jié)果并不是放到程序中的,而是放在數(shù)據(jù)庫服務(wù)器中,SqlDataReader只是相當(dāng)于放了一個指針(游標(biāo)),只能讀取當(dāng)前游標(biāo)指向的行,一旦連接斷開就不能再讀取。這樣做的好處就是無論查詢結(jié)果有多少條,對程序占用的內(nèi)存都幾乎沒有影響。SqlDataReader為速度而生,只讀、只進,功能有限。ADO.Net中提供了數(shù)據(jù)集的機制,將查詢結(jié)果填充到本地內(nèi)存中,這樣連接斷開、服務(wù)器斷開都不影響數(shù)據(jù)的讀取。DataSet對于多層應(yīng)用程序之間傳遞數(shù)據(jù)。(現(xiàn)在大都用List<T>)DataSetdataset=newDataSet();SqlDataAdapteradapter=newSqlDataAdapter(cmd);adapter.Fill(dataset);SqlDataAdapter是DataSet和數(shù)據(jù)庫之間溝通的橋梁。數(shù)據(jù)集DataSet包含若干表DataTable,DataTable包含若干行DataRow。foreach(DataRowrowindataset.Tables[0].Rows)
row["Name"]。1.什么是DataSet?數(shù)據(jù)集合、臨時數(shù)據(jù)庫、內(nèi)存數(shù)據(jù)庫。2.手動創(chuàng)建一個DataSet,并添加數(shù)據(jù),遍歷輸出。3.通過DataReader填充DataSet。4.通過DataAdapter填充DataSet,Fill()也可以分頁(并不高效,會在服務(wù)端數(shù)據(jù)庫存儲所有的數(shù)據(jù),然后用DataReader跳過前面的數(shù)據(jù),只取后面要的數(shù)據(jù),真正的分頁應(yīng)該是在數(shù)據(jù)庫中就只查詢出當(dāng)前頁的數(shù)據(jù)。)5.斷開式數(shù)據(jù)訪問,操作完成以后調(diào)用Update()方法。(*)案例制作一個添加學(xué)生的窗體,其中的班級Id不是輸入的而是根據(jù)下拉菜單選擇的。下拉菜單的數(shù)據(jù)綁定可以使用DataSet的方式。(ComboBox的數(shù)據(jù)源綁定方法,會觸發(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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 客戶關(guān)系維護的總結(jié)與改進計劃
- 2024秋三年級英語上冊 Unit 4 We love animals Part B第一課時教學(xué)實錄 人教PEP
- 藥劑科藥品管理優(yōu)化方案計劃
- 績效提升的激勵機制計劃
- 2024年某科技公司與某小型創(chuàng)業(yè)公司關(guān)于人工智能技術(shù)研發(fā)的合同
- 2024年度資產(chǎn)包清收及處置合作意向書3篇
- 2025版高考數(shù)學(xué)一輪總復(fù)習(xí)2.6函數(shù)與方程及函數(shù)的綜合應(yīng)用習(xí)題
- 北京市西城區(qū)2024-2025學(xué)年高二歷史上學(xué)期期末試題
- 2024年度國際能源工程建設(shè)的勞務(wù)合同3篇
- 全國粵教版信息技術(shù)八年級上冊第一單元第六課《圖像效果的處理》教學(xué)實錄
- 民辦學(xué)校教職工入職背景審查制度
- 2024年新人教版四年級數(shù)學(xué)上冊《教材練習(xí)21練習(xí)二十一(附答案)》教學(xué)課件
- 2024年湛江市農(nóng)業(yè)發(fā)展集團有限公司招聘筆試沖刺題(帶答案解析)
- 二級公立醫(yī)院績效考核三級手術(shù)目錄(2020版)
- 6人小品《沒有學(xué)習(xí)的人不傷心》臺詞完整版
- 陳述句改成雙重否定句(課堂PPT)
- 人教版六年級數(shù)學(xué)上冊總復(fù)習(xí)教案
- 勞動合同法測試題含答案
- 自閉癥兒童行為檢核表學(xué)前版
- 五年級上冊數(shù)學(xué)專項練習(xí)高的畫法 全國通用
- 民警個人季度小結(jié)范文(3篇)
評論
0/150
提交評論