.net中ADO的使用vb.net_第1頁
.net中ADO的使用vb.net_第2頁
.net中ADO的使用vb.net_第3頁
.net中ADO的使用vb.net_第4頁
.net中ADO的使用vb.net_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、ado.net數(shù)據(jù)操作1、 概念區(qū)分:直連方式(以下簡稱為a):操作數(shù)據(jù)時(shí)必須保持?jǐn)?shù)據(jù)庫的連接,以只讀向前的方式讀取數(shù)據(jù)無連接方式(以下簡稱為b):采用dataset方式在客戶端中緩存數(shù)據(jù),dataadapter 只在update和fill的時(shí)候才需要連接數(shù)據(jù)庫,由dataadapter自動(dòng)去連接以及斷開數(shù)據(jù)庫連接,在工具箱中集成了支持拖放的dataadapter等2、 數(shù)據(jù)查詢(select):2、1 直連方式(以下簡稱為a)以下為示例代碼dim conn as new sqlconnection("server=localhost;database=northwind;trust

2、ed_connection=yes") dim i as int16 dim cmd as new sqlcommand("select * from employees", conn) try conn.open() dim dr as sqldatareader = cmd.executereader() while dr.read() i += 1 end while msgbox(i.tostring()'必須關(guān)閉當(dāng)前讀取器,只能有一個(gè)處于讀取狀態(tài) dr.close() dim ds as sqldatareader = cmd.executere

3、ader() while ds.read() listbox1.items.add(ds.getstring(1) + " " + ds.getstring(2) end while ds.close() catch ex as exception msgbox(ex.message() finally conn.close() conn.dispose() cmd.dispose() end try要點(diǎn):1、在同一個(gè)數(shù)據(jù)連接上一次只能有一個(gè)sqldatareader處于連接狀態(tài); 2、sqldatareader只能以只讀向前的方式訪問,當(dāng)移動(dòng)到最后一行時(shí)無法返回,作廢;

4、3、ds.read()包含兩個(gè)作用:判斷是否還有下一行數(shù)據(jù),有返回真值,如果有下一行會(huì)自動(dòng)移動(dòng)到下一行2、2 無連接方式(以下簡稱為b)2、2、1手動(dòng)編寫代碼以下為示例代碼 dim conn as new sqlconnection conn.connectionstring = "server=localhost;database=northwind;trusted_connection=yes" dim da as new sqldataadapter("select * from employees", conn) dim ds as new da

5、taset try da.fill(ds, "employees") datagrid1.datasource = ds.tables("employees") catch ex as exception messagebox.show("數(shù)據(jù)庫.", "warnning", messageboxbuttons.ok, messageboxicon.warning) finally conn.dispose() da.dispose()end try 要點(diǎn):1、利用sqldataadapter取數(shù)據(jù),并將數(shù)據(jù)填充到

6、dataset 2、sqldataadapter的fill方法自動(dòng)去完成數(shù)據(jù)庫連接,取數(shù)據(jù)并斷開連接,以減少數(shù)據(jù)庫連接的時(shí)間2、2、1利用拖放自動(dòng)生成代碼后置代碼只需要一句話:da.fill(ds, "employees")要點(diǎn):1、拖放sqldataadapter到窗體內(nèi),在向?qū)е袝?huì)自動(dòng)生成sql語句,向?qū)?huì)自動(dòng)生成該sql語句所對(duì)應(yīng)的updatecommand,insertcommand,deletecommand; 2、在sqldataadapter右鍵中有菜單生成數(shù)據(jù)集,在生成數(shù)據(jù)集時(shí)會(huì)自動(dòng)生成與所選表格的類型化dataset,該類型化dataset隱藏在xsd文件

7、之下; 3、類型化dataset支持前期邦定,可與textbox,listbox,commbox,datagrid等邦定;3、 數(shù)據(jù)更新( updatae ,insert , delete)注意:直連方式通常情況下只能執(zhí)行單條語句的更新3、1直連方式數(shù)據(jù)更新3、1、1直接使用sql語句 dim conn as new sqlconnection("server=localhost;database=northwind;uid=sa;pwd=") dim cmd as new sqlcommand("insert into employees(lastname,fi

8、rstname) values(lname,fname)",conn) '創(chuàng)建參數(shù)對(duì)象,并加到參數(shù)的集合中來 cmd.parameters.add(new sqlparameter("lname", sqldbtype.varchar, 20) cmd.parameters.add(new sqlparameter("fname", sqldbtype.varchar, 10) '給參數(shù)對(duì)象賦值 cmd.parameters("lname").value = txtlname.text cmd.paramet

9、ers("fname").value = txtfname.text dim count as integer try conn.open() count = cmd.executenonquery() if (count = 1) then messagebox.show("insert succeed") else messagebox.show("insert false") end if catch ex as exception finally conn.close() conn.dispose() cmd.dispose(

10、) end try要點(diǎn):1、不建議使用 ”insert into employees(lastname,firstname) values(” + textbox1.text + “,” + textbox2.text + “)”)方式,該種方式會(huì)引起sql的注入式攻擊;2、追加參數(shù)對(duì)象時(shí),參數(shù)的名稱一定要與sql語句的參數(shù)名稱一致,參數(shù)的長度最好與數(shù)據(jù)庫中的長度保持一致;3、cmd.executenonquery()方法返回受影響的行數(shù);3、1、2利用存儲(chǔ)過程更新(procedure)a、帶input(輸入)參數(shù)例如:如下procuse northwindcreate proc insert

11、employee(lname varchar(20), fname varchar(10)as insert into employees(lastname,firstname) values(lname,fname) 對(duì)應(yīng)程序如下: dim conn as new sqlconnection("server=localhost;database=northwind;uid=sa;pwd=") dim cmd as new sqlcommand("insertemployee", conn) cmd.commandtype = commandtype.s

12、toredprocedure '創(chuàng)建參數(shù)對(duì)象,并加到參數(shù)的集合中來 cmd.parameters.add(new sqlparameter("lname", sqldbtype.varchar, 20) cmd.parameters.add(new sqlparameter("fname", sqldbtype.varchar, 10) '給參數(shù)對(duì)象賦值 cmd.parameters("lname").value = txtlname.text cmd.parameters("fname").val

13、ue = txtfname.text dim count as integer try conn.open() count = cmd.executenonquery() if (count = 1) then messagebox.show("insert succeed"); else messagebox.show("insert false"); end if catch ex as exception finally conn.close() conn.dispose() cmd.dispose() end try 要點(diǎn):1、寫法與sql語句類

14、似,只需要在dim cmd as new sqlcommand("insertemployee", conn)該語句中的第一個(gè)參數(shù)指名存儲(chǔ)過程的名稱b、帶output(輸出)參數(shù)例如:如下procuse northwindcreate proc insertemployee(lname varchar(20), fname varchar(10),empid int output)as insert into employees(lastname,firstname) values(lname,fname)select empid=identity程序如下:dim conn

15、 as new sqlconnection("server=localhost;database=northwind;uid=sa;pwd=") dim cmd as new sqlcommand("insertemployee", conn) cmd.commandtype = commandtype.storedprocedure '創(chuàng)建參數(shù)對(duì)象,并加到參數(shù)的集合中來 cmd.parameters.add(new sqlparameter("lname", sqldbtype.varchar, 20) cmd.parame

16、ters.add(new sqlparameter("fname", sqldbtype.varchar, 10) cmd.parameters.add(new sqlparameter("empid", sqldbtype.int) '指明該參數(shù)為輸出參數(shù),給參數(shù)對(duì)象賦值,輸出參數(shù)不需要賦值 cmd.parameters("empid").direction = parameterdirection.output cmd.parameters("lname").value = txtlname.text

17、cmd.parameters("fname").value = txtfname.text dim count as integer dim empid as integer try conn.open() count = cmd.executenonquery() empid = cmd.parameters("empid").value if (count = 1) then messagebox.show("succeed and your id is:" + empid.tostring(), "mes")

18、 else messagebox.show("false", "mes") end if catch ex as exception finally conn.close() conn.dispose() cmd.dispose()end try要點(diǎn):1、output參數(shù)一定要指名參數(shù)方向是parameterdirection.output,默認(rèn)是輸入?yún)?shù),可不指定,output參數(shù)的數(shù)據(jù)類型無限制; 2、output參數(shù)只有在sqlcommand提交后才能取值;c、帶return(返回)參數(shù)例如:如下procuse northwindcreate pr

19、oc insertemployee(lname varchar(20), fname varchar(10),as declare empid intinsert into employees(lastname,firstname) values(lname,fname)select empid=identityreturn empid程序如下:dim conn as new sqlconnection("server=localhost;database=northwind;uid=sa;pwd=") dim cmd as new sqlcommand("ins

20、ertemployee", conn) cmd.commandtype = commandtype.storedprocedure '創(chuàng)建參數(shù)對(duì)象,并加到參數(shù)的集合中來 cmd.parameters.add(new sqlparameter("lname", sqldbtype.varchar, 20) cmd.parameters.add(new sqlparameter("fname", sqldbtype.varchar, 10) cmd.parameters.add(new sqlparameter("empid&qu

21、ot;, sqldbtype.int) '指明該參數(shù)為返回參數(shù),返回參數(shù)不能賦值 cmd.parameters("empid").direction = parameterdirection.returnvalue cmd.parameters("lname").value = txtlname.text cmd.parameters("fname").value = txtfname.text dim count as integer dim empid as integer try conn.open() count =

22、cmd.executenonquery() empid = cmd.parameters("empid").value if (count = 1) then messagebox.show("succeed and your id is:" + empid.tostring(), "mes") else messagebox.show("false", "mes") end if catch ex as exception finally conn.close() conn.dispose()

23、 cmd.dispose()end try要點(diǎn):1、output參數(shù)一定要指名參數(shù)方向是parameterdirection.returnvalue,其寫法與b一致,但一定要注意return參數(shù)只能返回整型值,因此用的較少3、2無連接方式數(shù)據(jù)更新:注意:因?yàn)闊o連接方式是利用dataset緩存數(shù)據(jù),根據(jù)界面的情況不同,在更新數(shù)據(jù)的時(shí)候有兩種情況:1、界面上為datagrid控件,可同時(shí)做updata,insert,delete各種操作,一次提交所有的更新,該方法的弊端是容易引起數(shù)據(jù)的并發(fā);2、界面上全部是textbox,都是單值控件,一次只能提交其中的一條語句,執(zhí)行一個(gè)語句保存一次,例如課本的第

24、七課;下面分兩大類分別分析3、2、1、datagrid中多條語句同時(shí)更新3、2、1、1利用拖放后置代碼在進(jìn)行根新的時(shí)候只需要一行代碼:sqldataadapter.update(ds,”employees”);要點(diǎn):1、拖放的sqldataadapter會(huì)根據(jù)sql語句自動(dòng)生成其它的command,在提交的過程中會(huì)根據(jù)用戶所做的insert、update、delete操作自動(dòng)執(zhí)行各自得command2、用戶在datagrid中所作的所有更改都是在客戶端完成的,只有sqldataadapter.update可以完成到數(shù)據(jù)庫的提交,在更新的時(shí)候要指名表的名稱。3、2、1、2手動(dòng)編寫a、利用comm

25、andbuilder類型 代碼如下:dim da as sqldataadapter dim ds as dataset dim smd as sqlcommandbuilder private sub form1_load(byval sender as system.object, byval e as system.eventargs) handles mybase.load dim conn as new sqlconnection conn.connectionstring = "server=localhost;database=northwind;uid=sa;pwd=

26、" da = new sqldataadapter("select employeeid,lastname,firstname from employees", conn) '命令構(gòu)造器,根據(jù)select語句自動(dòng)生成其他的command dim smd as new sqlcommandbuilder(da) ds = new dataset try da.fill(ds, "employees") datagrid2.datasource = ds.tables("employees") catch ex as e

27、xception messagebox.show(ex.message) end try end sub private sub button1_click(byval sender as system.object, byval e as system.eventargs) handles button1.click da.update(ds, "employees")end sub要點(diǎn):1、sqlcommandbuilder以sqldataadapter為參數(shù),能夠根據(jù)sqldataadapter所寫的sql語句自動(dòng)生成其它的command,其做法與上面的拖放實(shí)際是一樣

28、的;2、該方法的最大弊端是速度非常慢,一般只會(huì)在單機(jī)操作的程序中使用b、手動(dòng)編寫insertcommand,updatecommand,deletecommand 代碼如下: dim da as sqldataadapter dim ds as dataset dim smd as sqlcommandbuilder '定義其他command dim insertcmd ,updatecmd ,deletecmd as sqlcommand private sub form1_load(byval sender as system.object, byval e as system.e

29、ventargs) handles mybase.load dim conn as new sqlconnection conn.connectionstring = "server=localhost;database=northwind;uid=sa;pwd=" da = new sqldataadapter("select employeeid,lastname,firstname from employees", conn) 創(chuàng)建insertcommand insertcmd = new sqlcommand("insert into

30、employees(lastname,firstname) values (lname,fname)", conn) insertcmd.parameters.add(new sqlparameter("lname", sqldbtype.varchar, 20) insertcmd.parameters("lname").sourcecolumn = "lastname" insertcmd.parameters("lname").sourceversion = datarowversion.curre

31、nt insertcmd.parameters.add(new sqlparameter("fname", sqldbtype.varchar, 10) insertcmd.parameters("fname").sourcecolumn = "firstname" insertcmd.parameters("fname").sourceversion = datarowversion.current 為sqldataadapter指明insertcommandda.insertcommand = insertcmd ds = new dataset try da.fill(ds, "employees") datagrid1.datasource = ds.tables("employees") catch ex as exception messagebox.show(ex.message) end try end sub private sub button1_click(byval sender as system.object, byval e as system.eventargs) handles bu

溫馨提示

  • 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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論