SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点
在学校的时候就经常做一些网站,所以这次在公司实习,组长第一次给了一个企业的网站还是很快的完成了。中间并没有遇到什么大的问题,但是还是遇到了两个新手非常容易混淆的小问题,所以拿出来跟大家分享一下。
主要分两个内容:1)SQL Server,Access数据库查询的易混点;2)C#中parameter指定参数长度对程序性能的影响
1)SQL Server,Access数据库查询的易混点
学习SQl的都知道,我们要在数据库中实现模糊查询是要使用Like语句的,同时使用一些通配符来完成对查询内容的模糊匹配。
第一个通配符就是“%”,只要是完成对任意字符的匹配(在Access数据库中使用“*”);第二个通配符“_”是完成对单个字符的匹配;
但是在程序中是什么样子呢?
因为我所做的网站使用的是Access数据库,当我在程序中使用“*”通配符查询数据库时,无论如何在自己创建的DataTable实例化的对象中始终没有数据,刚开始怀疑是DataAdapter中不能使用“Like”这样的命令语句。最终经过测试发现,如果在程序中使用“%”操作符时,就会有数据。
虽然在Access中使用“*”来完成模糊匹配,但是在C#程序中还是要使用“%”来完成模糊匹配。
2)C#中parameter指定参数长度对程序性能的影响
其实我自己也一直有一个疑问就是关于实例化SqlParameter对象,其中我们都会去指明参数,参数类型,还有参数长度(注意很多时候我们都是都省去这一步的)。如下面的实例声明方法:
1 //显式指定参数长度
2 SqlParameter parameter1 = new SqlParameter("@home", SqlDbType.NChar, 4);
3 //不指明参数长度
4 SqlParameter parameter2 = new SqlParameter("@home", SqlDbType.NChar);
到底我们指明参数的长度对程序的性能有没有影响呢。
在微软的MSDN中的解释是“在参数声明时,如果未显式设置,则从指定参数值的实际大小推断出该大小。”
我们还是写一段小程序,然后使用SQL Server2008自带的SQL Server Profiler来测试观察一下这个过程吧。
程序代码如下:

1 public DataTable GetTable()
2 {
3 SqlConnection con = new SqlConnection(strConnection);
4 SqlCommand cmd = new SqlCommand("select * from testsql5 where name=@Name", con);
5
6 //这里两句来测试程序语句获取参数的方法
7 //SqlParameter parameter = new SqlParameter("@Name", SqlDbType.NVarChar);
8 SqlParameter parameter = new SqlParameter("@Name", SqlDbType.NVarChar,8);
9
10 parameter.Value = "nijiushi";
11 cmd.Parameters.Add(parameter);
12
13 SqlDataAdapter adapter = new SqlDataAdapter(cmd);
14 DataTable dt = new DataTable();
15 adapter.Fill(dt);
16
17 return dt;
18
19 }

在程序中,首先执行的是未被注释的代码,在SQL Server Profiler中看到的执行结果如下:

这个时候因为显式的指明了参数的长度,所以跟踪结果中看到参数的长度nvarchar(8)。
我们再来试试把参数的长度指定的比给定的参数值得长度小。代码如下:
1 SqlParameter parameter = new SqlParameter("@Name", SqlDbType.NVarChar,6);
跟踪结果如下:

我们可以看到的是此时参数的长度已经变成了nvarchar(6),而参数的值也被截断为“nijius”
那么没有指名参数长度时,程序是通过sqlDbType.NChar知道参数的长度还是通过后面对参数赋值知道参数的长度呢?
然后我们执行上边的注释的代码,也就是没有指定参数长度的代码,看到的结果如下:

这时候我们看到测试软件跟踪的结果是一样的,但是可以看到的就是下边的参数长度已经被确定为nvarchar(8)。我们可以试着改变参数的值来看一下。比如我把参数的值改为“nijiu”,再看测试的结果如下:

由此我们可以知道,程序是通过后面参数的值来得出参数的长度的,而不是通过参数的类型SqlDbType.NVarChar
那么这样到底对程序有什么影响呢?
对于参数长度一样的语句在SQl server中会执行相同的执行计划,但是对于不一样的参数长度的话,会生成新的执行计划.所以,当显式的指明参数的长度的时候会加快sql的执行速度.
如果您觉得不错,点击右下角,分享一下吧!您的支持,是我写作的动力!

SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点的更多相关文章
- SQL Server 跨数据库查询
语句 SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field "DBO"可以省略 如 SELECT * F ...
- sql server多数据库查询 远程数据库查询
--创建链接服务器 exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','服务器地址' exec sp_addlinkedsrvlogin 'srv_lnk ...
- 【转】SQL Server海量数据库的索引、查询优化及分页算法
探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...
- Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码)
Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码) http://blog.csdn.net/helonsy/article/details/7207497 ...
- 如何转换SQL Server 2008数据库到SQL Server 2005
背景介绍: 公司一套系统使用的是SQL SERVER 2008数据库,突然一天收到邮件,需要将这套系统部署到各个不同地方(海外)的工厂,需要在各个工厂部署该数据库,等我将准备工作做好,整理文档 ...
- SQL Server附加数据库时报1813错误的解决方案
SQL Server附加数据库时报1813错误的解决方案 无法打开新数据库 'ASR'.CREATE DATABASE 中止. 文件激活失败.物理文件名称'E:\SqlServer\MSSQL\D ...
- 通过SQL Server 2008数据库复制实现数据库同步备份
SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行 实时数据同步,正常情况下只使用主 ...
- sql server 2000数据库 最近经常出现某进程一直占用资源,阻塞?死锁?
OA的数据库最近多次出现某进程一直占用资源,导致其他进程无法执行.使用sp_who2 和 sql server profiler跟踪查询,发现有以下几个语句常常占用资源: 1.declare @P1 ...
- SQL Server 2012 数据库笔记
慕课网 首页 实战 路径 猿问 手记 Python 手记 \ SQL Server 2012 数据库笔记 SQL Server 2012 数据库笔记 2016-10-25 16:29:33 1 ...
随机推荐
- 基于FPGA的红外遥控解码与PC串口通信
基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...
- oracle实现远程连接超简单;枚举与剪枝();PowerDesigner生成数据库代码注意里面的双引號,应该去掉
点击開始,查看netManager,点击面板的监听程序,默认仅仅有地址1且标记着localhost.新建一个地址,输入本机IP,又一次开启监听程序就可以 △△△ * △△ = △△△△ 某3位数乘以2 ...
- Swift - 类型属性(类静态属性)和类方法(类静态方法)
1,结构体struct和枚举enum的静态属性,静态方法使用static关键字 1 2 3 4 5 6 7 8 9 10 struct Account { var amount : Doub ...
- CentOS7 下linux不能上网解决方法,centos7 eth0 没有ip,IP突然丢失
CentOS7 下linux不能上网解决方法 在CentOS VMware下安装好linux后,发现有时不能直接联网,特分享下总结出来的经验,希望对新手有用 工具/原料 XP系统 VMware.Wo ...
- 玩转Windows服务系列——服务运行、停止流程浅析
原文:玩转Windows服务系列——服务运行.停止流程浅析 通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大 ...
- poj 3270 更换使用
1.确定初始和目标状态. 明确.目标状态的排序状态. 2.得出置换群,.比如,数字是8 4 5 3 2 7,目标状态是2 3 4 5 7 8.能写为两个循环:(8 2 7)(4 3 5). 3.观察当 ...
- WebService-03-使用CXF开发服务端和客户端
写在前面的话 前面两节说了使用Java提供的包开发服务端和客户端,现在使用CXF来开发,CXF提供了两个类发而服务,一个是ServerFactoryBean,另一个是JaxWsServerFactor ...
- Linux创建修改删除用户和组
Linux 创建修改删除用户和组 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就不单单就是useradd了,接下来就来详细了解账号管理的相关信息. 用户信息 先 ...
- 胡na娜、少年和恩师-写在甲午冬的仅仅言片语及感想
[写在全新为移动互联网而生的Zoomla!逐浪CMS2 x2.1公布前] 恩师, 他来到这个乡村中学,带着自己的书.吉它和理想, 用自己最好的三年青春浇灌了这一代人, 在我辍学时,给我鼓舞,帮助我继续 ...
- coreos docker 尝新奇
官方介绍了好几种安装方法,我试了下还是认为vmware的比較靠谱. 官方的下载地址也不是非常稳定,我分享了一个在百度云上面,http://pan.baidu.com/s/1hqgkCmS 解压后,直接 ...