总结:实例化SqlParameter时,如果是字符型,一定要指定size属性,还有制定具体的类型
2012-02-02 15:05
288 查看
源地址
在csdn上逛看到了这篇帖子,值得学习,就需要记录下来,转载给大家看!
以前在实例化SqlParameter时,通常都是用下面的语句,没有设置size属性:
根据MSDN解释:如果未在 size 参数中显式设置 Size,则从 dbType 参数的值推断出该大小。
我一直以为是从SqlDbType类型推断,实际上是从参数的值推断,比如"ab",则size值为2,"abcd",则size值为4,且经测试发现,size的值不同时,会导致执行计划不会重用,下面的代码:
通过SqlProfiler捕获到的sql如下:
如果把参数的值改成abcd,则通过SqlProfiler捕获到的sql如下:
通过下面的sql,可以看出执行计划是否有重用:
最后的说明,实例化SqlParameter时,如果是字符型,一定要指定size属性,如:
如果是Int、Float、Bigint之类的参数,可以不用指定size属性
另见13楼所说,不光要指明size的大小,还有制定具体的类型
比如name是varchar类型的,如果不指明具体类型,sql接受的是nvarchar类型的,也会出现问题
见如下地址
如果数据库中的数据类型和程序指定的数据类型不一致,可能会导致很多转换,导致性能的底下!
在csdn上逛看到了这篇帖子,值得学习,就需要记录下来,转载给大家看!
以前在实例化SqlParameter时,通常都是用下面的语句,没有设置size属性:
new SqlParameter("@name", SqlDbType.Varchar) { Value = name };
根据MSDN解释:如果未在 size 参数中显式设置 Size,则从 dbType 参数的值推断出该大小。
我一直以为是从SqlDbType类型推断,实际上是从参数的值推断,比如"ab",则size值为2,"abcd",则size值为4,且经测试发现,size的值不同时,会导致执行计划不会重用,下面的代码:
string sql = "select top 1 * from tb where name = @o"; var para = new SqlParameter("@o", SqlDbType.VarChar) {Value = "ab"}; SqlHelper.ExecuteReader(ReadConnectionString, CommandType.Text, sql, para);
通过SqlProfiler捕获到的sql如下:
exec sp_executesql N'select top 1 * from tb where name = @o',N'@o nvarchar(2)',@o=N'ab'
如果把参数的值改成abcd,则通过SqlProfiler捕获到的sql如下:
exec sp_executesql N'select top 1 * from tb where name = @o',N'@o nvarchar(4)',@o=N'abcd'
通过下面的sql,可以看出执行计划是否有重用:
--先清空执行计划缓存 DBCC FREESYSTEMCACHE ('ALL') DBCC FREEPROCCACHE GO SELECT * FROM sys.dm_exec_cached_plans WHERE cacheobjtype = 'Compiled Plan' GO exec sp_executesql N'select top 1 * from tb where name = @o',N'@o nvarchar(2)',@o=N'ab' GO SELECT * FROM sys.dm_exec_cached_plans WHERE cacheobjtype = 'Compiled Plan' GO exec sp_executesql N'select top 1 * from tb where name = @o',N'@o nvarchar(4)',@o=N'abcd' GO SELECT * FROM sys.dm_exec_cached_plans WHERE cacheobjtype = 'Compiled Plan' GO
最后的说明,实例化SqlParameter时,如果是字符型,一定要指定size属性,如:
new SqlParameter("@name", SqlDbType.Varchar, 4000) { Value = name };
如果是Int、Float、Bigint之类的参数,可以不用指定size属性
另见13楼所说,不光要指明size的大小,还有制定具体的类型
比如name是varchar类型的,如果不指明具体类型,sql接受的是nvarchar类型的,也会出现问题
见如下地址
如果数据库中的数据类型和程序指定的数据类型不一致,可能会导致很多转换,导致性能的底下!
相关文章推荐
- 总结:实例化SqlParameter时,如果是字符型,一定要指定size属性,还有制定具体的类型
- 总结:实例化SqlParameter时,如果是字符型,一定要指定size属性,还有制定具体的类型
- 项目总结——SqlParameter的参数设置长度(size属性)
- 项目总结——SqlParameter的参数设置长度(size属性)
- 利用替换的功能生成指定类型的属性
- Page标签 ContentType 属性指定响应的 HTTP 内容类型
- IOS 根据 指定的 字体类型 ,size ,计算 绘制 文本 所需要的 宽度与高度
- Struts的ActionForm中不同类型属性的使用方法总结
- PowerShell函数参数指定数据类型实例
- python删除指定类型(或非指定)的文件实例详解
- Response Contenttype属性 指定MIME类型可以做什么
- MySQL数据类型和常用字段属性总结
- 【Android常用控件】EditText常用属性【二】:为文本输入框指定软键盘类型和软键盘回车键图标设置
- mybaits 插入数据时 如果是日期类型 一定要指明
- 《iOS移动开发从入门到精通》图书连载10:布尔类型、Int类型及实例属性、浮点类型及实例属性
- 【转】NET中反射实现 可空类型 与基础类型的转换 以及获取指定属性的大小问题
- Redis数据类型应用场景及具体方法总结
- Response Contenttype属性 指定MIME类型可以做什么
- MySQL数据类型和常用字段属性总结
- EditText常用属性【二】:为文本输入框指定软键盘类型和软键盘回车键图标设置