SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点
2013-08-06 18:35
260 查看
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中看到的执行结果如下:
![](http://images.cnitblog.com/blog/326954/201308/06132955-6309d27665874bd788491c61d21bb91c.png)
这个时候因为显式的指明了参数的长度,所以跟踪结果中看到参数的长度nvarchar(8)。
我们再来试试把参数的长度指定的比给定的参数值得长度小。代码如下:
1 SqlParameter parameter = new SqlParameter("@Name", SqlDbType.NVarChar,6);
跟踪结果如下:
![](http://images.cnitblog.com/blog/326954/201308/06134746-fd47c3807f834a959cb92ee2fbaa144e.png)
我们可以看到的是此时参数的长度已经变成了nvarchar(6),而参数的值也被截断为“nijius”
那么没有指名参数长度时,程序是通过sqlDbType.NChar知道参数的长度还是通过后面对参数赋值知道参数的长度呢?
然后我们执行上边的注释的代码,也就是没有指定参数长度的代码,看到的结果如下:
![](http://images.cnitblog.com/blog/326954/201308/06133303-64a90fd8047e44a2b406322b8b6a4f2e.png)
这时候我们看到测试软件跟踪的结果是一样的,但是可以看到的就是下边的参数长度已经被确定为nvarchar(8)。我们可以试着改变参数的值来看一下。比如我把参数的值改为“nijiu”,再看测试的结果如下:
![](http://images.cnitblog.com/blog/326954/201308/06140248-8702bf0ed45e4cf787b1c3d80a367094.png)
由此我们可以知道,程序是通过后面参数的值来得出参数的长度的,而不是通过参数的类型SqlDbType.NVarChar
那么这样到底对程序有什么影响呢?
对于参数长度一样的语句在SQl server中会执行相同的执行计划,但是对于不一样的参数长度的话,会生成新的执行计划.所以,当显式的指明参数的长度的时候会加快sql的执行速度.
相关文章推荐
- SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点
- SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点
- SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点
- SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点 分类: MSSQLServer C# 2013-08-07 08:47 1171人阅读 评论(0) 收藏
- SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点
- SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点
- SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点
- SQL SERVER--指定查询优化参数
- SQL Server 系统表使用-查询指定数据库中用户表及其列、数据类、长度
- C# ACCESS 查询提示“至少一个参数没有被指定”问题
- C# 一次查询多表,填充DataSet并指定表名
- C#截取指定长度中英文字符串方法
- SQL SERVER中查询参数为空(null)时默认查询所有的实现
- C#新手入门代码 padleft,padright在字符串前,后加入指定字符,让字符串达到指定长度
- 在C#中截取指定长度的中文字符串(效率提高2500倍)
- Sql server 查询指定时间区间工作日数、休息日数等日期操作
- C#通过OleDb查询获取Access数据库表名
- 13.01.17 c# Linq 从查询的结果中返回指定数量的记录
- 用C#截取指定长度的中英文混合字符串 改进版--转载