今天在看PetShop 4.0的代码,发现它在Insert订单父子表时.使用动态SQL来Inert.不用存储过程也不用事务(当然使用的隐形事务).代码如下:
EXEC sp_executesql 
N
'Declare @ID int; Declare @ERR int; 
INSERT INTO Orders VALUES(@UserId, @Date, @ShipAddress1, @ShipAddress2, @ShipCity, 
              @ShipState, @ShipZip, @ShipCountry, @BillAddress1, @BillAddress2, 
              @BillCity, @BillState, @BillZip, @BillCountry, 
''UPS''
              @Total, @BillFirstName, @BillLastName, @ShipFirstName, 
              @ShipLastName, @AuthorizationNumber, 
''US_en''); 
SELECT @ID=@@IDENTITY; 
INSERT INTO OrderStatus VALUES(@ID, @ID, GetDate(), 
''P''); 
SELECT @ERR=@@ERROR;
INSERT INTO LineItem VALUES(  @ID, @LineNumber0, @ItemId0, @Quantity0, @Price0); 
SELECT @ERR=@ERR+@@ERROR;
INSERT INTO LineItem VALUES(  @ID, @LineNumber1, @ItemId1, @Quantity1, @Price1); 
SELECT @ERR=@ERR+@@ERROR;SELECT @ID, @ERR
',
 N
'@UserId varchar(80),@Date datetime,@ShipAddress1 varchar(80),@ShipAddress2 varchar(80),
@ShipCity varchar(80),@ShipState varchar(80),@ShipZip varchar(50),@ShipCountry varchar(50),
@BillAddress1 varchar(80),@BillAddress2 varchar(80),@BillCity varchar(80),
@BillState varchar(80),@BillZip varchar(50),@BillCountry varchar(50),@Total decimal(7,2),
@BillFirstName varchar(80),@BillLastName varchar(80),@ShipFirstName varchar(80),
@ShipLastName varchar(80),@AuthorizationNumber int,@LineNumber0 int,@ItemId0 varchar(10),
@Quantity0 int,@Price0 decimal(4,2),@LineNumber1 int,@ItemId1 varchar(10),@Quantity1 int,
@Price1 decimal(4,2)
',
 
@UserId = 'tony'@Date = '06 13 2008  4:07:24:220PM'@ShipAddress1 = 'aaa'
@ShipAddress2 = 'aaa'@ShipCity = 'asdfasdf'@ShipState = 'CA'@ShipZip = '11111'
@ShipCountry = 'USA'@BillAddress1 = 'aaa'@BillAddress2 = 'aaa'
@BillCity = 'asdfasdf'@BillState = 'CA'@BillZip = '11111'@BillCountry = 'USA'
@Total = 36400.00@BillFirstName = 'aa'@BillLastName = 'aa'@ShipFirstName = 'aa'
@ShipLastName = 'aa'@AuthorizationNumber = 1534391807@LineNumber0 = 1
@ItemId0 = 'EST-4'@Quantity0 = 1000@Price0 = 17.50@LineNumber1 = 2
@ItemId1 = 'EST-5'@Quantity1 = 1000@Price1 = 18.90

想问一下.为什么要这样做.这样做的好处....谢谢!
---------------------------------------------------------------------
每个人都是一座山.世上最难攀越的山,其实是自己.往上走,即便一小步,也有新高度
.

--做最好的自己,我能!!!

posted on 2008-06-14 00:37 武广敬 阅读(598) 评论(3)  编辑 收藏 所属分类: C#

  回复  引用    
2008-06-14 01:00 | kevinshi [未注册用户]
主要是因为存储过程不能通用啊,在sqlserver里面可以执行的存储过程不可以在oracle里面执行的,但是sql语句是标准的,通用的。

个人愚见,欢迎批评!
  回复  引用  查看    
2008-06-14 18:07 | 曲滨*銘龘鶽      
楼上误导啊,SQLSERVER 的tsql 和 oracle 的plsql 差别很大的;

PetShop 这种方式性能不会有太大的损失;前面的sql 是固定的,只是改变后面的参数而已,不会导致数据库每次重新编译 sql

其实不用存储过程,有些时候是为了缓解数据库服务器的压力
使用存储过程可以提高性能,但是也增加数据库服务器的压力

而且有些时候用不用存储过程是需要根据情况而定的,有些情况是不适合用过程的,比如一个比较长时间的统计如果使用过程会导致【数据库】在很长一段时间内cpu都是100%,这样就会影响到所有使用这个库的应用无法运行,而反过来如果用程序实现【数据库服务器】和【web服务器】都各占cpu 50% 就是时间可能会长一点,这样的话还是选择用程序实现的比较好。
  回复  引用    
2008-06-17 08:58 | firechun [未注册用户]
楼上说的有一定道理,不过我认为并不适合这个例子。

在这个例子中,使用SQL语句无论如何也比不上用存储过程效率高,实际上,PETSHOP4.0通篇没有使用一个存储过程,我觉得PETSHOP4.0本身是一个软件架构的例子,而不是获取数据的例子,所以重点不在用不用存储过程上。因此没用使用存储过程也是可以理解的,这样更便于代码的阅读和理解。

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-06-14 00:46 编辑过


相关链接: