你的位置:睿鑫网络 >> 编程 >> web开发 >> ASP.NET >> 详细内容 在线投稿

ASP.NET 2.0中执行数据库操作命令之二

排行榜 收藏 打印 发给朋友 举报 来源: 网络   发布者:未知
热度7票  浏览15次 时间:2010年1月15日 10:40

qO'n][F-`s0SqlDataReader类

Rn)p1v ]!k,_0

!\#X `[MOd%C0B0可以用SqlDataReader类对象从SQL Server数据库中读取行;用OleDbDataReader类对象从支持OLE DB的数据库中读行,如Oracle与Access;用OdbcDataReader类对象从支持ODBC的数据库中读取行。

Kb[@J uY6_0

&mh4ig#f0DataReader对象允许你以向前的,只读的方式读取数据,有时候DataReader对象也称为消软管游标。DataReader对象采用了一种简化的数据读取方式,但是提高了性能的同时也牺牲了很多特性。例如在DataSet中支持的排序,分页等功能。这些功能将在以后的章节进行详细的介绍。睿鑫网络/N2w2k n3kb#K Q%D)F

睿鑫网络%V7v-rh'{iS+I

SqlDataReader的属性

}M vNS:n1o0 睿鑫网络EVzj:[

属性睿鑫网络8o!A tYl%|

HW!K{*U v0说明睿鑫网络^r vfXNO

睿鑫网络7W1[%f,W+SPKdK0x*x

Depth睿鑫网络7sUb)Sr7Khe

睿鑫网络RH$C1{S,nQ7@

其返回类型为int,取得表示当前行嵌入深度的值

%W+\0sz*N0qK)gh.V9J t0

/O"C2F&T&\Y0FieldCount

U0v ]:\t0 睿鑫网络v-x#SE@1]A&Y

其返回类型为int,取得当前行的列数睿鑫网络*er:^]xV^c)R

4j1ud9x/YM0]0IsColsed睿鑫网络*?;c"[#G8P)d"VJ

睿鑫网络7e'`3Q0b!eZ

其返回类型为bool,取得一个布尔值,表示是否关闭数据读取睿鑫网络/`m2cm%@.v!I Q

睿鑫网络q'YnPUL

RecordsAffected睿鑫网络,U/JvBV B J5qW$K!v

睿鑫网络7h,tNX:Z/U(M+\L

其返回类型为int, 取得执行SQL语句增加、修改或删除的行数。睿鑫网络v[9Oa$Z e

~l ^ e[ u4x3Jy|S0SqlDataReader的方法

"r2_Oj1H7Bk0

P5M4H"x0Z(Eh;W q'ER~0方法睿鑫网络yezE M G

Ag _|(}]:@p2A0说明

6cFq8EmN es8g7R0 睿鑫网络,d.}yh7b6{V#c

Reader()睿鑫网络6T(k3J-Z4g!t'z0wj5}

;|w`F8Q2D0其返回类型为bool,将数据阅读器移到结果集的下一行并读取该行。这个方法返回的布尔值表示结果集中是否有多行睿鑫网络#I$ix$G;N:s

q6JLH| OcW0GetValue()睿鑫网络,to)D wu5Jq2d

睿鑫网络It*y*sct7h E7`}

其返回类型为object, 返回指定列的值睿鑫网络;n#y pi"f"{

Y*i0nT[0GetValues()

@}K)@7i.y0 睿鑫网络k6[&Y9Z{2Na6fK

其返回类型为int,将当前行中所有列的值复制到指定对象数组。这个方法返回的int是数组元素的个数

9X&yL!xJ9]%Y*V}#}2_%|0 睿鑫网络]n(y Y)V b

NextResult()睿鑫网络xd]vpRq8N&m*Lsk

睿鑫网络O W Pei S1t

其返回类型为bool,将数据阅读器移到结果集的下一行。这个方法返回的布尔值表示结果集中是否有多行睿鑫网络y?6Ub&j&^Z8E

睿鑫网络3N;cr C"?E

Close() 关闭睿鑫网络 {i1wz I jk

p/SFtQV0SqlDataReader 对象睿鑫网络O VK-Ct"q[

N&\:Q!Cu}4w:c0GetInt32(),GetChar(),睿鑫网络2{ K(XitK`q

睿鑫网络f:b6a btKM@HEq

GateDataTime(),Get×××()睿鑫网络W0H.[S~9]uU|

N{t q2L(l/UT6V1w0返回指定列的值,并且返回的类型为相应的数据类型。例如GetInt32()返回整型的数值。注意,如果你将返回值赋予一个类型不匹配的变量时,将会抛出一个InvalidCastException异常

MyST(Y#wH(b0 睿鑫网络bn:U~m!s

用ExecuteReader()方法执行查询睿鑫网络vx?[e m

睿鑫网络#T"Z9PCs

下面是一个用ExecuteReader()方法执行SELECT语句的范例。这个方法用DataReader对象返回结果集,然后可以用此对象读取数据库返回的行。睿鑫网络4v0X8YU o mG

6CuW Ye]0范例程序代码如下:

\M+ki2g.{H(jp cJa0 睿鑫网络7S}/gPH7T"Q:H.W

01 public partial class _Default : System.Web.UI.Page睿鑫网络-B9oc%D#B

睿鑫网络v_7i Wk+ekN(cg

02 {

#Ql{V{0b.Q0 睿鑫网络5C*SU0X7w o0`

03  protected void Page_Load(object sender, EventArgs e)睿鑫网络h'}M&fA T(|6~

睿鑫网络/` }DT.Ej WpV~

04  {

Um|Yh Q0

WsU7m9VH005   string connectionString =睿鑫网络 gv,NouF9u\b

睿鑫网络 w2Fw#Cz

06 ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;睿鑫网络}"o[E-@f SL+EF

1oCzEe*D007   SqlConnection con = new SqlConnection(connectionString);睿鑫网络*V:q6hE$sx{2H

f Tk0Q uRY4~;]008   string sql = "SELECT top 5 CustomerID,CompanyName,ContactName,Address睿鑫网络_)]@{jGR

$X9G$\h:V@j009          FROM Customers";睿鑫网络N8{i5W5`4{L

9nhX(?L}0T }010   SqlCommand cmd = new SqlCommand(sql, con);

+ZN0WY CT$U_#px0

nef{&x011   con.Open();

;X,vC'M/U+N l4t0 睿鑫网络(v8_gt#t;fA

12   SqlDataReader reader = cmd.ExecuteReader();

HQ']q.^u p0 睿鑫网络 oC8\LD6a B)T^ZI

13   StringBuilder htmlStr = new StringBuilder("");睿鑫网络S xg8_:h%mYsVs

睿鑫网络A%f1}-S lb&m

14   while (reader.Read())睿鑫网络4J2gg$Qzu#X.g

#a3q,QAC A015   {

7Q5s4L Z|K0

fj#IW4bq8r016    htmlStr.Append("CustomerID:" + reader["CustomerID"] + "睿鑫网络8B]H]E\;n XXIN4f
");睿鑫网络|X;P X2f4K|nj

9Q#^ U@kvt!|;m017    htmlStr.Append("CompanyName:" + reader["CompanyName"] + "
!`+|%~2X5g4y$T0");

3AE&Y&@)^![+zt0

Xr({OYk018    htmlStr.Append("ContactName:" + reader.GetString(2) + "
%|5[!|%ls r}5A$C(r ^|0");

;P+^)yCMI:Qj&K#R0 睿鑫网络vR:Vv(n#dT

19    htmlStr.Append("Address:" + reader.GetString(3) + "睿鑫网络 N^BI'np
");

S{:DF#drP R0

2EY'r|!yz w7YrS020    htmlStr.Append("


");

`9tBH%?hP7iFI0

c W8{:Uh3@0q)}*n021   }

9hq&Y,_3vr%k |3_0 睿鑫网络D-E%Z;D"JT

22   reader.Close();睿鑫网络h:X/Bi}.n7W)I

M]0\TzCU023   con.Close();睿鑫网络vT P)l;jpE2yB

睿鑫网络s!G!u xVw%wET

24   HtmlContent.Text = htmlStr.ToString();睿鑫网络'sU$u8Qi

xN F;A ihd025  }

$k+@ndOOi'[)t;d0

2p ?o#fv,D&fn026 }

/`clP7n/t0 睿鑫网络qK(w3lG(y

程序代码说明:在上述语法范例的程序代码中,第5到12行代码生成所要的对象并执行SELECT语句,从Customers表中读取前5条记录。cmd返回的结果集存放在reader对象中,然后你可以用Reader()方法读取reader对象的记录。这个方法在有另一个可读的行时返回布尔真值,否则返回布尔假值。可以从reader对象中读取一个记录的各个列值,只要在方括号中传入列名即可。如第16和17行所示,我们用reader[“CustomerID”]读取CustomerID列的各项内容。你也可以直接在方括号中传入数字值指定想要列的索引。如第18和19行代码所显示,由于我们在用SELECT进行数据查询的时,ContactName和Address分别位于第3和第4列,而相应的索引值则为2和3,所以我们可以用reader.GetString(2)和reader.GetString(3)读取ContactName和Address列的数据。如第14行代码所示,我们可以在While循环中用Reader()方法一一读取每条记录。

C nT#~"A0 睿鑫网络&|9o w_JmaN$u3DZ

执行结果:

9d3E5e$pTAc0 睿鑫网络:ZJ"mKs zF%L

睿鑫网络Na7D*l{|,X(W'~"~4X

3B q3z6C'gn~/i,x0每次程序执行命令时,都要将相应的命令通过网络传递到数据库中,并在数据库进行执行,然后将结果返回到程序中,从而产生大量的网络通信流。我们可以使用ExecuteReader()方法同时执行多条SELECT语句查询减少重复的数据传递。睿鑫网络X*i#bg&Yz5C9E _8W

Y8x;g vWb!T\0下面的实例是使用ExecuteReader()方法同时查询三个表中的数据,并将返回的三个结果集显示在页面上。睿鑫网络/w#@2Un!w!Rk3dG M%]

O_Vk3qR2z3O`0范例程序代码如下:睿鑫网络/K-~n8~i0N

睿鑫网络m e$e9}"sk0U a

01 public partial class _Default : System.Web.UI.Page

Y/d%dB W(uD0

M @TZE9`002 {

)r&a&]Xq ~0 睿鑫网络"fsQm(C$p

03  protected void Page_Load(object sender, EventArgs e)

A,QR(~1AZ0

/YI+[:p5~'o004  {睿鑫网络7F/mj;i S}U5he

睿鑫网络[L_}[9CgA

05   string connectionString =睿鑫网络aZT5R;?Gm S

Ed3gG C1x1O M006 ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;睿鑫网络t#Z:k$B%Vq Es

2k;d SRF4D(N0a-gTZ%|;k007   SqlConnection con = new SqlConnection(connectionString);睿鑫网络)]&DM c#z.@@$b

睿鑫网络9lM,^i4L&_

08   SqlCommand cmd = con.CreateCommand();睿鑫网络/Ym'~2Lw5A}

睿鑫网络|B;|7f/b+TQ'Ip

09   cmd.CommandText = "SELECT TOP 3 ProductID,ProductName睿鑫网络+n)[`q#X9P

睿鑫网络c(DN0P.k$b

10   FROM Products ORDER BY ProductID;" +

h't7R8?&R ZV5H(o\g0

'Nj"FH%qiJ { EX011    "SELECT TOP 3 CustomerID,CompanyName睿鑫网络Q(F@Q!a A

LJ%r:gY012    FROM Customers ORDER BY CustomerID;" +睿鑫网络'u[$]/j*}5?9_b0E NX

o'Ef)r+U zT E013     "SELECT TOP 3 OrderID,CustomerID

h#Rlq#v0[#L0 睿鑫网络%[*j:\yH0T)S1V

14     FROM Orders ORDER BY OrderID;";睿鑫网络"g7U~2wp;tp2J o

#n8g6h?ds1d Z'm015   con.Open();睿鑫网络Rd U$@]*N}elOl

i!LY,_R_:Cb0M016   SqlDataReader reader = cmd.ExecuteReader();睿鑫网络Qt C8dVh

9L-Iu"sD"X P017   StringBuilder htmStr=new StringBuilder("");

QS4? u5V0

_#l ? P ]%i8h@5L018   int i = 0;睿鑫网络 B1A+p8h`{%t4N

睿鑫网络"u3l Gy,j4D"O2cE

19   do

V(V~l5N{1R3|J0

c!Q&~_6oB/ii020   {

-KPAUl0

,v2d0]4bH!Zo021    htmStr.Append("结果集");睿鑫网络 ]Zm&D-{ une8b5\P

{p6wj'|022    htmStr.Append(i.ToString());睿鑫网络U X#Q*}n5q VQ!@ `

~F4UbE;Dv{023    htmStr.Append("睿鑫网络8h-uPf5Mx(u
");

6jh:N;a"K|L0 睿鑫网络'B JOg&Y'q.zzo

24    while (reader.Read())

l3I |@rd,ks c0T|_d0

D3h,]4^`v5d025    {

M2KL doH!b*y0 睿鑫网络 y.} i8Kytc

26     htmStr.Append("reader[0]=" + reader[0]);

8D$Rw|L HU*l0

v+WEsr y-N027     htmStr.Append("睿鑫网络mRdQ^!m
");

!d~"j4g C4I6H2m*?9f0

(pB&e'['h;E028     htmStr.Append("reader[1]=" + reader[1]);睿鑫网络Y I#q ~ ja4l E8[

d bAl }8i)g'D029     htmStr.Append("睿鑫网络1t\ L yx

%v:f^YmrIZ4@.M0");

8V8|9y6N![AI3b0 睿鑫网络3x;r7y&K3|]

30    }

? b8k~ q%?7@8d0

FiL&N{031    htmStr.Append("


");

`-e3z _;a6HF0 睿鑫网络B$j E3iIP8`-M]i

32    i++;睿鑫网络 WiJ.SH knL'J)X&t

8[ GB7g9[K033   } while (reader.NextResult());

_*g)]|R0 睿鑫网络*x6fy8hB/hj kH}V

34   reader.Close();睿鑫网络7l!Y soTc-B

睿鑫网络;bm/I~2bfg

35   con.Close();

8s e8`DWN"a0 睿鑫网络h*^q/VaHfr M%P+Kp%p

36   HtmlContent.Text = htmStr.ToString();

5c_ GJ!\0I^0 睿鑫网络C;avA P4t+^

37  }

I$I t @ R0A2Y0 睿鑫网络FB7Fi6A CZ)u2h

38 }

'uv&s,y,k+q;i:}.j0 睿鑫网络b8H:z%jk~#F4P

程序代码说明:在上述语法范例的程序代码中,第9行到第14中定义了3个查询语句,各语句之间用分号进行间隔。第16行调用ExecuteReader()方法,并返回SqlDataReader对象,并且对三条不同的SELECT语句各返回一个结果集。要读取第一个结果集的话,可以用SqlDataReader对象的Reader()方法。Reader()方法在没有其他的可读行时将返回一个false值。当一个结果集的所有记录都读取完毕后,可以调用SqlDataReader对象的NextResult()方法,然后在读取下一个结果集,在没有其他的结果集时,也返回一个false值。

TKC9aA&c0 睿鑫网络9U w3WE.u"j0a

提示:外循环do…while测试结尾的reader. NextResult()的返回值。由于do…while循环末尾检测这个条件,这样就保证了do…while循环至少执行一次。之所以在末尾才调用NextResult()方法,是因为这样可以首先把SqlDataReader对象移到下一个结果集,然后才返回表示是否还有下一个结果集的布尔结果。如果使用while循环中,则有可能直接跳过第一个结果集,从而产生错误。睿鑫网络6P6w_ d0Qd\\$p

睿鑫网络:Z9E Ca VSAJe

'vlO(SI{0

n7p b%gaO[2P0用ExecuteScalar()方法执行SELECT语句

rj7jo-L P!e?;M"w8t0

/\`6C5x X f0用ExecuteScalar()方法执行SELECT语句,返回单个值,并且忽略其他的任何读取的结果。ExecuteScalar()方法返回的结果是一个object对象。ExecuteScalar()主要是用来执行SELECT语句,或者执行包括聚合函数的SQL语句。

3q+Q(u"_yNR0

i.sH'v7em?h;EK`0下面我们将使用如下的程序读取Products表中的记录条数,并且在相应的查询语句中使用COUNT()聚合函数。

_-G3b2m5E2\&s$E*[0 睿鑫网络 `K"hD'H/ri}:l

范例程序代码如下:

vipl Cmt$z0

Y&Tto[#u+YF*Q001 public partial class _Default : System.Web.UI.Page睿鑫网络 M/b?O0x,o

(lp?*u \/x9O P`"L002 {

V7M{Y*Z0

r]/py(N k003  protected void Page_Load(object sender, EventArgs e)

gS9a ft8v0

:A%NJn6k004  {睿鑫网络d6B/k+YF(EBV

睿鑫网络Jy-h3p dc4@j u

05   string connectionString =睿鑫网络8|1k8}R ]0Vi-q8R$m-d

睿鑫网络"s1w-jbcL0T*J

06    ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;睿鑫网络0bF Ob4dh

睿鑫网络3y4b"e/vP1nGo

07   SqlConnection con = new SqlConnection(connectionString);睿鑫网络%m/w\C}9b b

睿鑫网络G-K8^x[LH$c

08   SqlCommand cmd = con.CreateCommand();睿鑫网络xzvJ-J9G

l;a$l%o k5i R!K;?kc009   cmd.CommandText = "SELECT COUNT(*) FROM Products";

w|uq;YV0 睿鑫网络(P*e.f ^S*o)h

10   con.Open();

qgF3u/G_0

w.D G!tlI~$Y011   int returnValue = (int)cmd.ExecuteScalar();

$C-k8S'IM+F0

O.iO1zl_ m B012   HtmlContent.Text = "Products表中共有" + returnValue.ToString()+"条记录";睿鑫网络4Rk*X*B[q

睿鑫网络'SB?,Pk!u"e

13  }

~"A:Co.t'o0 睿鑫网络5Q+n$U.~O B-z

14 }

;v)Z'U Fzg @+u0 睿鑫网络(Z2T4`F~?cq

程序代码说明:在上述语法范例的程序代码中,第9行即为查询Products表中的记录条数的SQL语句。第11行代码用ExecuteScalar()方法执行SELECT语句。注意,由于ExecuteScalar()方法的结果为object对象,因此我们要将其进行强制类型转换,再赋予相应的变量。

R/V^1~,c7Kc0 睿鑫网络 r!|8Ic9v0S5M

执行结果:睿鑫网络~v!x{~Bo

c-F$c;A+art0

uq^@/Q.?1k0
上一篇 下一篇

网络资源