对SQLServerDAL.order的研究(不错,有心得)

petshop的order里的所有字段并非全部在实体类生成,所得有点晕,还是先看下他们是怎么做得吧:

privateint orderId;
private DateTime date;
privatestring userId;
private CreditCardInfo creditCard;
private AddressInfo billingAddress;
private AddressInfo shippingAddress;
privatedecimal orderTotal;
private LineItemInfo[] lineItems;
private Nullable<int> authorizationNumber;

上面这些字段是order的一部分字段,再来看看order所有的字段吧(下图是从数据库中截下来的):

那么其他的地址信息呢?其他的地址信息他们把它放在其他实体类了,其他两个实体类是CreditCardInfo、AddressInfo。

还是来看看这两个实体类里都有什么吧:

privatestring firstName;
privatestring lastName;
privatestring address1;
privatestring address2;
privatestring city;
privatestring state;
privatestring zip;
privatestring country;
privatestring phone;
privatestring email

CreditCardInfo类的字段有(这应该是信用卡的信息吧):

privatestring cardType;
privatestring cardNumber;
privatestring cardExpiration;

然后呢还有一点很重要的值得学习的就是,LineItem数组插入到LineItem表中,但是一条insert语句只能吧按照我们常规的想法是

只能插入一条记录吧:

应该是这样的吧:insert into LineItem value(@ID,@LineItem,@ItemId,@Quentity,@Price);

然后在外面加个for循环吧LineItem数组一个个加载下来,加载一个就执行一次Command。

但他们并不是这样做的,他们是这样做的(我就不写它的具体步骤了,经过我加工后的东东吧):

int i=0;
string str="insert into LineItem values(";
stringBuilder sb
=new stringBuilder();
Sqlcommand cmd
=new Sqlcommand();
foreach(LineItem item in order.LineItem){
sb.append(
"@OrderID").append(",@LineNumber").append(i).append(",@ItemId").append(i).append(",@Quentity").append(i).append(",@price").append(i).append(")");

SqlParameter parm
=GetItemParameters(i);
parm[
0].value=item.LineNumber;
parm[
1].value=item.ItemId;
parm[
2].value=item.Quentity;
parm[
3].value=item.Price
foreach(SqlParameter parm in item)
cmd.parameter.add(parm);
i
++;
}

然后呢才是打开数据库,在执行command。真是不比不知道,一比吓一跳,我每次执行都要加载一次command,

这样不仅浪费资源,还会影响性能。

更重要的是他们做的SqlParameter并没有直接new一个Sqlcommand[],而是采用缓存的方法(GetItemParameters),

进一步提高的系统的性能。太赞了。

下面来看看他们的GetItemParameters的具体实现吧:

privatestatic SqlParameter[] GetItemParameters(int i) {
SqlParameter[] parms
= SqlHelper.GetCachedParameters(SQL_INSERT_ITEM + i);

if (parms ==null) {
parms
=new SqlParameter[] {
new SqlParameter(PARM_LINE_NUMBER + i, SqlDbType.Int, 4),
new SqlParameter(PARM_ITEM_ID+i, SqlDbType.VarChar, 10),
new SqlParameter(PARM_QUANTITY+i, SqlDbType.Int, 4),
new SqlParameter(PARM_PRICE+i, SqlDbType.Decimal, 8)};

SqlHelper.CacheParameters(SQL_INSERT_ITEM
+ i, parms);
}

return parms;
}

思考:

为什么GetItemParameters(int i)要传一个变量i过去呢?这是为了保证每次重缓存取出的是不一样的Parameter吧。

我们可以看到order的insert吧,因为这个insert只插入一条记录。所以就不用变量i来做标记了,再来看看order的

GetOrderParameters()

privatestatic SqlParameter[] GetOrderParameters() {
SqlParameter[] parms
= SqlHelper.GetCachedParameters(SQL_INSERT_ORDER);

if (parms ==null) {
parms
=new SqlParameter[] {
new SqlParameter(PARM_USER_ID, SqlDbType.VarChar, 80),
new SqlParameter(PARM_DATE, SqlDbType.DateTime, 12),
new SqlParameter(PARM_SHIP_ADDRESS1, SqlDbType.VarChar, 80),
new SqlParameter(PARM_SHIP_ADDRESS2, SqlDbType.VarChar, 80),
new SqlParameter(PARM_SHIP_CITY, SqlDbType.VarChar, 80),
new SqlParameter(PARM_SHIP_STATE, SqlDbType.VarChar, 80),
new SqlParameter(PARM_SHIP_ZIP, SqlDbType.VarChar, 50),
new SqlParameter(PARM_SHIP_COUNTRY, SqlDbType.VarChar, 50),
new SqlParameter(PARM_BILL_ADDRESS1, SqlDbType.VarChar, 80),
new SqlParameter(PARM_BILL_ADDRESS2, SqlDbType.VarChar, 80),
new SqlParameter(PARM_BILL_CITY, SqlDbType.VarChar, 80),
new SqlParameter(PARM_BILL_STATE, SqlDbType.VarChar, 80),
new SqlParameter(PARM_BILL_ZIP, SqlDbType.VarChar, 50),
new SqlParameter(PARM_BILL_COUNTRY, SqlDbType.VarChar, 50),
new SqlParameter(PARM_TOTAL, SqlDbType.Decimal, 8),
new SqlParameter(PARM_BILL_FIRST_NAME, SqlDbType.VarChar, 80),
new SqlParameter(PARM_BILL_LAST_NAME, SqlDbType.VarChar, 80),
new SqlParameter(PARM_SHIP_FIRST_NAME, SqlDbType.VarChar, 80),
new SqlParameter(PARM_SHIP_LAST_NAME, SqlDbType.VarChar, 80),
new SqlParameter(PARM_AUTHORIZATION_NUMBER, SqlDbType.Int)};

SqlHelper.CacheParameters(SQL_INSERT_ORDER, parms);
}

return parms;
}
原文地址:https://www.cnblogs.com/huaizuo/p/2100657.html