今天在看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#
发表评论
主要是因为存储过程不能通用啊,在sqlserver里面可以执行的存储过程不可以在oracle里面执行的,但是sql语句是标准的,通用的。
个人愚见,欢迎批评!
楼上误导啊,SQLSERVER 的tsql 和 oracle 的plsql 差别很大的;
PetShop 这种方式性能不会有太大的损失;前面的sql 是固定的,只是改变后面的参数而已,不会导致数据库每次重新编译 sql
其实不用存储过程,有些时候是为了缓解数据库服务器的压力
使用存储过程可以提高性能,但是也增加数据库服务器的压力
而且有些时候用不用存储过程是需要根据情况而定的,有些情况是不适合用过程的,比如一个比较长时间的统计如果使用过程会导致【数据库】在很长一段时间内cpu都是100%,这样就会影响到所有使用这个库的应用无法运行,而反过来如果用程序实现【数据库服务器】和【web服务器】都各占cpu 50% 就是时间可能会长一点,这样的话还是选择用程序实现的比较好。
楼上说的有一定道理,不过我认为并不适合这个例子。
在这个例子中,使用SQL语句无论如何也比不上用存储过程效率高,实际上,PETSHOP4.0通篇没有使用一个存储过程,我觉得PETSHOP4.0本身是一个软件架构的例子,而不是获取数据的例子,所以重点不在用不用存储过程上。因此没用使用存储过程也是可以理解的,这样更便于代码的阅读和理解。