源地址

在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属性,还有制定具体的类型...相关推荐

  1. php字符型和数字型的注入,Sql注入的分类:数字型+字符型

    Sql注入: 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以 ...

  2. 通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目

    通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目 一.前言 1.通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目包括用Kei ...

  3. VS里SCANF_S不能输入字符型问题(输入字符型变量时,scanf语句被忽略!!!!)

    输入字符型变量时,scanf语句被忽略!!!! while循环里不能输入两次(用两个scanf)嘛? 字符char换成整型int 型就可以 感觉就这一句代码的前后有问题 解决方法: 在scanf前加上 ...

  4. 字符型常量和字符串常量的区别

    1. 字符型常量和字符串常量的区别 形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符 含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表 ...

  5. C语言中字符型在计算机中的存储

    一. 字符型的分类和表示范围 char:是有符号还是无符号数视编译器而定,一般为有符号数,下文把它全部当成有符号数进行讨论 表示范围:32位和64位机器上均是一个字节,所以是八个bit位,最高位为符号 ...

  6. matlab整型和浮点的区别,技术帖 | 心理学MATLAB初学者教程--简单数据类型介绍(逻辑型数据,整型/浮点型数据,字符型)......

    1.2.1 什么是变量和变量名 变量这个词似乎在许多地方都有出现,在计算机中变量是指是一段有名字的连续存储空间(摘自百度百科),而这个所谓的名字就叫做变量名.举个例子说现在我们再MATLAB的命令窗口 ...

  7. c语言中合法的字符型常量是,C语言习题库(带答案)-排版.doc

    一.选择题 1.以下不能定义为用户标识符的是( ). (A) MAIN (B) _HJ (C) 2ong (D) LINE1 2.以下不能定义为用户标识符的是( ) (A) If (B) H_J (C ...

  8. JAVA的知识点4——字符型变量/常量 boolean类型变量/常量

    字符型变量/常量 字符型在内存中占2个字节,在Java中使用单引号来表示字符常量.例如'A'是一个字符,它与"A"是不同的,"A"表示含有一个字符的字符串. 例 ...

  9. c语言中c为字符型便量,c='97'是否正确,C语言判断题Word版

    <C语言判断题Word版>由会员分享,可在线阅读,更多相关<C语言判断题Word版(3页珍藏版)>请在人人文库网上搜索. 1.传播优秀Word版文档 ,希望对您有帮助,可双击去 ...

最新文章

  1. angular.js 嵌套路由
  2. php simpletest 测试数据库,在PHP中使用SimpleTest进行单元测试
  3. H3C无线 AC网关式部署无线开局(WEB版)
  4. 转:VirtualBox虚拟机网络连接设置的四种方式
  5. Linux 利用yum源安装subversion(svn)客户端
  6. javaee和javaee_JavaEE概念简介
  7. PAT-1127. ZigZagging on a Tree (30)
  8. Dubbo(九) dubbo的配置文件加载顺序优先级
  9. 信息系统项目管理师备考指南
  10. 迅捷caj转word转换器怎么用
  11. Circular Local MiniMax
  12. 【5G核心网】PFCP Message PFCP 消息
  13. 外卖分销分佣小程序外卖cps小程序返利系统源码分享
  14. 计算机竞赛等级,美国计算机奥林匹克竞赛等级
  15. Android内存管理(9)*MAT:Heap Dump,Shallow Heap,Retained Heap,Dominating Tree,GC Roots等的含义...
  16. JavaScript 详细笔记(狂神说学习笔记)
  17. MBA面试系列之----中文面试宝典(一)
  18. 哲理故事与管理之道(21)-用情感激励下属
  19. 计算机考研高数试卷答案,考研数学试卷大全(全国各高校历年试卷)
  20. 修复使用vimplus后,修改终端字体为Droid Sans Mono Nerd Font的时候虽然已经安装了但是找不到的情况

热门文章

  1. Java天使之恋攻略,跑跑卡丁车手游天使之恋怎么得 天使之恋获取攻略[多图]
  2. 讯飞语音识别_赛诺语音输入法报告 搜狗、讯飞、百度AI语音输入哪家强
  3. FPGA的配置引脚以及配置过程
  4. C# 8新提案让泛型Attribute成为现实
  5. 【Android源码】AlertDialog 源码分析
  6. Mac安装双系统-win10
  7. C#编程(十六)----------匿名类型
  8. openresty url重写
  9. WCF系列(一) -- 完全不使用配置文件构建和使用WCF服务
  10. 华为实习日记——第四天