总结:实例化SqlParameter时,如果是字符型,一定要指定size属性,还有制定具体的类型...
源地址
在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 FREEPROCCACHEGOSELECT * FROM sys.dm_exec_cached_plans WHERE cacheobjtype = 'Compiled Plan'GOexec sp_executesql N'select top 1 * from tb where name = @o',N'@o nvarchar(2)',@o=N'ab'GOSELECT * FROM sys.dm_exec_cached_plans WHERE cacheobjtype = 'Compiled Plan'GOexec sp_executesql N'select top 1 * from tb where name = @o',N'@o nvarchar(4)',@o=N'abcd'GOSELECT * 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类型的,也会出现问题
见如下地址
如果数据库中的数据类型和程序指定的数据类型不一致,可能会导致很多转换,导致性能的底下!
转载于:https://www.cnblogs.com/pmars/archive/2012/02/02/2335811.html
总结:实例化SqlParameter时,如果是字符型,一定要指定size属性,还有制定具体的类型...相关推荐
- php字符型和数字型的注入,Sql注入的分类:数字型+字符型
Sql注入: 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以 ...
- 通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目
通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目 一.前言 1.通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目包括用Kei ...
- VS里SCANF_S不能输入字符型问题(输入字符型变量时,scanf语句被忽略!!!!)
输入字符型变量时,scanf语句被忽略!!!! while循环里不能输入两次(用两个scanf)嘛? 字符char换成整型int 型就可以 感觉就这一句代码的前后有问题 解决方法: 在scanf前加上 ...
- 字符型常量和字符串常量的区别
1. 字符型常量和字符串常量的区别 形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符 含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表 ...
- C语言中字符型在计算机中的存储
一. 字符型的分类和表示范围 char:是有符号还是无符号数视编译器而定,一般为有符号数,下文把它全部当成有符号数进行讨论 表示范围:32位和64位机器上均是一个字节,所以是八个bit位,最高位为符号 ...
- matlab整型和浮点的区别,技术帖 | 心理学MATLAB初学者教程--简单数据类型介绍(逻辑型数据,整型/浮点型数据,字符型)......
1.2.1 什么是变量和变量名 变量这个词似乎在许多地方都有出现,在计算机中变量是指是一段有名字的连续存储空间(摘自百度百科),而这个所谓的名字就叫做变量名.举个例子说现在我们再MATLAB的命令窗口 ...
- c语言中合法的字符型常量是,C语言习题库(带答案)-排版.doc
一.选择题 1.以下不能定义为用户标识符的是( ). (A) MAIN (B) _HJ (C) 2ong (D) LINE1 2.以下不能定义为用户标识符的是( ) (A) If (B) H_J (C ...
- JAVA的知识点4——字符型变量/常量 boolean类型变量/常量
字符型变量/常量 字符型在内存中占2个字节,在Java中使用单引号来表示字符常量.例如'A'是一个字符,它与"A"是不同的,"A"表示含有一个字符的字符串. 例 ...
- c语言中c为字符型便量,c='97'是否正确,C语言判断题Word版
<C语言判断题Word版>由会员分享,可在线阅读,更多相关<C语言判断题Word版(3页珍藏版)>请在人人文库网上搜索. 1.传播优秀Word版文档 ,希望对您有帮助,可双击去 ...
最新文章
- angular.js 嵌套路由
- php simpletest 测试数据库,在PHP中使用SimpleTest进行单元测试
- H3C无线 AC网关式部署无线开局(WEB版)
- 转:VirtualBox虚拟机网络连接设置的四种方式
- Linux 利用yum源安装subversion(svn)客户端
- javaee和javaee_JavaEE概念简介
- PAT-1127. ZigZagging on a Tree (30)
- Dubbo(九) dubbo的配置文件加载顺序优先级
- 信息系统项目管理师备考指南
- 迅捷caj转word转换器怎么用
- Circular Local MiniMax
- 【5G核心网】PFCP Message PFCP 消息
- 外卖分销分佣小程序外卖cps小程序返利系统源码分享
- 计算机竞赛等级,美国计算机奥林匹克竞赛等级
- Android内存管理(9)*MAT:Heap Dump,Shallow Heap,Retained Heap,Dominating Tree,GC Roots等的含义...
- JavaScript 详细笔记(狂神说学习笔记)
- MBA面试系列之----中文面试宝典(一)
- 哲理故事与管理之道(21)-用情感激励下属
- 计算机考研高数试卷答案,考研数学试卷大全(全国各高校历年试卷)
- 修复使用vimplus后,修改终端字体为Droid Sans Mono Nerd Font的时候虽然已经安装了但是找不到的情况