a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 347|回复: 0

[考试辅导] 用SqlCommandBuilder实现数据库批量更新的方法

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
(一)
$ |9 e2 U4 t; K4 d, w/ T, J! Q
% M) A: m9 m7 L  有没有人遇到这种情况,用 SqlDataAdapter.Update(ds)更新时出错?% b: L9 j0 x0 B6 ~8 u  J% Y
( h% V( T7 I$ h8 K# v4 z- s1 b0 A
  answer:   一般是这样的,如果用设计器将SqlDataAdapter拖到页面中使用时,不会出现这种情况,因为
: O" W; b  i/ \  z" Q
, U$ z  M5 A+ h7 J; F8 a& O                  系统会自动生成SqlDataAdapter的属性命令,比如:  .UpdateCommane insertCommand 7 i# g0 p, W% M8 i+ |/ |* i

8 z- Z) d" s5 H4 a; s                  selectCommand等。  但是有些程序员不喜欢用设计器,或者是有些地方没必要拖动+ I% ^( Y6 N" ~; H; i* I% A0 p
/ o& c  P% I  {+ n
                  SqlDataAdapter这么个庞大物来实现,那么SqlDataAdapter就不会自动生成相关的查询或更新0 H) \6 I4 O3 e( t

4 N1 r& c* t1 o/ U/ X5 l                  语句了.   所以当执行到SqlDataAdapter.Update(ds)语句时,SqlDataAdapter桥接器不知道更  `0 K5 X+ l& U( @
) ]8 W9 [2 {; k. N: B' _
                 新哪个表.不报错了.  
! o. _  I9 P2 N8 p& z! J+ l6 N  Q! |; K! P$ D" f4 w
(二)
. ]2 f+ ~* {9 t6 Q
  K. @6 Y- a& G" Z/ J  解决方法:- _  j$ G6 V: K8 k! g

" M9 z3 R4 E2 x! m$ w' V  用SqlCommandBuilder 实现批量更新
' ~9 `- O/ M$ W# S  L5 U
& m& {/ u0 I; L% j/ E$ R  1.功能:
' ]: J% z6 R' l" B$ E4 |8 Q" `9 h0 P8 u2 c
   可以实现你对DataSet在UI层做任意操作后,直接丢给这个方法,这个方法就可以自动把你的修改更 新到数 据库中,而没必要每次都更新到6 m1 G! Z0 A, c5 Z: x9 b

. k. j" ]1 B  P2 a$ [   数据库6 F( @2 l. c( l. m( f* d9 P

( h' r$ p  V# ]$ w/ U  2.使用方法
. U4 h- v6 f# Y1 d% S  public int UpdateByDataSet(DataSet ds,string strTblName,string strConnection)
4 D# b  }% h6 V' R% C* S  {
% w& x- y/ B7 P   try
' F# u0 T/ ~; Y( B) p' [% ]+ |  {
0 L5 l/ K" W; B, o   SqlConnection  conn = new SqlConnection(strConnection));- d5 o) g/ O# G3 [
         
, S' d5 N5 R8 j3 j+ }+ x   SqlDataAdapter myAdapter = new SqlDataAdapter();
! p- n* D% {4 W* R0 i3 w   SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection)this.conn);   
# R  L; b8 X) y( N5 q   myAdapter.SelectCommand = myCommand;7 ^0 u  a1 w. q! W- W' u4 v2 @
   SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);     5 t: A6 o) ~/ ^5 k/ F
   myAdapter.Update(ds,strTblName);  ; E( U7 D' s9 _) r, S
  7 r( Q1 y4 ?# X3 h6 w; l
   return 0;  d- `# }# x% F2 ?7 y' v; ?
}) j6 |4 G9 Q$ f" b
catch(BusinessException errBU)
1 t9 D1 J- E3 f5 A4 w2 }, x6 t{  
. w2 D8 g" B3 R! f+ ?   throw errBU;- b4 f  @6 D: _, ?+ \) R7 k
}   
" ?. X; ]: w1 I$ v( _catch(Exception err)
; B# P$ y2 F. A' b# p" H' _{  
$ Z8 K2 Q9 p6 i: a6 T   throw new BusinessException(err);8 N( \/ \; v* |9 h* t
}6 e) H1 e8 l" O! |) J) V9 H* D4 \
}
" N- b' E8 b  j5 d
9 C+ b. G: i! V) N2 G: e: [直接调用这个方法就可以啦,说明的一点是select * from "+strTblName是一定要的,
3 X$ f' X9 s. }作用大家也应该想到了,主要是告诉 SqlDataAdapter更新哪个表$ T! N0 B/ q) Z6 k9 G; h$ \
4 Z  @/ R1 F: O
3.什么时候用?
* s! D' V+ _# I5 i% }5 ]% k; i2 A* W0 k6 W" @
    a. 有时候需要缓存的时候,比如说在一个商品选择界面,选择好商品,并且进行编辑/删除/更新后,6 \/ J. F# J4 s3 A! D( q( v; Z4 v
9 @0 ^. a  _+ p5 }! _
       最后一并交给数据库,而不是每一步操作都访问数据库,因为客户选择商品可能进行n次编辑/删除9 U! b; y/ `( |

& S, p7 `/ L7 c+ |% A7 q1 V9 t' h1 M       更新操作,如果每次都提交,不但容易引起数据库冲突,引发错误,而且当数据量很大时在用户执行
# O: p8 I( l3 `* j( p( _, _8 j# R) Z3 E+ @4 G& @& P0 q
       效率上也变得有些慢3 ~% [. u0 V- T6 i
& l  G# f3 e; n8 k* e
    b.有的界面是这样的有的界面是这样的,需求要求一定用缓存实现,确认之前的操作不提交到库,点击. A5 _( D! X' I7 @

; u1 a# j' B& O2 |      页面专门提交的按钮时才提交商品选择信息和商品的其它信息. 我经常遇到这样的情况1 B! \3 s$ l5 O$ h5 ?

/ u' `4 P) u* |, }  ]) @  i2 X    c.有些情况下只往数据库里更新,不读取. 也就是说没有从数据库里读,SqlDataAdapter也就不知道是
0 b. {4 k0 |4 D1 y( k     
! L0 I- Y+ B% M/ l; v' }      更新哪张表了,调用Update就很可能出错了。这样的情况下可以用SqlCommandBuilder 了.
' F0 D& L0 E/ `         
( Y( x: q0 }- [* \- r: T
  p( d# h1 e, z& y' x2 R* E4.& N2 U) I: U2 o$ n0 o: w
注意点:
2 v- n* u5 G0 \" ?5 G  1.只能更新一个表,不能更新两个或两个以上相关联的表3 I; I2 o! d# w0 L
  2.表中必须有主键
* U5 G" T# M  I/ l: S* I9 U4 \  3.更新的表中字段不能有image类型的
" ?9 u. D+ c( e3 D+ B1 q, ~% J9 P5 i
5.优点:
1 o3 p& g' W* y$ i; A; q! N: t" ]2 I5 A
( X! k# g: M% `4 Q: L5 L    节省代码量,节省时间,这个方法可以代替所有的:  更新/删除/插入操作语句- X* M- `6 [. m* P# {; @

% f$ r: y, z. \4 Y/ W6.缺点:2 f8 r1 u6 O" z
        访问两次数据库(select * TableName,就是这句,要确认是哪个表,除非是很大的数据量,! b: Y; t, a+ L( T* ?% [1 ]4 T
        一般是感觉不到的),效率有些慢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-26 07:11 , Processed in 0.490943 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表