漫漫技术人生路

C#

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  234 随笔 :: 0 文章 :: 30 评论 :: 8 引用

2010年6月7日 #

SQL高级语法汇总
http://hi.baidu.com/vstudycn/blog/item/d34791d8292982e039012fb4.html
CUBE ROLLUP 及COMPUTE关键词
CUBE 关键词是用来将所要进行查询的各分组字段内的数据求和的运算。
COMPUTE关键字则是用来将分组做小计,也就是说将字段内进行分组并且将每一组生成一或多个总和 平均值等

范例
select cust_id,SUM(pay1) AS pay11 from pay_list GROUP BY pay1 WITH CUBE
go
以上代码导致错误因为在SUM汇总函数所指定的字段名称pay1与CUBE关键词一并使用所导致发生的错误消息
修改
SELECT cust_id,SUM(pay1) as pay11 FROM pay_list GROUP BY cust_id WITH CUBE
GO

ROLLUP关键词
将GROUP BY后面所加的第一个字段名称来求和而其他的字段并不做
ROLLUP以及CUBE关键词二者之间不同的地方就是ROLLUP只会将GROUP BY后面的第一个字段名称求总和而CUBE则会将每一个字段都求总和的操作

范例
SELECT 厂商编号,产品名称,SUM(数量) AS 总数量 FROM proced GROUP BY 厂商编号,产品名称 WITH ROLLUP
GO
COMPUTE关键词
用来将分组小计也就是在字段内进行分组,并且将每一组生成一或多个总和 平均值等
范例
select 厂商编号,产品名称,数量 from proced compute sum(数量)
go

以厂商编号作为分类根据时
select 厂商编号,产品名称,数量 from proced order by 厂商编号 COMPUTE SUM(数量) BY 厂商编号
go

RETURN 语句
将目前正在执行的批处理T-SQL语句,退出程序或语句中断,并返回或不返回数值。
当RETURN语句与存储过程一起使用时,其RETURN并不会返回一个NULL值。但当某程序尝试返回NULL值时,则会生成警告消息,接着会返回一个为0的数值。

语法声明
return [integer_expression]
integer_expression指要返回的整数值

范例
--return的使用范例
create procedurecheck_maxdata
as
if(select state from authors where au_id='123-34-45')
return 1
else
return 2
WAITFOR语句
WAITFOR语句是用来指定触发语句组,存储过程或事物执行的时间,时间间隔或事件。执行WAITFOR语句之后,必须等到指定的时间或指定的事件发生后,才能使用到SQL Server 的连接。
如果 想知道目前谁在使用或等待时,可以使用系统存储过程sp_who来了解。

声明语法
WAITFOR{DELAY 'time'|TIME 'time'}
参数说明
DELAY用来设置要SQL Server必须要等待所到指定的时数已过时,才可以使用SQL Server的连接
time 用来指定要等待的时间
只能指定时间而不能设置日期。其等待时间的设置最多可指定到24小时。

TIME用来指示SQL Server等待到所指定的时间。

范例
--此范例会在下午6:00时会执行select_data 存储过程
begin
waitfor TIME '18:00'
EXEC select_data
end

begin
waitfor TIME '15:20'
print 'ninhao'
end

范例
--WAITFOR DELAY的使用范例
use pubs
go
--设置要sql server 等待一分钟再执行下列语句
waitfor delay '00:01:00'
select * from authors
go
CASE
根据条件列表之后来执行表达式,其CASE可分为两种格式:
1 一种格式是属于简单的CASE格式,这种CASE会比较表达式与一组简单表达式,以便决定结果。
2 另一种格式是属于搜索的CASE格式,这种格式会评估一组布尔表达式,以便决定其结果。

简单CASE声明
CASE input_expression
WHEN when_expression THEN result_expression
[..n]
[
ELSE else_result_expression
END

如果想使用搜索CASE格式时,可以根据下面的语法来进行声明
CASE
WHEN Boolean_expression THEN result_expression
[..n]
[
ELSE else_result_expression
END

RAISERROR 语句
RAISERROR语句会返回用户所自定义的错误消息,并且设置系统旗标,记录曾发生过的错误。
使用RAISERROR指定用户自定义的错误消息时,请使用大于50,000的错误消息代码和0至18的重要性层级。

使用系统存储过程sp_addmessage来创建自定义的错误消息

RAISERROR语句其语法声明

使用RAISERROR语句来创建并返回用户自定义的错误信息时,请使用sp_addmessage来添加用户自定义的错误消息,并使用sp_dropmessage来删除用户自定义的错误消息。
发生错误时,错误代码会放置在@@ERROR函数中,此函数存放着最近生成的错误代码。

范例
--使用RAISERROR的范例
--使用sp_addmessage来创建自定义错误消息,其中76548是指错误代码,9是代表严重程度,而"错误消息测试"则是代表消息内容
EXEC sp_addmessage 76548,9,'错误消息测试'
GO
RAISERROR(76548,9,1)

posted @ 2010-06-07 09:14 javaca88 阅读(133) 评论(0) 编辑

2009年6月26日 #

<html>
<script type="text/javascript" language="javascript">
    function ismaxlength(obj)
    { 
 alert(obj.value.length);
        var mlength=obj.getAttribute ? parseInt(obj.getAttribute("maxlength")) : "";
     if (obj.getAttribute && obj.value.length>mlength) 
     { 
         obj.value=obj.value.substring(0,mlength) 
     }
    } 
     
     
    function imposeMaxLength(obj)
    { 

        var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : "";
        if(obj.value.length >= mlength)
  {
   obj.value=obj.value.substring(0,mlength) 
  }
  
  if(obj.value.length >512)
  {
   document.getElementById("show1024").value = obj.value.length;
  }
  else
  {
   document.getElementById("show512").value = obj.value.length;
  }

    }
</script>
<div>
<span style="width:480px;float:left;" ><input type="text" id="show512" value="" /><input type="button" value="Clear" onclick="javascript:document.getElementById('show512').value=''" /></span>
<span style="width:480px;float:right;"><input type="text" id="show1024" value="" />
<input type="button" value="Clear" onclick="javascript:document.getElementById('show1024').value=''" />
</span>
</div>
<div>
<span style="float:left;">
<textarea maxlength="512" title="512" style="width:480px; height:800px;" onblur="javascript:imposeMaxLength(this);" onkeypress="javascript:ismaxlength(this);"> fs </textarea>
</span>
<span style="float:right;">
<textarea maxlength="1024" title="1024" style="width:480px; height:800px;" onblur="javascript:imposeMaxLength(this);" onkeypress="javascript:ismaxlength(this);"> fs </textarea>
</span>
</div>
</html>

posted @ 2009-06-26 08:51 javaca88 阅读(61) 评论(0) 编辑

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<span>聚焦索引与非聚焦索引及其查询效率</span>
<pre>
随着“金盾工程”建设的逐步深入和公安信息化的高速发展,公安计算机应用系统被广泛应用在各警种、各部门。
与此同时,应用系统体系的核心、系统数据的存放地――数据库也随着实际应用而急剧膨胀,一些大规模的系统,
如人口系统的数据甚至超过了1000万条,可谓海量。
那么,如何实现快速地从这些超大容量的数据库中提取数据(查询)、分析、
统计以及提取数据后进行数据分页已成为各地系统管理员和数据库管理员亟待解决的难题。

在以下的文章中,我将以“办公自动化”系统为例,探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页。
以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构:

CREATE TABLE [dbo].[TGongwen] ( --TGongwen是红头文件表名

[Gid] [int] IDENTITY (1, 1) NOT NULL ,
--本表的id号,也是主键

[title] [varchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,
--红头文件的标题

[fariqi] [datetime] NULL ,
--发布日期

[neibuYonghu] [varchar] (70) COLLATE Chinese_PRC_CI_AS NULL ,
--发布用户

[reader] [varchar] (900) COLLATE Chinese_PRC_CI_AS NULL ,

--需要浏览的用户。每个用户中间用分隔符“,”分开

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO


下面,我们来往数据库中添加1000万条数据:

declare @i int

set @i=1

while @i <=250000

begin

insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-2-5','通信科','通信科,办公室,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,治安支队,外事科','这是最先的25万条记录')

set @i=@i+1

end

GO


declare @i int

set @i=1

while @i <=250000

begin

insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-9-16','办公室','办公室,通信科,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,外事科','这是中间的25万条记录')

set @i=@i+1

end

GO


declare @h int

set @h=1

while @h <=100

begin

declare @i int

set @i=2002

while @i <=2003

begin

declare @j int

set @j=0

while @j <50

begin

declare @k int

set @k=0

while @k <50

begin

insert into Tgongwen(fariqi,neibuyonghu,reader,title) values(cast(@i as varchar(4))+'-8-15 3:'+cast(@j as varchar(2))+':'+cast(@j as varchar(2)),'通信科','办公室,通信科,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,外事科','这是最后的50万条记录')

set @k=@k+1

end

set @j=@j+1

end

set @i=@i+1

end

set @h=@h+1

end

GO


declare @i int

set @i=1

while @i <=9000000

begin

insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-5-5','通信科','通信科,办公室,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,治安支队,外事科','这是最后添加的900万条记录')

set @i=@i+1000000

end

GO

通过以上语句,我们创建了25万条由通信科于2004年2月5日发布的记录,25万条由办公室于2004年9月6日发布的记录,
2002年和2003年各100个2500条相同日期、不同分秒的由通信科发布的记录(共50万条),
还有由通信科于2004年5月5日发布的900万条记录,合计1000万条。


一、因情制宜,建立“适当”的索引

建立“适当”的索引是实现查询优化的首要前提。

索引(index)是除表之外另一重要的、用户定义的存储在物理介质上的数据结构。当根据索引码的值搜索数据时,
索引提供了对数据的快速访问。事实上,没有索引,数据库也能根据SELECT语句成功地检索到结果,
但随着表变得越来越大,使用“适当”的索引的效果就越来越明显。
注意,在这句话中,我们用了“适当”这个词,这是因为,如果使用索引时不认真考虑其实现过程,
索引既可以提高也会破坏数据库的工作性能。

(一)深入浅出理解索引结构

实际上,您可以把索引理解为一种特殊的目录。
微软的SQL SERVER提供了两种索引:
聚集索引(clusteredindex,也称聚类索引、簇集索引)和非聚集索引(nonclusteredindex,也称非聚类索引、非簇集索引)。
下面,我们举例来说明一下聚集索引和非聚集索引的区别:

其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,
就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,
而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。
如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;
同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。
也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。

我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,
这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,
然后根据这个字后的页码直接翻到某页来找到您要找的字。
但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,
比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,
检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。
很显然,这些字并不是真正的分别位于“张”字的上下方,
现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,
是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,
但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。

我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。

进一步引申一下,我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。

(二)何时使用聚集索引或非聚集索引

下面的表总结了何时使用聚集索引或非聚集索引(很重要)。
动作描述                       使用聚集索引               使用非聚集索引
大数目的不同值                  不应                         应

频繁更新的列                     不应                         应

外键列                              应                           应

主键列                              应                           应

频繁修改索引列                   不应                         应


事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。
比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,
这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,
因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;
而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。

(三)结合实际,谈索引使用的误区

理论的目的是应用。虽然我们刚才列出了何时应使用聚集索引或非聚集索引,
但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。
下面我们将根据在实践中遇到的实际问题来谈一下索引使用的误区,以便于大家掌握索引建立的方法。

1、主键就是聚集索引

这种想法笔者认为是极端错误的,是对聚集索引的一种浪费。虽然SQL SERVER默认是在主键上建立聚集索引的。

通常,我们会在每个表中都建立一个ID列,以区分每条数据,并且这个ID列是自动增大的,步长一般为1。
我们的这个办公自动化的实例中的列Gid就是如此。此时,如果我们将这个列设为主键,SQL SERVER会将此列默认为聚集索引。
这样做有好处,就是可以让您的数据在数据库中按照ID进行物理排序,但笔者认为这样做意义不大。

显而易见,聚集索引的优势是很明显的,而每个表中只能有一个聚集索引的规则,这使得聚集索引变得更加珍贵。

从我们前面谈到的聚集索引的定义我们可以看出,使用聚集索引的最大好处就是能够根据查询要求,迅速缩小查询范围,
避免全表扫描。在实际应用中,因为ID号是自动生成的,我们并不知道每条记录的ID号,
所以我们很难在实践中用ID号来进行查询。这就使让ID号这个主键作为聚集索引成为一种资源浪费。
其次,让每个ID号都不同的字段作为聚集索引也不符合“大数目的不同值情况下不应建立聚合索引”规则;
当然,这种情况只是针对用户经常修改记录内容,特别是索引项的时候会负作用,但对于查询速度并没有影响。

在办公自动化系统中,无论是系统首页显示的需要用户签收的文件、会议还是用户进行文件查询等
任何情况下进行数据查询都离不开字段的是“日期”还有用户本身的“用户名”。

通常,办公自动化的首页会显示每个用户尚未签收的文件或会议。
虽然我们的where语句可以仅仅限制当前用户尚未签收的情况,但如果您的系统已建立了很长时间,
并且数据量很大,那么,每次每个用户打开首页的时候都进行一次全表扫描,这样做意义是不大的,
绝大多数的用户1个月前的文件都已经浏览过了,这样做只能徒增数据库的开销而已。
事实上,我们完全可以让用户打开系统首页时,数据库仅仅查询这个用户近3个月来未阅览的文件,
通过“日期”这个字段来限制表扫描,提高查询速度。如果您的办公自动化系统已经建立的2年,
那么您的首页显示速度理论上将是原来速度8倍,甚至更快。

在这里之所以提到“理论上”三字,是因为如果您的聚集索引还是盲目地建在ID这个主键上时,
您的查询速度是没有这么高的,即使您在“日期”这个字段上建立的索引(非聚合索引)。
下面我们就来看一下在1000万条数据量的情况下各种查询的速度表现(3个月内的数据为25万条):

(1)仅在主键上建立聚集索引,并且不划分时间段:

Select gid,fariqi,neibuyonghu,title from tgongwen

用时:128470毫秒(即:128秒)

(2)在主键上建立聚集索引,在fariq上建立非聚集索引:

select gid,fariqi,neibuyonghu,title from Tgongwen

where fariqi> dateadd(day,-90,getdate())

用时:53763毫秒(54秒)

(3)将聚合索引建立在日期列(fariqi)上:

select gid,fariqi,neibuyonghu,title from Tgongwen

where fariqi> dateadd(day,-90,getdate())

用时:2423毫秒(2秒)

虽然每条语句提取出来的都是25万条数据,各种情况的差异却是巨大的,特别是将聚集索引建立在日期列时的差异。
事实上,如果您的数据库真的有1000万容量的话,把主键建立在ID列上,就像以上的第1、2种情况,
在网页上的表现就是超时,根本就无法显示。这也是我摒弃ID列作为聚集索引的一个最重要的因素。

得出以上速度的方法是:在各个select语句前加:declare @d datetime

set @d=getdate()

并在select语句后加:

select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())

2、只要建立索引就能显著提高查询速度

事实上,我们可以发现上面的例子中,第2、3条语句完全相同,且建立索引的字段也相同;
不同的仅是前者在fariqi字段上建立的是非聚合索引,后者在此字段上建立的是聚合索引,
但查询速度却有着天壤之别。所以,并非是在任何字段上简单地建立索引就能提高查询速度。

从建表的语句中,我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。
在此字段上建立聚合索引是再合适不过了。在现实中,我们每天都会发几个文件,这几个文件的发文日期就相同,
这完全符合建立聚集索引要求的:“既不能绝大多数都相同,又不能只有极少数相同”的规则。
由此看来,我们建立“适当”的聚合索引对于我们提高查询速度是非常重要的。

3、把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度

上面已经谈到:在进行数据查询时都离不开字段的是“日期”还有用户本身的“用户名”。
既然这两个字段都是如此的重要,我们可以把他们合并起来,建立一个复合索引(compound index)。

很多人认为只要把任何字段加进聚集索引,就能提高查询速度,
也有人感到迷惑:如果把复合的聚集索引字段分开查询,那么查询速度会减慢吗?
带着这个问题,我们来看一下以下的查询速度(结果集都是25万条数据):
(日期列fariqi首先排在复合聚集索引的起始列,用户名neibuyonghu排在后列)

(1)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5'

查询速度:2513毫秒

(2)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5' and neibuyonghu='办公室'

查询速度:2516毫秒

(3)select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu='办公室'

查询速度:60280毫秒

从以上试验中,我们可以看到如果仅用聚集索引的起始列作为查询条件
和同时用到复合聚集索引的全部列的查询速度是几乎一样的,
甚至比用上全部的复合索引列还要略快(在查询结果集数目一样的情况下);
而如果仅用复合聚集索引的非起始列作为查询条件的话,这个索引是不起任何作用的。
当然,语句1、2的查询速度一样是因为查询的条目数一样,如果复合索引的所有列都用上,
而且查询结果少的话,这样就会形成“索引覆盖”,因而性能可以达到最优。

同时,请记住:无论您是否经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。

(四)其他书上没有的索引使用经验总结

1、用聚合索引比用不是聚合索引的主键速度快

下面是实例语句:(都是提取25万条数据)

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

使用时间:3326毫秒

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid <=250000

使用时间:4470毫秒

这里,用聚合索引比用不是聚合索引的主键速度快了近1/4。

2、用聚合索引比用一般的主键作order by时速度快,特别是在小数据量情况下

select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi

用时:12936

select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid

用时:18843

这里,用聚合索引比用一般的主键作order by时,速度快了3/10。
事实上,如果数据量很小的话,用聚集索引作为排序列要比使用非聚集索引速度快得明显的多;
而数据量如果很大的话,如10万以上,则二者的速度差别不明显。

3、使用聚合索引内的时间段,搜索时间会按数据占整个数据表的百分比成比例减少,而无论聚合索引使用了多少个

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1'

用时:6343毫秒(提取100万条)

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-6-6'

用时:3170毫秒(提取50万条)

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

用时:3326毫秒(和上句的结果一模一样。如果采集的数量一样,那么用大于号和等于号是一样的)

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1' and fariqi <'2004-6-
</pre>
</html>

posted @ 2009-06-26 08:50 javaca88 阅读(124) 评论(0) 编辑

2008年4月2日 #

    该文被密码保护。
posted @ 2008-04-02 12:55 javaca88 阅读(50) 评论(0) 编辑

2006年11月1日 #

      protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
      

        GridViewRow selectRow = GridView1.Rows[e.NewSelectedIndex];
    
        string strId = selectRow.Cells[0].Text;

        if (BLL.updatepro.CountNum(strId) == 0)
        {
            Response.Write("<script>alert('没有数据,请添加数据');</script>");
            FormView1.ChangeMode(FormViewMode.Insert);
            
        }
        else
        {
            if (FormView1.CurrentMode != FormViewMode.ReadOnly)
            {
                FormView1.ChangeMode(FormViewMode.ReadOnly);
            }
        }
    }

 /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
   {
  
     
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
   
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void FormView1_ItemCommand(object sender, FormViewCommandEventArgs e)
    {
        if (e.CommandName == "Edit")
        {
            FormView1.ChangeMode(FormViewMode.Edit);
        }
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void DropDownList6_SelectedIndexChanged(object sender, EventArgs e)
    {
        HiddenField hi = (HiddenField)FormView1.FindControl("eid");
        DropDownList dr6 = (DropDownList)FormView1.FindControl("DropDownList6");
        hi.Value = dr6.SelectedValue;
        SqlDataSource3.UpdateParameters["creatEmployId"].DefaultValue = hi.Value;
       
      //  Response.Write(SqlDataSource3.InsertParameters[1].DefaultValue);
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void DropDownList7_SelectedIndexChanged(object sender, EventArgs e)
    {
        HiddenField hi = (HiddenField)FormView1.FindControl("eid7");
        DropDownList dr6 = (DropDownList)FormView1.FindControl("DropDownList7");
        hi.Value = dr6.SelectedValue;
        SqlDataSource3.UpdateParameters[6].DefaultValue = hi.Value;
       
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void DropDownList4_SelectedIndexChanged(object sender, EventArgs e)
    {
        HiddenField hi = (HiddenField)FormView1.FindControl("eid4");
        DropDownList dr6 = (DropDownList)FormView1.FindControl("DropDownList4");
        hi.Value = dr6.SelectedValue;
        SqlDataSource3.UpdateParameters[7].DefaultValue = hi.Value;
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void SqlDataSource3_Updating(object sender, SqlDataSourceCommandEventArgs e)
    {
       
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void FormView1_PageIndexChanging(object sender, FormViewPageEventArgs e)
    {

    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void FormView1_ItemUpdating(object sender, FormViewUpdateEventArgs e)
    {
        if (SqlDataSource3.UpdateParameters[7].DefaultValue == null)
        {
             DropDownList dr6 = (DropDownList)FormView1.FindControl("DropDownList4");
             SqlDataSource3.UpdateParameters[7].DefaultValue = dr6.Text;
        }

        if (SqlDataSource3.UpdateParameters[6].DefaultValue == null)
        {
            DropDownList dr6 = (DropDownList)FormView1.FindControl("DropDownList7");
            SqlDataSource3.UpdateParameters[7].DefaultValue = dr6.Text;
        }

        if (SqlDataSource3.UpdateParameters["creatEmployId"].DefaultValue == null)
        {
            DropDownList dr6 = (DropDownList)FormView1.FindControl("DropDownList6");
            SqlDataSource3.UpdateParameters["creatEmployId"].DefaultValue = dr6.Text;
        }

    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void DropDownList3_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList dr6 = (DropDownList)FormView1.FindControl("DropDownList3");
        SqlDataSource3.InsertParameters[1].DefaultValue = dr6.SelectedValue;
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList dr6 = (DropDownList)FormView1.FindControl("DropDownList2");
        SqlDataSource3.InsertParameters[6].DefaultValue = dr6.SelectedValue;
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void DropDownList5_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList dr6 = (DropDownList)FormView1.FindControl("DropDownList5");
        SqlDataSource3.InsertParameters[7].DefaultValue = dr6.SelectedValue;
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void FormView1_ItemInserting(object sender, FormViewInsertEventArgs e)
    {
        if (SqlDataSource3.InsertParameters[7].DefaultValue == null)
        {
            DropDownList dr6 = (DropDownList)FormView1.FindControl("DropDownList5");
            SqlDataSource3.InsertParameters[7].DefaultValue = dr6.Text;
        }

        if (SqlDataSource3.InsertParameters[6].DefaultValue == null)
        {
            DropDownList dr6 = (DropDownList)FormView1.FindControl("DropDownList2");
            SqlDataSource3.InsertParameters[6].DefaultValue = dr6.Text;
        }

        if (SqlDataSource3.InsertParameters["creatEmployId"].DefaultValue == null)
        {
            DropDownList dr6 = (DropDownList)FormView1.FindControl("DropDownList3");
            SqlDataSource3.InsertParameters["creatEmployId"].DefaultValue = dr6.Text;
        }

    }

posted @ 2006-11-01 15:44 javaca88 阅读(516) 评论(0) 编辑

2006年10月30日 #

 最经典的实现字符数控制的方案
当我们在ASP.NET开发时,经常会遇到一个头疼的问题:字符数的控制
 由于数据库的字段长度是固定的,因此在进行字符输入时,最关键的就是控制字符的个数不能超过字段的长度,要不然,一个个异常会让人疯掉的。
  对于单行文本框,不管是HTML控件还是Web控件,我们经常会使用MaxLength来控制,但这种控制无法控制到中文字符,即MaxLength=50的控制,可以输入50个英文与50个中文,这样的话,还是会导致中文字符数的溢出。
  对于多行文本框,那就更惨了,使用MaxLenth根本不起作用的。

下面提供的方案优势:
  1)最佳的方法是在文本框中输入时,控制到最大字数,超过时不能进行输入;

  2)对于粘帖的情况也要能兼容,以前网上的方法不能控制到paste的情况;

  3)对于最后的一个中文字符,宁愿舍去也不能多一个字符,比如50的字符数,在第49个时,最后输入一个中文,会导致最终字数为51,而这种情况,推荐是不能输入中文,保证最终的字符数<=50最佳,因为放弃一个中文字符总比数据库报错要好吧。
 4)为了提高开发效率,尽可能的减少代码量,此方案不需要为文本框添加任何事件,而是由脚本块自己解决,因此只需要把脚本块饮包含到页面中就可以了,这应该是相当方便了吧 
 
完善版修改:由于前一个方案中,一些输入法无法激活onpress事件,导致对于中文的不支持,现在采用onkeyup事件处理,在处理方式上也进行了修改,原来的onpress事件是进行输入控制,而onkeyup只能对已经输入后的字数进行字数判断,过长的进行截短处理。

  在原方案中,有位朋友指出:数据采用n(type)系统不会报错,是的,如果采用n(type)的话,是以字符为基础的,可以不考虑数据库出错的可能性,但同样也存在一个界面显示的问题,比如界面上的Address值,希望是100个字符,如果不进行中英文字数区分,最多将输入100个中文,从而占200个字节空间,导致Adress在显示时会超过预料的空间,界面搞得不易控制。因此,此方案还是有可取之处的。
具体新方案实现:
 1)将以下的代码包含到页面中:

<script language="javascript"> 
<!-- 

String.prototype.len
=function(){ 
return this.replace(/[^\x00-\xff]/g,"**").length; 


//Set maxlength for multiline TextBox 
function setMaxLength(object,length) 
{
    
    
var result = true
    
var controlid = document.selection.createRange().parentElement().id; 
    
var controlValue = document.selection.createRange().text; 
    
var tempString=object.value;
    
    
var tt=""
    
for(var i=0;i<length;i++
        { 
            
if(tt.len()<length) 
                tt
=tempString.substr(0,i+1); 
            
else 
                
break
        } 
    
if(tt.len()>length)
        tt
=tt.substr(0,tt.length-1);
    object.value
=tt;
    
    


//Check maxlength for multiline TextBox when paste 
function limitPaste(object,length) 

        
var tempLength = 0
        
if(document.selection) 
        { 
            
if(document.selection.createRange().parentElement().id == object.id) 
            { 
                tempLength 
= document.selection.createRange().text.len(); 
            } 
        } 
        
var tempValue = window.clipboardData.getData("Text"); 
        tempLength 
= object.value.len() + tempValue.len() - tempLength; 

        
if (tempLength > length) 
        { 
            tempLength 
-= length; 
            
var tt=""
            
for(var i=0;i<tempValue.len()-tempLength;i++
                { 
                    
if(tt.len()<(tempValue.len()-tempLength)) 
                        tt
=tempValue.substr(0,i+1); 
                    
else 
                        
break
                } 
            
if(tt.len()<=0)
            {    
                window.event.returnValue
=false;
                
            }
            
else
            {
                tempValue
=tt; 
                window.clipboardData.setData(
"Text", tempValue); 
                window.event.returnValue 
= true
            }
        } 
    



function PressLength()
{
    
    
if(event.srcElement.type=="text" || event.srcElement.type=="textarea" )
    {
        
if(event.srcElement.length!=null)
            setMaxLength(event.srcElement,event.srcElement.length);
        
    }
}

function LimitLength()
{

    
if(event.srcElement.type=="text" || event.srcElement.type=="textarea" )
    {
        
if(event.srcElement.length!=null)
            limitPaste(event.srcElement,event.srcElement.length);
    }
}
document.documentElement.attachEvent('onkeyup', PressLength); 
document.documentElement.attachEvent('onpaste', LimitLength);

//--> 
        </script>


2)在需要控制的控件上添加length="n"(n为要控制的字数)即可,如:
 
<INPUT  type="text" length="3">
<TEXTAREA length="20"  rows="2" cols="20"></TEXTAREA>
<asp:TextBox id="TextBox1"  runat="server" length="7"></asp:TextBox>
<asp:TextBox id="TextBox2" runat="server" TextMode="MultiLine" length="10"></asp:TextBox>
上面是HTML控件与Web控件的例子,只要加一个length就可以了。

 好了,大家可以体验一下了哦:http://files.cnblogs.com/tintown/stringLenth3.rar (已经修改复了“没有length无法输入的问题”)

个人建议:1)可以把这个脚本块放在js文件中,进行引用即可
                2)可以把脚本放在BasePage中,这样每个页面都可以使用了
               3)可以使用这些脚本块,开发专门的服务器端控件,我没有时间开发,如果有朋友可以开发了发布一下哦!
posted @ 2006-10-30 15:56 javaca88 阅读(467) 评论(0) 编辑

2006年10月27日 #

摘要: 子窗口和父窗口交互的内容,基本上无非就是把子窗口的信息传递给父窗口,并且关闭自己等等,或者是父窗口把自己的信息传递给子窗口等等。1。父窗口传递信息给子窗口看代码实例:<script language=javascript>function outPut(){//获取父窗口的文本信息赋值给textvar text = document.abc.text.value;//打开子窗口,并且把...阅读全文
posted @ 2006-10-27 08:36 javaca88 阅读(1793) 评论(0) 编辑

2006年10月26日 #

摘要: using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.We...阅读全文
posted @ 2006-10-26 16:38 javaca88 阅读(508) 评论(0) 编辑

摘要: ?private void InitTree2(TreeNodeCollection Nds,string parentId,int flag){DataView dv=new DataView();TreeNode tmpNd;dv.Table=dsTree.Tables[0];dv.RowFilter="ParentId='" + parentId + "'" ;foreach(DataRow...阅读全文
posted @ 2006-10-26 14:10 javaca88 阅读(750) 评论(0) 编辑

2006年10月25日 #

摘要: protected void DetailsView1_ItemCommand(object sender, DetailsViewCommandEventArgs e) { if (e.CommandName == "Edit") { DetailsView1.ChangeMode(DetailsViewMode.Edit); CommandField dd = new CommandField...阅读全文
posted @ 2006-10-25 14:46 javaca88 阅读(372) 评论(0) 编辑