版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
計(jì)算機(jī)軟件技術(shù)基礎(chǔ)
第六章數(shù)據(jù)訪問信息技術(shù)系徐家臻本課主要內(nèi)容
數(shù)據(jù)控件
是一組向.NETFramework程序員公開數(shù)據(jù)訪問服務(wù)的類。包括以下主要內(nèi)容:對象名稱說明Connection創(chuàng)建了.NET程序與數(shù)據(jù)源(數(shù)據(jù)庫)的連接Command執(zhí)行SQL操作DataAdapter在數(shù)據(jù)源和數(shù)據(jù)集之間交換數(shù)據(jù)DataReader由Command的查詢命令返回的、只能向前光標(biāo),只能讀取而不能寫入DataTable.NET數(shù)據(jù)集,緩存來自數(shù)據(jù)源的數(shù)據(jù)。提供了與數(shù)據(jù)源斷開連接時(shí)管理數(shù)據(jù)的機(jī)制,可以由DataAdapter對象從數(shù)據(jù)源填充或更新到數(shù)據(jù)源。
因?yàn)椴煌臄?shù)據(jù)庫系統(tǒng)和不同的連接方式需要不同的實(shí)現(xiàn)手段,因此以上各類都按照專門針對某個(gè)數(shù)據(jù)庫系統(tǒng)或者某種連接方式進(jìn)一步分類。例如Connection類系列包括專門連接SqlServer的SqlConnection類,采用OLE方式連接的各種數(shù)據(jù)庫的OleConnection類,采用ODBC方式連接各種數(shù)據(jù)庫的ODBCConnection類等,還可以下載使用第三方提供的或自定義的Connection類。
訪問數(shù)據(jù)庫步驟:初始化一個(gè)Connection對象,打開數(shù)據(jù)庫的連接。初始化一個(gè)Command對象,執(zhí)行操作數(shù)據(jù)庫的SQL語句。如果需要獲取數(shù)據(jù),用DataReader、DataTable或DataSet,保存Command的執(zhí)行結(jié)果。關(guān)閉數(shù)據(jù)庫連接。的相關(guān)類位于System.Data命名空間。中與SQLServer的相關(guān)類位于System.Data.SqlClient命名空間。
連接字符串在連接數(shù)據(jù)庫前,需要為連接設(shè)置連接串,連接串就相當(dāng)于告訴應(yīng)用程序怎樣找到數(shù)據(jù)庫去進(jìn)行連接。
標(biāo)準(zhǔn)方式server='服務(wù)器地址';database='數(shù)據(jù)庫名稱';uid='數(shù)據(jù)庫用戶名';pwd='數(shù)據(jù)庫密碼';例如:"server='(local)';database='mydb';uid='sa';pwd='sa';"文件方式
datasource=數(shù)據(jù)源名;IntegratedSecurity=SSPI;AttachDBFilename=|DataDirectory|\數(shù)據(jù)庫文件名.mdf;UserInstance=true
例如:
datasource=.\SQLEXPRESS;IntegratedSecurity=SSPI;AttachDBFilename=|DataDirectory|\Database1.mdf;UserInstance=true
用DataReader查詢數(shù)據(jù)stringconnStr=@"datasource=.\SQLEXPRESS;IntegratedSecurity=SSPI;AttachDBFilename=c:\Database1.mdf;UserInstance=true";SqlConnectionconn=newSqlConnection(connStr);conn.Open();stringsql="select*fromstudents";mandcmd=newmand(sql,conn);SqlDataReaderreader=cmd.ExecuteReader();while(reader.Read()){Console.WriteLine("{0}\t{1}\t{2}\t{3:d}\t",reader["id"],reader["name"],reader["major"],reader["birth"]);}conn.Close();
用DataTable查詢數(shù)據(jù)SqlConnectionconn=newSqlConnection(connStr);conn.Open();stringsql="select*fromstudents";mandcmd=newmand(sql,conn);SqlDataAdapterda=newSqlDataAdapter(cmd);DataTabledt=newDataTable();da.Fill(dt);conn.Close();
用DataTable查詢數(shù)據(jù)for(inti=0;i<dt.Rows.Count;i++){Console.WriteLine("{0}\t{1}\t{2}\t{3:d}\t",dt.Rows[i]["id"],dt.Rows[i]["name"],dt.Rows[i]["major"],dt.Rows[i]["birth"]);}Console.WriteLine();dt.DefaultView.Sort="birthdesc";DataTablenewDt=dt.DefaultView.ToTable();for(inti=0;i<dt.Rows.Count;i++){Console.WriteLine("{0}\t{1}\t{2}\t{3:d}\t",newDt.Rows[i]["id"],newDt.Rows[i]["name"],newDt.Rows[i]["major"],newDt.Rows[i]["birth"]);}
DataReaderVSDataTable/DataSetDataReader的功能較弱,它像一個(gè)游標(biāo),只能用于讀取數(shù)據(jù),而且只能單向逐條訪問數(shù)據(jù)表中的記錄,優(yōu)點(diǎn)是效率較高。DataTable的功能較強(qiáng),DataTable可以把獲取的一定數(shù)量的數(shù)據(jù)保存在內(nèi)存中,并提供查找和排序等操作DataSet包括若干個(gè)DataTable,它甚至可以保存這些DataTable之間的關(guān)系。它的缺點(diǎn)是效率相對DataReader較低。
修改數(shù)據(jù)SqlConnectionconn=newSqlConnection(connStr);conn.Open();stringsql="updatestudentssetaddr='西五'whereid='20110004'";mandcmd=newmand(sql,conn);intn=cmd.ExecuteNonQuery();Console.WriteLine("該操作影響了{(lán)0}行",n);conn.Close();
查詢單個(gè)數(shù)據(jù)SqlConnectionconn=newSqlConnection(connStr);conn.Open();stringsql="selectcount(*)fromstudents";mandcmd=newmand(sql,conn);intcount=(int)cmd.ExecuteScalar();Console.WriteLine("共有{0}名學(xué)生",count);conn.Close();
參數(shù)化查詢假設(shè)需要驗(yàn)證用戶登錄時(shí)的身份創(chuàng)建一張數(shù)據(jù)表Authentication,包含兩列usernamepassword分別保存合法的用戶名和密碼。創(chuàng)建一個(gè)頁面
protectedvoidButton1_Click(objectsender,EventArgse){…stringsql="selectcount(*)fromAuthentication";sql+="whereusername='"+TbUserName.Text.Trim()+"'";sql+="andpassword='"+TbPassword.Text.Trim()+"'";mandcmd=newmand(sql,conn);objectrslt=cmd.ExecuteScalar();if(rslt!=null&&(int)rslt!=0){LbMsg.Text="通過身份驗(yàn)證";}else{LbMsg.Text="用戶名或密碼錯(cuò)誤";}…}
存在漏洞,因?yàn)閷?shí)際執(zhí)行內(nèi)容為:selectcount(*)fromAuthenticationwhereusername=‘a(chǎn)dmin’andpassword=‘1’or‘a(chǎn)’=‘a(chǎn)’
參數(shù)化查詢(Parameter方式)stringsql=@"selectcount(*)fromAuthenticationwhereusername=@usernameandpassword=@password";mandcmd=newmand(sql,conn);cmd.Parameters.AddWithValue("@username",TbUserName.Text);cmd.Parameters.AddWithValue("@password",TbPassword.Text);此時(shí)TbPassword控件的輸入值會(huì)被當(dāng)做一個(gè)字符串傳入sql變量中,作為password的值數(shù)據(jù)封裝創(chuàng)建SqlHelper類,封裝常見操作ExecNonQueryExecScalarExecReader在Web.config中設(shè)定連接字符串<connectionStrings><addname="DatabaseConnectionString1"connectionString="連接字符串"/></connectionStrings>數(shù)據(jù)封裝publicclassSqlHelper{ publicstaticstringconnStr=WebConfigurationManager.ConnectionStrings["DatabaseConnectionString1"].ToString();...數(shù)據(jù)封裝publicstaticintExecNonQuery(stringsql,SqlParameter[]paras=null){using(SqlConnectionconn=newSqlConnection(connStr)){conn.Open();mandcmd=newmand(sql,conn);cmd.Parameters.Clear();if(paras!=null){cmd.Parameters.AddRange(paras);}returncmd.ExecuteNonQuery();}}using語句除用做引入命名空間外,也可以用于表示強(qiáng)制釋放資源。以上語句表示conn變量的作用范圍是using后面的{}中,也就是說,在{}之間的語句全部結(jié)束后,.NET會(huì)調(diào)用conn的Dispose方法,該方法通常用于清理其占用的資源數(shù)據(jù)封裝為什么這里使用using而不是直接調(diào)用Close?考慮到訪問數(shù)據(jù)庫可能會(huì)發(fā)生異常,如果發(fā)生異常時(shí)不做處理,上述一系列語句會(huì)中斷執(zhí)行,Close語句也就沒有執(zhí)行到,數(shù)據(jù)庫的連接仍處于開啟狀態(tài)。如果多個(gè)發(fā)生異常的用戶同時(shí)占用了這些連接,新的用戶就無法正常獲取連接資源,訪問數(shù)據(jù)庫了。使用using則不會(huì)存在這個(gè)問題,當(dāng)程序離開using作用域時(shí),連接就被自動(dòng)關(guān)閉了。如果不使用using,通常需要try…catch…finally語句保證連接的關(guān)閉。數(shù)據(jù)封裝publicstaticobjectExecScalar(stringsql,SqlParameter[]paras=null){using(SqlConnectionconn=newSqlConnection(connStr)){conn.Open();mandcmd=newmand(sql,conn);cmd.Parameters.Clear();if(paras!=null){cmd.Parameters.AddRange(paras);}returncmd.ExecuteScalar();}}數(shù)據(jù)封裝publicstaticIDataReaderExecReader(stringsql,SqlParameter[]paras=null){SqlConnectionconn=newSqlConnection(connStr);SqlDataReaderreader;try{conn.Open();mandcmd=newmand(sql,conn);cmd.Parameters.Clear();if(paras!=null){cmd.Parameters.AddRange(paras);}reader=cmd.ExecuteReader(CommandBehavior.CloseConnection);}catch{conn.Close();throw;}returnreader;}數(shù)據(jù)封裝調(diào)用的cmd.ExecuteReader傳入了CommandBehavior.CloseConnection參數(shù)。DataReader是一個(gè)游標(biāo),記錄的是當(dāng)前訪問的是數(shù)據(jù)庫表的哪一行,因此在完成對全部數(shù)據(jù)行的獲取和處理之前,不能關(guān)閉數(shù)據(jù)庫連接。然而連接變量conn是SqlHelper類的ExecReader方法的局部變量,在該方法以外無法訪問,即無法調(diào)用conn.Close方法。.NET提供了CommandBehavior參數(shù),CommandBehavior.CloseConnection表示,只要調(diào)用DataReader的Close方法,即可關(guān)閉它對應(yīng)的Connection,這樣,我們就可以在該方法以外的地方關(guān)閉數(shù)據(jù)庫連接了。數(shù)據(jù)控件數(shù)據(jù)源控件(如SqlDataSource)數(shù)據(jù)源控件用來配置數(shù)據(jù)源,當(dāng)設(shè)置數(shù)據(jù)綁定控件綁定數(shù)據(jù)源控件時(shí),就能夠通過數(shù)據(jù)庫源控件來獲取數(shù)據(jù)源中的數(shù)據(jù)。數(shù)據(jù)綁定控件(如GridView)通過與數(shù)據(jù)源控件綁定,顯示數(shù)據(jù)庫的內(nèi)容。數(shù)據(jù)控件數(shù)據(jù)綁定控件GridViewGridView以表格形式顯示數(shù)據(jù)庫的數(shù)據(jù)列表。開發(fā)人員能夠通過配置數(shù)據(jù)源控件對GridView中的數(shù)據(jù)進(jìn)行選擇、排序、分頁、編輯和刪除功能進(jìn)行配置。GridView控件還能夠指定自定義樣式。DetailsViewDetailsView控件以表格形式顯示數(shù)據(jù)庫中的一行數(shù)據(jù)。數(shù)據(jù)控件SqlDataSource與GridView基本用法示例修改網(wǎng)頁中數(shù)據(jù)表格的外觀修改GridView中列的HeaderText設(shè)置GridView的顯示格式。在GridView“任務(wù)”中選擇“啟用排序”、“啟用分頁”在GridView的屬性中設(shè)置每頁顯示的記錄數(shù)PageSize數(shù)據(jù)控件SqlDataSource與GridView的更新與刪除功能在SqlDataSource“任務(wù)”中,選擇“高級(jí)”-“生成insert、update和delete語句”在GridView“任務(wù)”中,選擇“啟用編輯”和“啟用刪除”GridView+DetailsView級(jí)聯(lián)查詢GridView+DetailsView跨頁查詢數(shù)據(jù)控件GridView與混合使用GridView的除了可以設(shè)置為綁定數(shù)據(jù)源控件外,也可以設(shè)置為綁定到DataReader、DataTable或者集合類型的對象。學(xué)生信息管理示例列表增加刪除修改GridView控件的事件GridView控件的事件通常對GridView控件進(jìn)行排序、選擇等操作時(shí),同樣會(huì)引發(fā)事件。當(dāng)創(chuàng)建當(dāng)前行或?qū)?dāng)前行綁定至數(shù)據(jù)時(shí)發(fā)生的事件。單擊一個(gè)命令控件時(shí)也會(huì)引發(fā)事件。mand:在GridView控件中單擊某個(gè)按鈕時(shí)發(fā)生。此事件通常用于在該控件中單擊某個(gè)按鈕時(shí)執(zhí)行某項(xiàng)任務(wù)。GridView控件的事件PageIndexChanging:在單擊頁導(dǎo)航按鈕時(shí)發(fā)生,但在GridView控件執(zhí)行分頁操作之前。此事件通常用于取消分頁操作。PageIndexChanged:在單擊頁導(dǎo)航按鈕時(shí)發(fā)生,但在GridView控件執(zhí)行分頁操作之后。此事件通常用于在用戶定位到該控件中不同的頁之后需要執(zhí)行某項(xiàng)任務(wù)時(shí)。GridView控件的事件Sorting:在單擊某個(gè)用于對列進(jìn)行排序的超鏈接時(shí)發(fā)生,但在GridView控件執(zhí)行排序操作之前。此事件通常用于取消排序操作或執(zhí)行自定義的排序例程。Sorted:在單擊某個(gè)用于對列進(jìn)行排序的超鏈接時(shí)發(fā)生,但在GridView控件執(zhí)行排序操作之后。此事件通常用于在用戶單擊對列進(jìn)行排序的超鏈接之后執(zhí)行某項(xiàng)任務(wù)。GridView控件的事件RowDataBound:在GridView控件中的某個(gè)行被綁定到一個(gè)數(shù)據(jù)記錄時(shí)發(fā)生。此事件通常用于在某個(gè)行被綁定到數(shù)據(jù)時(shí)修改該行的內(nèi)容。RowCreated:在GridView控件中創(chuàng)建新行時(shí)發(fā)生。此事件通常用于在創(chuàng)建某個(gè)行時(shí)修改該行的布局或外觀。GridView控件的事件RowDeleting:在單擊GridView控件內(nèi)某一行的Delete按鈕(其CommandName屬性設(shè)置為“Delete”的按鈕)時(shí)發(fā)生,但在GridView控件從數(shù)據(jù)源刪除記錄之前。此事件通常用于取消刪除操作。RowDeleted:在單擊GridView控件內(nèi)某一行的Delete按鈕時(shí)發(fā)生,但在GridView控件從數(shù)據(jù)源刪除記錄之后。此事件通常用于檢查刪除操作的結(jié)果。GridView控件的事件RowEditing:在單擊GridView控件內(nèi)某一行的Edit按鈕(其CommandName屬性設(shè)置為“Edit”的按鈕)時(shí)發(fā)生,但在GridView控件進(jìn)入編輯模式之前。此事件通常用于取消編輯操作。RowCancelingEdit:在單擊GridView控件內(nèi)某一行的Cancel按鈕(其CommandName屬性設(shè)置為“Cancel”的按鈕)時(shí)發(fā)生,但在GridView控件退出編輯模式之前。此事件通常用于停止取消操作。GridView控件的事件RowUpdating:在單擊GridView控件內(nèi)某一行的Update按鈕(其CommandName屬性設(shè)置為“Update”的按鈕)時(shí)發(fā)生,但在GridView控件更新記錄之前。此事件通常用于取消更新操作。RowUpdated:在單擊GridView控件內(nèi)某一行的Update按鈕時(shí)發(fā)生,但在GridView控件更新記錄之后。此事件通常用來檢查更新操作的結(jié)果。GridView控件的事件GridView控件事件的關(guān)鍵是找到事件發(fā)生的行號(hào),并且能夠訪問該行的各項(xiàng)數(shù)據(jù)。獲得mand事件發(fā)生的行號(hào)。protectedvoidGridView1_mand(objectsender,mandEventArgse){if(mandName=="Edit"){intindex=Convert.ToInt32(mandArgument);GridViewRowr=GridView1.Rows[index];Response.Write(r.Cells[1].Text);
}}GridView控件的事件獲得RowXXXing和RowXXXed的行號(hào)該類事件的委托形如
protectedvoidGridView1_RowXXXed(objectsender,GridViewRowEventArgse)其中,e.Row為剛剛綁定的該“行”對象,e.Row.Cells為行的“列”對象(在頁面上呈現(xiàn)出來的值)e.Row.DataItem為該行對應(yīng)的數(shù)據(jù)對象(數(shù)據(jù)庫中的值)GridView控件的事件示例假設(shè)每位員工每月都會(huì)完成一定的業(yè)績,要求對于每月小于50的那些員工業(yè)績,予以紅色顯示。protectedvoidGridView1_RowDataBound(objectsender,GridViewRowEventArgse){
DataRowViewdrv=(DataRowView)e.Row.DataItem;if(drv!=null&&(int)drv["achievement"]<50){
e.Row.Cells[3].ForeColor=System.Drawing.Color.Red;}}GridView的模板列GridView控件的一個(gè)重要類型是模板列(TemplateField),它可以使用模板完全定制列的內(nèi)容。模板是一個(gè)可以添加其他內(nèi)容的容器,如文本、HTML標(biāo)簽或者控件等,均可添加到模板中。ItemTemplate:控制顯示數(shù)據(jù)中的一項(xiàng)AlternatingItemTemplate:控制顯示替換項(xiàng)的一項(xiàng)EditItemTemplate:控制顯示編輯模式下的一項(xiàng)InsertItemTemplate:控制顯示插入模式下的一項(xiàng)HeaderTemplate:控制顯示標(biāo)題FooterTemplate:控制顯示腳注GridView的模板列示例數(shù)據(jù)行中的有些項(xiàng)目,例如性別、專業(yè)、籍貫等,應(yīng)該設(shè)定選項(xiàng)供用戶選擇,而不適合直接采用文本框來接收用戶輸入。GridView的模板列轉(zhuǎn)換前<asp:BoundFieldDataField=“major”HeaderText=“專業(yè)"/>轉(zhuǎn)換后<asp:TemplateFieldHeaderText="專業(yè)">
<EditItemTemplate>
<asp:TextBoxID="TextBox1"runat="server" Text='<%#Bind("major")%>'></asp:TextBox></EditItemTemplate>
<ItemTemplate>
<asp:LabelID="Label1"runat="server" Text='<%#Bind("major")%>'></asp:Label></ItemTemplate></asp:TemplateField><%#Bind(“dataField”)%>用來在aspx表示該空間直接綁定到對于行列的數(shù)據(jù)GridView的模板列用下拉列表框替換文本框<EditItemTemplate><asp:DropDownListID="DropDownList1"runat="server"><asp:ListItemValue="司法"></asp:ListItem><asp:ListItemValue="私營業(yè)主"></asp:ListItem><asp:ListItemValue="軍人"></asp:ListItem><asp:ListItemValue="宗教"></asp:ListItem><asp:ListItemValue="風(fēng)水"></asp:ListItem><asp:ListItemValue="餐飲"></asp:ListItem><asp:ListItemValue="服務(wù)業(yè)"></asp:ListItem><asp:ListItemValue="其他"></asp:ListItem></asp:DropDownList></EditItemTemplate>GridView的模板列在GridView每行數(shù)據(jù)綁定時(shí),修改DropDownList的默認(rèn)選項(xiàng)protectedv
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度餐飲行業(yè)冷鏈配送與質(zhì)量追溯體系合同3篇
- 鄭州科技學(xué)院《風(fēng)景人像基礎(chǔ)教程》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025版互聯(lián)網(wǎng)金融服務(wù)委托理財(cái)合同范本庫3篇
- 2025年行政合同簽訂及管理中行政優(yōu)先權(quán)的法律風(fēng)險(xiǎn)防范指南2篇
- 美容院股份轉(zhuǎn)讓服務(wù)協(xié)議(2025版)2篇
- 二零二五版美容美發(fā)行業(yè)美容院品牌推廣服務(wù)合同4篇
- 2025年度個(gè)人反擔(dān)保協(xié)議樣本:教育機(jī)構(gòu)貸款融資專用4篇
- 2025版全面升級(jí)危險(xiǎn)品物流運(yùn)輸合同范本3篇
- 西安市2025年度汽車租賃企業(yè)服務(wù)質(zhì)量評(píng)價(jià)體系3篇
- 2025年度菜鳥驛站綠色物流體系建設(shè)與推廣合同3篇
- 圓周率的認(rèn)識(shí)
- 基于SMT求解器的分支條件覆蓋測試
- 反騷擾政策程序
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件第十一章運(yùn)動(dòng)技能的練習(xí)
- 射頻在疼痛治療中的應(yīng)用
- 四年級(jí)數(shù)學(xué)豎式計(jì)算100道文檔
- “新零售”模式下生鮮電商的營銷策略研究-以盒馬鮮生為例
- 項(xiàng)痹病辨證施護(hù)
- 懷化市數(shù)字經(jīng)濟(jì)產(chǎn)業(yè)發(fā)展概況及未來投資可行性研究報(bào)告
- 07FD02 防空地下室電氣設(shè)備安裝
- 教師高中化學(xué)大單元教學(xué)培訓(xùn)心得體會(huì)
評(píng)論
0/150
提交評(píng)論