动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
  
   .Net → 阅读文章

 从数据源取回数据--Command 物件简介

作者来源: 
阅读 2338 人次 , 2006-3-29 4:27:00 


command 物件简介
虽然我们刚刚已经和数据源联机了,但是还必须透过command 对象来对数据源进行数据操作的工作。command 对象最主要的工作是透过connection 对象对数据源下达操作数据库的命令。我们以下列语法产生command 对象:

dim cma as command=new adocommand

或是在产生对象的时候顺便指定属性:

dim cma as command=new adocommand("commandtext",activeconnection)

  当我们将command 对象建立好之后,就可以设定command 对象的属性了。首先我们先来了解command 对象有哪些常用的属性:


activeconnection
activeconnection 属性是设定command 对象对数据源的操作要透过哪个connection 对象,例如我们想透过cna 这个connection 对象对数据源进行数据操作:

cma.activeconnection=cna

commandtype
commandtype 属性可以用来指定commandtext 属性中的内容是sql 陈述、数据表名称还是预存程序,如下表所示:

如果本属性没有指定,则为默认值commandtype.text。例如我们指定要以数据表名称将数据表内的数据全部传回来,则设定为:

cma.commandtype=commandtype.tabledirect

commandtext
视commandtype 属性设定,表示要下达到数据源的内容是sql 陈述、数据表名称或预存程序名名。例如下列范例中直接输入数据表名称,将数据表中的所有数据传回:

cma.commandtype=commandtype.tabledirect
cma.commandtext="members"

设定好command 对象的属性后,接下来是command 对象常用的方法:


execute
command 物件最常用的方法是execute,execute 方法可以将commandtext 属性中的数据传到数据源。例如下面范例中,使用者可以在文字输入盒中输入sql 陈述,并会显示所输入的叙述影响资料源的笔数:

<%@import namespace=system.data.ado%>
<%@import namespace=system.data%>
<html>
<form id="f1" runat="server">
请输入sql 陈述: <input type="text" id="text1" runat="server" >
<button id="button1" runat="server" onserverclick="button1_click">
执行
</button>
</form>
<span id="sp1" runat="server"/>
<script language="vb" runat="server">
sub button1_click(sender as object, e as eventargs)
dim cna as adoconnection=new adoconnection
dim cma as adocommand=new adocommand
cna.provider="microsoft.jet.oledb.4.0"
cna.datasource="c:\inetpub\wwwroot\cr\ch05\myweb.mdb"
cna.userid="admin"
cna.open()
cma.activeconnection=cna
cma.commandtype=commandtype.text
cma.commandtext=text1.value
cma.execute()
sp1.innertext="这个叙述影响了" & cma.recordsaffected & "笔资料"
end sub
</script>
</html>


例如我们将使用者tina 密码修改成9876,我们在文字输入盒输入下列叙述:

update members set userpwd= '9876' where userid='tina'



产生独立的command 对象
要使用command 对象,不一定要明确的宣告一个connection 对象。我们只要在产生command对象的时候,将activeconnection 参数所要指定的连结对象改成connectionstring 即可。不过独立的command 对象并不代表不需要connection 对象,而是command 对象会自动产生。在使用独立的command 对象之前要明确的将连结打开,我们可以利用activeconnection.open()方法来开启连结,如下所示:

dim cma as adocommand = new _
adocommand("sql 陈述", "provider=microsoft.jet.oledb.4.0;" & _
"data source=c:\inetpub\wwwroot\cr\ch05\myweb.mdb;" & _
"user id=admin"
cma.activeconnection.open() '将连结打开
下列范例我们利用控件将数据输入数据源:
<%@import namespace=system.data.ado%>
<%@import namespace=system.data%>
<form id="form1" runat="server">
使用者账号: <input type=text id="text1" runat=server><br>
使用者密码: <input type=text id="text2" runat=server><br>
使用者姓名: <input type=text id="text3" runat=server><br>
使用者电话: <input type=text id="text4" runat=server><br>
使用者住址: <input type=text id="text5" runat=server><br>
e-mail 信箱: <input type=text id="text6" runat=server><br>
<button id=button1 runat="server"
onserverclick="button1_click">确定
</button>
</form>
<span id="sp1" runat="server"/>
<script language="vb" runat="server">
sub button1_click(sender as object, e as eventargs)
dim strconstr as string = "provider=microsoft.jet.oledb.4.0;" & _
"data source=c:\inetpub\wwwroot\cr\ch05\myweb.mdb"
dim cma as adocommand = new adocommand("",strconstr)
cma.activeconnection.open()
cma.commandtext="insert into members values('" & _
text1.value & "','" & text2.value & "','" & _
text3.value & "','" & text4.value & "','" & _
text5.value & "','" & text6.value & "')"
cma.execute()
sp1.innertext="这个叙述影响了" & cma.recordsaffected & "笔资料"
end sub
</script>



datareader 物件
如果我们利用command 对象所执行的命令是有传回数据的select 叙述,此时command 对象会自动产生一个datareader 对象。datareader 是我们写asp.net 网页的好朋友,因为我们常常会将数据源的数据取出后显示给使用者,这时候我们就可以使用datareader 对象。我们就可以在执行execute 方法时传入一个datareader 型态的变量来接收。datareader 对象很单纯的一次只读取一笔纪录,而且只能只读,所以效率很好而且可以降低网络负载。由于command对象自动会产生datareader 对象,所以我们只要宣告一个指到datareader 对象的变量来接收即可,并不需要使用new 运算子来产生;另外要注意的是datareader 对象只能配合command对象使用,而且datareader 对象在操作的时候connection 对象是保持联机的状态。下列程序代码片段传回可以读取members 数据表中所有的纪录的datareader 对象:

dim cma as adocommand=new _
adocommand("命令字符串","provider=microsoft.jet.oledb.4.0;"
& _
"data source=c:\inetpub\wwwroot\cr\ch05\myweb.mdb")
dim dra as adodatareader
cma.activeconnection.open()
cma.commandtext="select * from members"
cma.execute(dra)

当我们将datareader 对象传入execute 方法后,就可以使用datareader 对象来读取数据了。以下为datareader 常用的属性:


  了解datareader 对象有什么属性后,我们就可以利用datareader 所提供的方法来取回资料了。下表为datareader 常用的方法:


read 方法
在取得command 对象执行execute 方法所产生的datareader 对象后,我们就可以将纪录中的数据取出使用。datareader 一开始并没有取回任何数据,所以我们要先使用read 方法让datareader 先读取一笔数据回来。如果datareader 对象成功取得数据则传回true,若没有取得资料则传回false。这样一来我们就可以利用do while...loop 循环来取得所有的数据,如下程序所示:

do while dra.read()
response.write("user id: " & dra.item("userid") & ", password: ")
response.write(dra.item(1) & "<br>")
loop


上述程序代码片段利用read 方法将数据取回后,再利用item 集合以键值(key)的方式取出userid 字段的数据,以及利用索引值(index)取得使用者userpwd 字段的数据;索引值是由0开始计数,故第一个字段的索引值为0,依此类推。当数据读取完毕后read 方法会传回false,所以就跳出循环。

getvalue 方法
我们也可以使用getvalue 方法取得指定字段内的记录,这个方法和item 属性很像;不过getvalue 方法的参数只接收索引值,并不接收键值为参数。我们改用getvalue 取得所有字段内的数据,如下程序所示:

do while dra.read()
response.write("user id: " & dra.getvalue(0) & ", password: ")
response.write(dra.getvalue(1) & "<br>")
loop

getvalues 方法
getvalues 方法是取得字段内所有的记录。这个方法接收一个数组,并且将所有字段填入数组中,如下程序所示:

dim arvalue(dra.fieldcount)
dra.read() '先抓取一笔记录
dra.getvalues(arvalue) '将记录填入数组中
for shti=0 to dra.fieldcount - 1
response.write(dra.getvalue(shti) & "<br>")
next


因为索引值是由零开始算,所以我们在使用for...next 循环的时候记得将结束值减一


getdatatypename 以及getname 方法
getdatatypename 方法可以传回指定字段的数据型态,而getname 方法则是传回指定字段的字段名称(就是键值)。这两个方法一样以键值或是索引的方式来指定字段。下列程序代码片段显示每个字段的名称以及数据型态:

dim shti as short
for shti = 0 to dra.fieldcount - 1
response.write("索引值为" & shti.tostring & " 的字段, 名称为: " & _
dra.getname(shti) & ", 数据型态: " & dra.getdatatypename(shti) &
"<br>")
next




close 方法
close 方法可以关闭datareader 对象和数据源之间的联机。除非把datareader 对象关闭,否
则当datareader 对象尚未关闭时,datareader 所使用的connection 对象就无法执行其它的
动作。

综合范例
下列范例在文字输入盒内输入数据表名称,按下确定后程序会将数据表的索引、字段名称、字段
型态以及字段内容全部显示出来:

<%@import namespace=system.data.ado%>
<%@import namespace=system.data%>
<html>
<form id="f1" runat="server">
<input id="text1" runat="server" value="members"/>
<button id="button1" onserverclick="button1_click"
runat="server">执行
</button>
</form>
<script language="vb" runat="server">
sub button1_click(sender as object, e as eventargs)
dim cma as adocommand=new _
adocommand("","provider=microsoft.jet.oledb.4.0;" & _
"data source=c:\inetpub\wwwroot\cr\ch05\myweb.mdb")
dim dra as adodatareader
dim shti as short
cma.activeconnection.open()
cma.commandtype=commandtype.tabledirect
cma.commandtext=text1.value
cma.execute(dra)
for shti=0 to dra.fieldcount - 1
response.write("字段索引值: " & shti.tostring & _
" 字段名称: " & dra.getname(shti) & _
" 数据型态: " & dra.getdatatypename(shti) & "<br>")
next
do while dra.read()
for shti=0 to dra.fieldcount-1
response.write(dra.getvalue(shti) & " / ")
next
response.write("<br>")
loop
end sub
</script>
</html>

 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:DataSet 物件
· 下一篇:和数据源联机--Connection 物件简介
· 用C#写vs插件中的一些Tip
· 通过事例学习.net的WebForms技术(三)
· 如何用Visual C#做组件
· .Net边学边讲(三)
· 使用 ASP+ 列表绑定控件(上)


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077