|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
它有很多缺点的,有兴趣可以到网上去搜索一下。于是微软有发明了“下一代”C++:C++/CLI语言,这个可以解决在.NETFramework中,托管C++产生的问题。在《程序员》杂志上,lippman和李建中合作连载介绍了C++/CLI语言。看到良多伴侣在实例化SqlParameter时,一般都没有指定参数的长度就间接给参数赋值了。就像上面的写法:
newSqlParameter("@address",SqlDbType.Varchar){Value=address};
之前也一向都觉的加与不加参数长度应当没有甚么区分,仅是写法上的分歧罢了,今天看到一年老的贴子,才分明实在二者纷歧样的,为了进步sql实行速率,请为SqlParameter参数加上size属性。
上面我们剖析一下二者的区分:
依据MSDN注释:假如未在size参数中显式设置Size,则从dbType参数的值揣度出该巨细。
假如你以为下面的揣度出该巨细是指从SqlDbType范例揣度,那你就错了,它实践上是从你传过去的参数的值来揣度的,好比传送过去的值是"shengzhen",则size值为9,"shanghai",则size值为8。那末,分歧的size值会激发甚么样的了局呢?且经测试发明,size的值分歧时,会招致数据库的实行企图不会重用,如许就会每次实行sql的时分从头天生新的实行企图,而华侈数据库实行工夫。
好比:
stringsql="selecttop1*fromtable1whereaddress=@address";
SqlParameter[]parameter=newSqlParameter("@address",SqlDbType.VarChar){Value="shanghai"};
SqlHelper.ExecuteReader(ConnectionString,CommandType.Text,sql,parameter)
我们经由过程数据库跟踪工具SqlProfiler捕捉到的sql以下:
execsp_executesqlNselecttop1*fromtable1whereaddress=@address,N@addressnvarchar(8),@address=Nshanghai
假如把参数的值改成shengzhen,则经由过程SqlProfiler捕捉到的sql以下:
execsp_executesqlNselecttop1*fromtable1whereaddress=@address,N@addressnvarchar(9),@o=Nshengzhen
然后经由过程上面的sql来测试实行企图是不是有重用:
--清空实行企图缓存
DBCCFREESYSTEMCACHE(ALL)
DBCCFREEPROCCACHE
GO
execsp_executesqlNselecttop1*fromtable1whereaddress=@address,N@addressnvarchar(8),@address=Nshanghai
GO
SELECT*FROMsys.dm_exec_cached_plansWHEREcacheobjtype=CompiledPlan
GO
execsp_executesqlNselecttop1*fromtable1whereaddress=@address,N@addressnvarchar(9),@o=Nshengzhen
GO
SELECT*FROMsys.dm_exec_cached_plansWHEREcacheobjtype=CompiledPlan
GO
你会发明,第一条sql与第二条sql会各自天生本人的实行企图,而假如@address参数的长度一样的话,会利用统一个实行企图。
总结:
实例化SqlParameter时,假如是字符型,必定要指定size属性,如最下面的界说,应当修正为:
newSqlParameter("@address",SqlDbType.Varchar,4000){Value=address};
假如是Int、Float、Bigint,DateTime之类的参数,能够不必指定size属性。但假如size指定毛病,则大概呈现没法预知的毛病。c语言的编译器,几乎是所有新平台都有的。因此从这点上看,c语言的程序,比其他任何语言更加容易跨平台。 |
|