KMCT分页控件与存储过程分页完美结合存储过程分页篇

时间:2022-12-24 07:24:09 其他范文 收藏本文 下载本文

KMCT分页控件与存储过程分页完美结合存储过程分页篇(通用10篇)由网友“鲤鱼辅以葱姜蒜”投稿提供,以下是小编精心整理的KMCT分页控件与存储过程分页完美结合存储过程分页篇,希望对大家有所帮助。

KMCT分页控件与存储过程分页完美结合存储过程分页篇

篇1:KMCT分页控件与存储过程分页完美结合存储过程分页篇

上一篇分页控件(KCMT开源控件之--方便简洁的分页控件)出来以后,好几位网友期待我的存储过程分 页与该控件结合使用的例程,这个星期工作很忙,一直没有时间完成,今天终于抽出时间来完成这篇文章 。

首先从存储过程分页谈起

为什么要选择用存储过程分页呢?其实原因很简单,数据库查询功能的性能终究是有限的。即使我们 对数据库进行了最优配置,对数据表设计再三斟酌,然而一旦面临海量数据,且返回结果集较大的时候, 常规的查询语句就无能为力了。一般说来,当返回的结果集超过总数量的40%时,数据库层面上的优化就 显得束手无策了。此时,我相信大多数同行首先想到的便是分页。当我们指定好每页的记录总数 (PageSize)和当前页的索引(CurrentPage)时,理想的状况便发生了,首先我们不再从一个海量数据 (百万级)中检索出超过40%的数据量,我们可以做个估算如果每页显示50条记录,那么也就是从100万条 记录中查询50条记录,这个比例我相信大家都比较清楚。其次,网络中的数据通信量将大大缩减,我想这 笔帐就不用我再做过多解释。同时,查询数量的减少对内存开销、页面的刷新、用户的等待时间都会得到 相应的减少。

好处颇多,如何实现呢?我大致总结了以下几种实现方式。下面,我将一一介绍:

我将表分成两类

1.数据表中有唯一的自增索引,并且这个字段没有出现断号现象。在此我姑且称之为连续表,后面文 章中出现的连续表就是指此类表。

2.数据表中不存在唯一的自增索引,或者存在唯一自增索引,但是由于删除记录等操作让该索引不连 续,对于这类表我称之为不联系表。

分页之前我们模拟一张产品表,其结构如下图:

插入1000000条记录

DECLARE @I INTSET @I=0WHILE(@I<1000000)BEGININSERT INTO PRODUCT(ProductName,ProductAddDate) VALUES('产品名',GETDATE)SET @I=@I+1END

同时给出存储过程的结构,由于今天只讨论分页,所以查询条件、排序分组方法等请读者自行补充。

CREATE PROCEDURE SelectProduct @PageSize int, @CurrentPage int, @TotalPage int outputASBEGIN --select methodENDGO

说明:由于上一篇文章的分页控件需要一个总页数的参数,因此将@TotalPage 作为输出参数返回符合 记录的总页数。@CurrentPage为0表示

第一页。

执行存储过程代码

SET STATISTICS PROFILE ON SET STATISTICS IO ON SET STATISTICS TIME ON GODECLARE @return_value int, @TotalPage intEXEC @return_value = [dbo].[SelectProduct] @PageSize = 50, @CurrentPage = 1, @TotalPage = @TotalPage OUTPUTSELECT @TotalPage as N'@TotalPage'SELECT 'Return Value' = @return_valueGOSET STATISTICS PROFILE OFF SET STATISTICS IO OFF SET STATISTICS TIME OFF

测试环境:

Win、SqlServer、720775条记录、每页50条记录、本机直接访问数据库、每组10次查询取平均值

连续表的分页方案:

方案:利用ID筛选出要得到的数据

CREATE PROCEDURE SelectProduct @PageSize int, @CurrentPage int, @TotalPage int outputASBEGIN EXEC('SELECT TOP '+@PageSize+'* FROM Product WHERE ProductId>('+@PageSize+'*'+@CurrentPage+')') SELECT @TotalPage=COUNT(*)/@PageSize FROM ProductEND

说明:SELECT TOP 后面不能直接跟变量,所以采用了拼接sql的办法

测试结果:

页码执行时间(ms) 11100 2100045000910000 1314000 16

分析结果发现在百万级数据都在小于0.1秒,这足以满足大多数要求,但是随着数据页的增大呈现一种 查询变缓的趋势。

当然还有其他对ID进行比较的如:between and and so,当然还有游标分页,虽然通用性很好,但 是性能很差。今天我就不一一列举,因

为今天要讨论的重点是不连续表的分页技术。

不连续表的分页技术

为了让上面的表不连续我们将部分记录删除

DELETE FROM Product WHERE ProductId%24=0

执行完成后(30032 行受影响)即30032条记录被删除,如果我们再用连续表的分页方式在此表上分页就 不再适用。因为检索的记录中存在断

号现象。所以我们需寻求新的方法分页

方案一:重建数据表的唯一自增索引

DBCC CHECKIDENT (Product, RESEED,1)

重建之后采用连续表的分页方式,因为该方式是效率最高的分页查询,

该方案不适用于将该唯一自增 索引作为其他表外键的关系型数据库,

这样将会导致数据混乱,望慎用。

方案二:采用临时表分页

局部临时表的生存期一次会话过程,说得简单点就是当一个用户执行一个查询时创建,查询执行完成 后自动删除。

CREATE PROCEDURE [dbo].[SelectProduct] @PageSize int, @CurrentPage int, @TotalPage int outputASBEGIN DECLARE @BeginID INT ,@EndID INT SET @BeginId=@PageSize*@CurrentPage SET @EndID=@PageSize*(@CurrentPage+1) CREATE TABLE #TmpProduct( Id int IDENTITY(1,1) PRIMARY KEY, ProductId int not null) INSERT INTO #TmpProduct(ProductId) SELECT ProductId FROM Product SET @TotalPage=@@ROWCOUNT/@PageSize SELECT * FROM Product as p,#TmpProduct as t WHERE p.ProductId=t.ProductId and t.ProductId BETWEEN @BeginId AND @EndIDEND

测试结果:

记录总数查询时间(ms)10000 198100000 669250000 1454500000 3980700000 5543

由此我们发现规律,当数据量越小查询速度也就越快,因此该方法适用于小数据量的表。从执行计划 中发现向临时表中插入数据占用了整个

查询过程的90%-95%时间,而真正查询我们想要的产品记录仅仅占了5%-10%,那么有没有办法不去反复 执行插入过程呢?那么我们可以采用

全局临时表或者普通表,代码如下:

首先创建全局临时表并插入记录:

CREATE TABLE ##TmpProduct( Id int IDENTITY(1,1) PRIMARY KEY, ProductId int not null) INSERT INTO ##TmpProduct(ProductId) SELECT ProductId FROM Product

重写存储过程

CREATE PROCEDURE [dbo].[SelectProduct] @PageSize int, @CurrentPage int, @TotalPage int outputASBEGIN DECLARE @BeginID INT ,@EndID INT SET @BeginId=@PageSize*@CurrentPage SET @EndID=@PageSize*(@CurrentPage+1) SELECT * FROM Product as p,##TmpProduct as t WHERE p.ProductId=t.ProductId and t.ProductId BETWEEN @BeginId AND @EndID SELECT @TotalPage=COUNT(*)/@PageSize FROM PRODUCTEND

测试结果:

记录总数 查询时间(ms)10000 1010000027250000415000006970000086

综合两种临时表分页方法分析,很明显采用全局临时表分页的效率远高于局部临时表分页,但是全局 临时表需要定时维护,包括记录改变,

索引改变。这种维护成本限制了该方法的发展。所以,在小数据量的情况下建议使用局部临时表分页 ,如果数据量较大请参考下面的方案。

方案三:采用ROW_NUMBER()分页

CREATE PROCEDURE [dbo].[SelectProduct] @PageSize int, @CurrentPage int, @TotalPage int outputASBEGIN DECLARE @BeginID INT ,@EndID INT SET @BeginId=@PageSize*@CurrentPage SET @EndID=@PageSize*(@CurrentPage+1) SELECT * FROM (SELECT *,ROW_NUMBER()OVER(order by ProductId) AS ROWNUM FROM Product) as t WHERE ROWNUM BETWEEN @BeginId AND @EndID SELECT @TotalPage=COUNT(*)/@PageSize FROM Product END

测试结果:

记录总数 查询时间(ms)10000210100000 150250000 165500000 69700000 86

从统计数据中不难看出

综合所有分页我们发现,分页无非就是对记录的编号进行处理,如果编号符合我们要求的我们就可以 用连续表的方式直接使用,如果不符合

要求的,我们便改变这种编号使其符合要求,如重新建立编号,其实临时表和ROW_NUMBER()均属于重 建编号的过程。

备注:文章中的数据均亲自实测得来,该数据仅作参考和比较,不同的目标机运行时间都将不同。如 果文章中存在不正确的观点和看法,望

大家指出,不能误导读者。请大家尊重笔者的劳动果实,望注明出处: www.cnblogs.com/4inwork。当明白了存储过程分页的原

理子后下篇文章将结合控件来一个具体事例。

篇2:存储过程实现分页

USE [HDIS]

GO

/****** Object: StoredProcedure [dbo].[AspNetPager] Script. Date: 12/30/ 09:00:35 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

Create procedure [dbo].[AspNetPager]

(@tablename nvarchar (1000), --表名

@filedname nvarchar (4000), --查询的字段

@startIndex int, --起始记录数

@endIndex int, --结束记录数

@where nvarchar (4000), --条件 (不包含where)

@orderfiled nvarchar (100), --排序字段 (CreateDate desc)

@PageSize int,

@prmkeyName nvarchar (100),

@pageIndex int,

@docount bit)

as

begin

declare @date varchar(50),@sql nvarchar (4000) ,@i int

select @date =CONVERT(nvarchar(50), serverproperty(‘productversion‘))

--if(CONVERT(int, SUBSTRING(@date,0,3))>8) ------sql以上

-- begin

-- if(@docount=1)

-- set @sql = ‘select count(*) from ‘ + @tablename +‘ where ‘ + @where

-- else

-- begin

-- set @sql =‘

-- with temptbl as (

-- SELECT ROW_NUMBER() OVER (ORDER BY ‘+ @orderfiled +‘ )AS Row, * from ‘+ @tablename +‘ where ‘+ @where +‘)

-- SELECT ‘+ @filedname +‘ FROM temptbl where Row between ‘+CONVERT(nvarchar(100),@startIndex) +‘ and ‘+CONVERT(nvarchar(100),@endIndex )

-- END

-- exec (@sql)

-- end

--else

begin -------sql2000

if(@docount=1)

set @sql = ‘select count(*) from ‘ + @tablename +‘ where ‘ + @where

else

begin

set @i= CONVERT(nvarchar(100),@PageSize)*(CONVERT(nvarchar(100),@pageIndex)-1)

set @sql = ‘SELECT TOP ‘+ CONVERT(nvarchar(100),@PageSize) +‘ *

FROM ‘ + @tablename +‘ WHERE (‘+@where +‘ and‘+@prmkeyName+‘ NOT IN

(SELECT TOP ‘+CONVERT(nvarchar(100),@i)+‘ ‘ +@prmkeyName +‘

FROM ‘ + @tablename +‘ WHERE ‘ + @where+‘ ORDER BY ‘+ @orderfiled +‘)) ORDER BY ‘+ @orderfiled

end

--print(@sql)

exec (@sql)

end

end

篇3:分页存储过程代码

-10-10sql with as用法详解

2013-01-01sqlserver中关于WINDOWS性能计数器的介绍

2013-06-06解析sql中得到刚刚插入的数据的id

2014-06-06SQL Server出现System.OutOfMemoryException异常的解决方法

-03-03将Session值储存于SQL Server中

2013-10-10利用SQL语句给字段加注释的方法

2013-02-02SQL Server利用bcp命令把SQL语句结果生成文本文件

2014-03-03sql时间格式化输出、Convert函数应用示例

-06-06三步堵死 SQL Server注入漏洞

2009-08-08一个简单的SQL 行列转换语句

篇4:分页存储过程代码

最近更 新

sqlserver性能调优经验总结

SqlServer 实用操作小技巧集合

sqlserver中求字符串中汉字的个数的sql语

sqlserver数据库移动数据库路径的脚本示例

mssql server 存储过程里,bulk insert t

SQL 多表连接查询实现语句

sql语句返回主键SCOPE_IDENTITY

如何在 SQL SERVER 中快速有条件删除海量

深入SQL Server中定长char(n)与变长varch

全文检索技术 sql server

热 点 排 行

SQL Server 图文安装教程

SQL Server 安装图解教程(附

sqlserver中distinct的用法(不重

SQL Server导入、导出、备份数据

SQL语句去掉重复记录,获取重复记

SQL Server数据库入门学习总结

SQL Server错误代码大全及解释(

sql convert函数使用小结

sql 时间函数 整理的比较全了

用SQL语句添加删除修改字段、一些

篇5:一个分页存储过程代码

-12-12一个常用的报表统计SQL语句

-04-04SQL Server 数据库转 SQL Server 的方法小结

-03-03搜索sql语句

2007-03-03海量数据库的查询优化及分页算法方案

-09-09一个删选数据的例子,使用GROUP、DISTINCT实例解析

2008-10-10在 SQLSERVER 中快速有条件删除海量数据

2010-08-08ADO.NET EF中的实体修改方法

2013-11-11sql server获得新记录标识列值的二种方法

2013-06-06浅析被遗忘的SQLServer比较运算符修饰词

2012-06-06ROW_NUMBER SQL Server 2005的LIMIT功能实现(ROW_NUMBER()排序函

篇6:一个分页存储过程代码

最近更 新

SQL 判断给定日期值(或时间段)所在星期的

Sql function 多行中的列合并为一行一列的

SQL Server中减小Log文件尺寸的方法分享

分享SQL Server删除重复行的6个方法

sql获取分组排序后数据的脚本

sqlserver数据库迁移后,孤立账号解决办法

SQLServer 数据库中如何保持数据一致性

使用xp_cmdshell注销Windows登录用户(终端

Sql Server 2000 行转列的实现(横排)

SQL里面用自定义Split完成个性化需求

热 点 排 行

SQL Server 图文安装教程

SQL Server 安装图解教程(附

sqlserver中distinct的用法(不重

SQL Server导入、导出、备份数据

SQL语句去掉重复记录,获取重复记

SQL Server数据库入门学习总结

SQL Server错误代码大全及解释(

sql convert函数使用小结

sql 时间函数 整理的比较全了

用SQL语句添加删除修改字段、一些

篇7:关于存储过程分页,我的测试情况

在精华区中关于存储过程分页大概有三种思路

分别是:

临时表,参见658037 在下提供一个存储过程分页的方法

游标,参见658066 一种理论上最快的Web数据库分页方法!

set rowcount 方法,参见

658606 关于存储过程分页

我做了一个10万条记录的表来进行测试

结果临时表光建立数据就用了四十秒

游标有大小限制,我的机子上最大只能到1万条,更多的就无法用了,

关于存储过程分页,我的测试情况

set rowcount 方法不错,5000多页,只用不到1秒。

呵呵

篇8:一个高效的分页存储过程

一个高效的分页存储过程

最近在做一个几百万条数据的分页查询,研究了各种方案,在本机上用项目的实际数据库做测试,测试过程 is very 痛苦,不堪回首ing,现在废话不多说,直接上结果,相信这也是大多数搜索答案的人最愿意看的方式。

以下是存储过程的代码:

1 CREATE PROCEDURE [dbo].[P_GridViewPager] (

2  @recordTotal INT OUTPUT,      --输出记录总数

3  @viewName VARCHAR(800),    --表名

4  @fieldName VARCHAR(800) = '*',    --查询字段

5  @keyName VARCHAR(200) = 'Id',      --索引字段

6  @pageSize INT = 20,          --每页记录数

7  @pageNo INT =1,          --当前页

8  @orderString VARCHAR(200),    --排序条件

9  @whereString VARCHAR(800) = '1=1'    --WHERE条件

10 )

11 AS

12 BEGIN

13   DECLARE @beginRow INT

14   DECLARE @endRow INT

15   DECLARE @tempLimit VARCHAR(200)

16   DECLARE @tempCount NVARCHAR(1000)

17   DECLARE @tempMain VARCHAR(1000)

18   --declare @timediff datetime

19

20   set nocount on

21   --select @timediff=getdate --记录时间

22

23   SET @beginRow = (@pageNo - 1) * @pageSize  + 1

24   SET @endRow = @pageNo * @pageSize

25   SET @tempLimit = 'rows BETWEEN ' + CAST(@beginRow AS VARCHAR) +' AND '+CAST(@endRow AS VARCHAR)

26

27   --输出参数为总记录数

28   SET @tempCount = 'SELECT @recordTotal = COUNT(*) FROM (SELECT '+@keyName+' FROM '+@viewName+' WHERE '+@whereString+') AS my_temp'

29   EXECUTE sp_executesql @tempCount,N'@recordTotal INT OUTPUT',@recordTotal OUTPUT

30

31   --主查询返回结果集

32   SET @tempMain = 'SELECT * FROM (SELECT ROW_NUMBER() OVER (order by '+@orderString+') AS rows ,'+@fieldName+' FROM '+@viewName+' WHERE '+@whereString+') AS main_temp WHERE '+@tempLimit

33

34   --PRINT @tempMain

35   EXECUTE (@tempMain)

36   --select datediff(ms,@timediff,getdate()) as 耗时

37

38   set nocount off

39 END

40

41 GO

完工!

篇9:分页实现方法的性能比较存储过程

我们先给出几种主要的分页方法和核心语句,然后直接给出结论,有兴趣的读者可以看看后面的数据

几种常用存储过程分页方法

TopN方法

select Top(@PageSize) from TableName where ID Not IN

(Select Top ((@PageIndex-1)*@PageSize) ID from Table Name where .... order by ... )

where .... order by ...

临时表

declare @indextable table(id int identity(1,1),nid int,PostUserName nvarchar(50))

declare @PageLowerBound int

declare @PageUpperBound int

set @PageLowerBound=(@pageindex-1)*@pagesize--下限

set @PageUpperBound=@PageLowerBound+@pagesize--上限

set rowcount @PageUpperBound

insert into @indextable(nid,PostUserName) select ReplyID,PostUserName from TableName order by ......

select * from TableName p,@indextable t where p.ID=t.nid

and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id

CTE--新语法,类似临时表,但是生命周期稍微不同,这里只是他的一个运用

withcte_temp--定义零时表,PageIndex是一个计算字段,储存了搜索结果的页号

As (ceiling((Row_Number() over(order by.... )-1)/@pagesize as int) as PageIndex,* from TableName where.....)

select * fromcte_temp where pageindex=@pageindex-1;

结论:

TopN在小页数下最快,如果在10页以下,可以考虑用它,CTE和临时表时间很稳定,CTE消耗的时间比临时表多,但是不会引起tempdb的暴涨和IO增加

性能比较

试验环境:winserver,Sqlserver2005,库大小2,567,245行,没有where子句,试验时每页大小50,页码作为变量

取0,3,10,31,100,316,1000,3162...页,也就是10的指数,试验结果如下

页数TopNCTE临时表临时表老论坛存储过程CTE改进1312101014577302315779552446471911012755048838014646116325889672122360197676021004680973816642354867151316452719764323386752272551000无法计算9806869257863589483162无法计算98222485411012460821010000无法计算975478121192614250735931623无法计算97751872933218152497511100000无法计算无法计算3153855569171396124

数据解释和分析

临时表分为有没有缓存两种时间,CTE就是上面的方法,CTE改进只是把选入CTE临时表的列数减少了,只选取了页号和主键,Null表示时间无法计算(时间太长),数据单位是毫秒.

从上面的数据可

关 键 字:MYSQL

篇10:通用分页存储过程真的有注入漏洞吗

今天看了两篇关于存储过程SQL注入漏洞的文章:

1):如此高效通用的分页存储过程是带有sql注入漏洞的

2):防SQL注入:生成参数化的通用分页查询语句

怎么看怎么觉的别扭,在我印象中存储过程是不会存在注入漏洞的啊?起码我目前的水平还不了解如何 注入存储过程,如果大家有注入的方法请指教。换句话说存储过程本身并无注入漏洞,只不过有漏洞大多 都是因为程序漏洞导致。

我们来简化下之前两位园友讨论的分页存储过程,原代码太长,我这里呢写一个针对一个单表查询的存 储过程。创建一个用户表,表结构如下:有三个字段,人员ID,姓名字段。

CREATE TABLE [dbo].[person](

[id] [int] NULL,

[last_name] [varchar](30) COLLATE Chinese_PRC_CI_AS NULL,

[first_name] [varchar](30) COLLATE Chinese_PRC_CI_AS NULL

) ON [PRIMARY]

然后写一个查询存储过程(getPerson):作用,根据不同的条件读取用户信息。

IF ( EXISTS ( SELECT *

FROM sysobjects

WHERE id = OBJECT_ID(N'[dbo].[getPerson]')

AND OBJECTPROPERTY(id, N'IsProcedure') = 1 ) )

BEGIN

DROP PROCEDURE [dbo]. [getPerson]

END

Go

CREATE PROC getPerson

@strWhere VARCHAR(100) = '' -- 查询条件 (注意: 不要加 where)

AS

BEGIN

DECLARE @strSQL VARCHAR(1000) -- 主语句

SET @strSQL = 'select top 10 * from person where 1=1 '

--如果存在条 件,则加上

IF @strWhere != ''

BEGIN

SET @strSQL = @strSQL + @strWhere

END

PRINT ( @strSQL )

EXEC ( @strSQL

)

END

查询方式,根据用户的姓来查询。要想最终的存储过程执行语法正确,同时不存在注入漏洞, 此时条 件的正确格式是:and first_name like '%Jim''s dog%'。

我们可以看到条件Jim's dog组装成SQL后,中间的单引号一定要变成两个。为了避免注入,我一般这 样处理SQL拼接的安全问题:在C#写程序的时候应该这样写:

///

/// 屏蔽字符串中的特殊字符

/// by minjiang 07-07-06

///

public string SafeRequest (string str)

{

//定义要返回的字符串

string sReturn;

//将要处理的字符串转换为小写字母

str = str.ToLower ();

//定义特殊字符串

string SQL_KILL = “'|and|exec|insert|select|delete|update|count|*|%

|chr|mid|master|truncate|char|declare|set|;|from|=|--|drop|<|>”;

char[] separator ={ '|' };

string[] sql = SQL_KILL.Split(separator);

for(int i=0;i

{

//如果有特殊 字符则将它替换成为空

if(str.IndexOf (sql [i].ToString ().ToLower ())>-1)

{

//把单引号替换成双引号

if (sql[i].ToString() == ”'“)

{ str = str.Replace(”'“, ”''“); }

else

{

//把敏感字符替 换成空

str = str.Replace(sql[i].ToString().ToLower(), ”“);

}

}

}

sReturn = str;

return sReturn;

}

if(sUserName!=”“)

{

strWhere +=” and first_name like'%“+this.SafeRequest(sUserName)+”%'“

}

分页存储过程注入的机会: 上面的通用分页存储过程之所以会说存在SQL注入的机会,是因为通配符 like后面的单引号,如果在后面参数中也出现单引号与like通配符后面的单引号相匹配后,后面的内容就 是SQL注入的内容了,

此时我们可以写一个过滤SQL特殊字符的方法,对特殊字符进行处理,可能根据自己 的情况,选取相应过滤条件。最起码要把用户名中的单引号替换成双引号。下面的写法是不安全的:用户 名中有单引号,例如 :Jim's dog

if(sUserName!=”“)

{

strWhere +=” and first_name like'%“+sUserName+”%'"

}

说明:园友 小No提到,能够通过把输入注入条件编码成十六进制编码来骗过过滤程序。这种情况的确存 在,所有可以针对html标签中又属于SQL敏感字符的内容进行十六进制的比较。例如:‘,;。“-”不用 处理,因为它不会被HTML编码。

我个人不太支持这种所谓高效的通用分页存储过程,理由:

1:可阅读性太差,整版的字符串,谁看着都不舒服。

2:对应用程序有比较高的安全要求,稍不注意就会存在上面所说的注入漏洞。

3:对多表的复杂查询无能无力。如果强行应用,我想远比单独写一个存储过程来的麻烦。

4:所谓通用,即大多数人都知道你这个存储过程的大致结构,这样无疑给别有用心者更多可趁之机。

针对分页存储过程的处理,不妨看看这篇:你是如何面对大量分页需求的?

总结:通用分页存储过程本身是没有漏洞可言的,只不过是程序的不严谨造成的注入机会。

解决这种拼接SQL字符串可能带来的隐患方案:

1:尽量对输入参数进行类型设置,能设置成数字型的一定要设成数字型。

2:设置好参数的长度,一个字符串,例如姓名,一般不会超过20个字符。

3:输入的参数内容能删除空格的就最好利用Trim(),这样,就算有SQL敏感字符,一旦SQL连接成一串 ,那也是不能够正常注入。

4:尽量过滤传入的条件,起码要把单引号替换成双引号。

5:严格设置数据库用户的权限,负责查询的用户,只让它具有读的权限,这样就算是注入成功,也不 能造成致命的后果。

具有插入权限的用户,严格控制删除,更新的权限。而佣有删除权限的用户,一般都佣有查看权限, 删除操作是很难存在SQL注入的。

计算机二级答案

医院床位资源管理系统的设计与实现论文

SSH构建的银行管理系统设计与实现论文

Access数据处理方法论文

一份比较全的PHP笔试题

如何正确有效学习计算机二级

论文:探讨IPTV系统中EPG模块框架的设计和实现

存储过程实现分页

一个高效的分页存储过程

提高性能:XP中硬盘的优化技巧Windows安全

KMCT分页控件与存储过程分页完美结合存储过程分页篇
《KMCT分页控件与存储过程分页完美结合存储过程分页篇.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【KMCT分页控件与存储过程分页完美结合存储过程分页篇(通用10篇)】相关文章:

浅谈mssql access数据库 top分页方法2023-05-24

Windows 服务器入侵前兆检测方法技巧服务器教程2023-09-19

基于WEB的工作计划流程管理系统的设计与实现2023-07-22

初学驾驶证心得体会2023-11-26

windows服务器防止asp木马详细教程Windows服务器操作系统2022-04-30

基于ASPnet绩效工资管理系统设计与实现论文2023-12-27

网站建设实验心得体会1000字2022-05-06

操作系统实习报告2022-09-25

校园网站设计方案2023-11-07

SEO分页指南:浅谈内容分页的优点和缺点2022-12-10