SQL Server,Access数据库查询易混点和C#中parameter指定参数长度的优缺点

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

在学校的时候就经常做一些网站,所以这次在公司实习,组长第一次给了一个企业的网站还是很快的完成了。中间并没有遇到什么大的问题,但是还是遇到了两个新手非常容易混淆的小问题,所以拿出来跟大家分享一下。

主要分两个内容: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来测试观察一下这个过程吧。

程序代码如下:

 1public 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); 910             parameter.Value = "nijiushi";11            cmd.Parameters.Add(parameter);1213             SqlDataAdapter adapter = new SqlDataAdapter(cmd);14             DataTable dt = new DataTable();15            adapter.Fill(dt);1617return dt;1819         }

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

06132955-6309d27665874bd788491c61d21bb91

这个时候因为显式的指明了参数的长度,所以跟踪结果中看到参数的长度nvarchar(8)

我们再来试试把参数的长度指定的比给定的参数值得长度小。代码如下:

1  SqlParameter parameter = new SqlParameter("@Name", SqlDbType.NVarChar,6);

跟踪结果如下:

06134746-fd47c3807f834a959cb92ee2fbaa144

我们可以看到的是此时参数的长度已经变成了nvarchar(6),而参数的值也被截断为“nijius”

那么没有指名参数长度时,程序是通过sqlDbType.NChar知道参数的长度还是通过后面对参数赋值知道参数的长度呢?

然后我们执行上边的注释的代码,也就是没有指定参数长度的代码,看到的结果如下:

06133303-64a90fd8047e44a2b406322b8b6a4f2

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

06140248-8702bf0ed45e4cf787b1c3d80a36709

由此我们可以知道,程序是通过后面参数的值来得出参数的长度的,而不是通过参数的类型SqlDbType.NVarChar

那么这样到底对程序有什么影响呢?

对于参数长度一样的语句在SQl server中会执行相同的执行计划,但是对于不一样的参数长度的话,会生成新的执行计划.所以,当显式的指明参数的长度的时候会加快sql的执行速度.






     本文转自yisuowushinian 51CTO博客,原文链接:http://blog.51cto.com/yisuowushinian/1265690 ,如需转载请自行联系原作者






相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
6天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
42 10
|
9天前
|
SQL
sql语句加正则 简化查询
sql语句加正则 简化查询
12 0
sql语句加正则 简化查询
|
27天前
|
SQL
sql server链接查询
sql server链接查询
17 1
|
27天前
|
SQL
sql server简单查询
sql server简单查询
14 1
|
28天前
|
SQL 数据库
sql server中创建数据库和表的语法
sql server中创建数据库和表的语法
17 1
|
16天前
|
SQL 关系型数据库 MySQL
mysql一条sql查询出多个统计结果
mysql一条sql查询出多个统计结果
13 0
|
6天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
61 6
|
27天前
|
SQL
sql高级查询
sql高级查询
12 0
|
6天前
|
存储 SQL Oracle
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
31 7
|
7天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例