彤舟's profile同舟共济PhotosBlogLists Tools Help

Blog


    September 05

    吃饭问题

    小宝贝今天已经快六个月了,身高还算可以,但是体重一直不太满意,而且最近总是有点厌食,不想吃饭。你说也奇怪了,怎么小的孩子能懂什么,还挑食吗?今天我出了一个馊主意,让她妈妈用嘴喂,呵呵,你猜怎样?
    她妈妈不愿意,我晕。为了孩子吃饭,这样的尝试也不试一下?
    刚五月:
    晚上突然叫妈妈
    会趴会翻身

    特别喜欢玩 工兵挖地雷
    March 29

    transact-sql数组

     

    前两周做一个统计任务, 需要在sql server里用到数组这样的数据结构.而transact-sql没有内建数组,听说可以用字符串配合临时表来实现,自己试了,解决方法如下 :

    create proc [dbo].[CreateArray]
    @string varchar(1024)
    as
    create table #array (id int identity,value varchar(32))
    set @string='insert #array select '''+replace(@string,',','''as str union all select ''')+''''
    exec(@string)
    select * from #array

    go

    执行如下 :

    exec CreateArray 'CChess,Dig,GoBang,LandLord,Majiang'

    SqlServer存储过程/函数加/解密

    存储过程、存储函数的加密:WITH ENCRYPTION
    <!--[if !supportLineBreakNewLine]-->
    <!--[endif]-->

    CREATE procedure dbo.sp_XML_main

    @table_name nvarchar(260)='',

    @dirname nvarchar(20)=''

    WITH ENCRYPTION

    as

    begin

    ....................

    end

    go

    存储过程、存储函数的解密

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_decrypt]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

    drop procedure [dbo].[sp_decrypt]

    GO

    /*--破解函数,过程,触发器,视图.仅限于SQLSERVER2000

    --作者:J9988-- All rights reserved*/

    /*--调用示例

    --解密指定存储过程

    exec sp_decrypt 'AppSP_test'

    --对所有的存储过程解密

    declare tb cursor for

    select name from sysobjects where xtype='P' and status>0 and name<>'sp_decrypt'


    declare @name sysname

    open tb

    fetch next from tb into @name

    while @@fetch_status=0

    begin

    print '/*-------存储过程 ['+@name+'] -----------*/'

    exec sp_decrypt @name

    fetch next from tb into @name

    end

    close tb

    deallocate tb

    --*/


    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SP_DECRYPT]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

    drop procedure [dbo].[SP_DECRYPT]

    GO

    CREATE PROCEDURE sp_decrypt(@objectName varchar(50))

    AS

    begin

    set nocount on

    --破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器

    --修正上一版视图触发器不能正确解密错误

    --发现有错,请E_MAIL:CSDNj9988@tom.com
    begin tran

    declare @objectname1 varchar(100),@orgvarbin varbinary(8000)

    declare @sql1 nvarchar(4000),@sql2 varchar(8000),@sql3 nvarchar(4000),@sql4 nvarchar(4000)

    DECLARE @OrigSpText1 nvarchar(4000), @OrigSpText2 nvarchar(4000) , @OrigSpText3 nvarchar(4000), @resultsp nvarchar(4000)

    declare @i int,@status int,@type varchar(10),@parentid int

    declare @colid int,@n int,@q int,@j int,@k int,@encrypted int,@number int

    select @type=xtype,@parentid=parent_obj from sysobjects where id=object_id(@ObjectName)


    create table #temp(number int,colid int,ctext varbinary(8000),encrypted int,status int)

    insert #temp SELECT number,colid,ctext,encrypted,status FROM syscomments WHERE id = object_id(@objectName)

    select @number=max(number) from #temp

    set @k=0


    while @k<=@number

    begin

    if exists(select 1 from syscomments where id=object_id(@objectname) and number=@k)

    begin

    if @type='P'

    set @sql1=(case when @number>1 then 'ALTER PROCEDURE '+ @objectName +';'+rtrim(@k)+' WITH ENCRYPTION AS '

    else 'ALTER PROCEDURE '+ @objectName+' WITH ENCRYPTION AS '

    end)


    if @type='TR'

    begin

    declare @parent_obj varchar(255),@tr_parent_xtype varchar(10)

    select @parent_obj=parent_obj from sysobjects where id=object_id(@objectName)

    select @tr_parent_xtype=xtype from sysobjects where id=@parent_obj

    if @tr_parent_xtype='V'

    begin

    set @sql1='ALTER TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTERD OF INSERT AS PRINT 1 '

    end

    else

    begin

    set @sql1='ALTER TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR INSERT AS PRINT 1 '

    end

    end

    if @type='FN' or @type='TF' or @type='IF'

    set @sql1=(case @type when 'TF' then

    'ALTER FUNCTION '+ @objectName+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end '

    when 'FN' then

    'ALTER FUNCTION '+ @objectName+'(@a char(1)) returns char(1) with encryption as begin return @a end'

    when 'IF' then

    'ALTER FUNCTION '+ @objectName+'(@a char(1)) returns table with encryption as return select @a as a'

    end)


    if @type='V'

    set @sql1='ALTER VIEW '+@objectname+' WITH ENCRYPTION AS SELECT 1 as f'


    set @q=len(@sql1)

    set @sql1=@sql1+REPLICATE('-',4000-@q)

    select @sql2=REPLICATE('-',8000)

    set @sql3='exec(@sql1'

    select @colid=max(colid) from #temp where number=@k

    set @n=1

    while @n<=CEILING(1.0*(@colid-1)/2) and len(@sQL3)<=3996

    begin

    set @sql3=@sql3+'+@'

    set @n=@n+1

    end

    set @sql3=@sql3+')'

    exec sp_executesql @sql3,N'@sql1 nvarchar(4000),@ varchar(8000)',@sql1=@sql1,@=@sql2

    end

    set @k=@k+1

    end


    set @k=0

    while @k<=@number

    begin

     

    if exists(select 1 from syscomments where id=object_id(@objectname) and number=@k)

    begin

    select @colid=max(colid) from #temp where number=@k

    set @n=1


    while @n<=@colid

    begin

    select @OrigSpText1=ctext,@encrypted=encrypted,@status=status FROM #temp WHERE colid=@n and number=@k


    SET @OrigSpText3=(SELECT ctext FROM syscomments WHERE id=object_id(@objectName) and colid=@n and number=@k)

    if @n=1

    begin

    if @type='P'

    SET @OrigSpText2=(case when @number>1 then 'CREATE PROCEDURE '+ @objectName +';'+rtrim(@k)+' WITH ENCRYPTION AS '

    else 'CREATE PROCEDURE '+ @objectName +' WITH ENCRYPTION AS '

    end)


    if @type='FN' or @type='TF' or @type='IF'

    SET @OrigSpText2=(case @type when 'TF' then

    'CREATE FUNCTION '+ @objectName+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end '

    when 'FN' then

    'CREATE FUNCTION '+ @objectName+'(@a char(1)) returns char(1) with encryption as begin return @a end'

    when 'IF' then

    'CREATE FUNCTION '+ @objectName+'(@a char(1)) returns table with encryption as return select @a as a'

    end)


    if @type='TR'

    begin


    if @tr_parent_xtype='V'

    begin

    set @OrigSpText2='CREATE TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION INSTEAD OF INSERT AS PRINT 1 '

    end

    else

    begin

    set @OrigSpText2='CREATE TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR INSERT AS PRINT 1 '

    end


    end


    if @type='V'

    set @OrigSpText2='CREATE VIEW '+@objectname+' WITH ENCRYPTION AS SELECT 1 as f'


    set @q=4000-len(@OrigSpText2)

    set @OrigSpText2=@OrigSpText2+REPLICATE('-',@q)

    end

    else

    begin

    SET @OrigSpText2=REPLICATE('-', 4000)

    end

    SET @i=1

    SET @resultsp = replicate(N'A', (datalength(@OrigSpText1) / 2))

    WHILE @i<=datalength(@OrigSpText1)/2

    BEGIN

    SET @resultsp = stuff(@resultsp, @i, 1, NCHAR(UNICODE(substring(@OrigSpText1, @i, 1)) ^

    (UNICODE(substring(@OrigSpText2, @i, 1)) ^

    UNICODE(substring(@OrigSpText3, @i, 1)))))

    SET @i=@i+1

    END

    set @orgvarbin=cast(@OrigSpText1 as varbinary(8000))

    set @resultsp=(case when @encrypted=1

    then @resultsp

    else convert(nvarchar(4000),case when @status&2=2 then uncompress(@orgvarbin) else @orgvarbin end)

    end)

    print @resultsp

    set @n=@n+1

    end

    end

    set @k=@k+1

    end

    drop table #temp

    rollback tran

    end

    SQL Server 2005中的T-SQL

    简介

      将于12月份发布的SQL Server 2005目前正处于准备阶段,最近,我研究了一份对Edgewood Solutions客户进行的调查,调查中询问他们认为什么是微软的新发布的数据库中最有价值的特性。一个不分职位、行业、公司规模和从业时间的常见回答就是加强的T-SQL。这些发现可以作为以下有关Transact-SQL编程扩展的贴士的基础。

      错误处理:TRY 和CATCH

      将行转换为列:PIVOT 和UNPIVOT

      XML改进

      贴士1:用TRY和CATCH进行错误处理

      自带的错误处理是T-SQL经常被用来与其他语言进行比较的缺点。SQL Server 2005引入了TRY和CATCH,与其他许多数据库一样。通过使用这种许多开发人员和数据库管理员都熟悉的方式来进行错误处理将大大提高对SQL Server的信心。

      BEGIN TRY

      SELECT 1/0;

      END TRY

      BEGIN CATCH

      SELECT

      ERROR_NUMBER() AS ErrorNumber,

      ERROR_SEVERITY() AS ErrorSeverity,

      ERROR_STATE() AS ErrorState,

      ERROR_PROCEDURE() AS ErrorProcedure,

      ERROR_LINE() AS ErrorLine,

      ERROR_MESSAGE() AS ErrorMessage;

      END CATCH;

      通过PIVOT 和UNPIVOT将行转换为列

      一位在保健公司上班的开发人员每当她的报告用户想要将行转换为列的时候,抱怨不止。这并不是一次良好的会话。她不得不编写一些需要执行好多个CPU周期的复杂的代码来给用户提供他们想要的数据,对这些数据的要求是在正式报告需求基础之上产生的。这些痛苦的会话在SQL Server 2005引入PIVOT和UNPIVOT命令之前是常见的事。这两个命令可以在几乎不需要修改代码的情况下快速地将行转换为列或者由列转换为行。

      USE AdventureWorks;

      GO

      SELECT VendorID, [164] AS Emp1, [198] AS Emp2, [223] AS Emp3, [231] AS Emp4, [233] AS Emp5

      FROM

      (SELECT PurchaseOrderID, EmployeeID, VendorID

      FROM Purchasing.PurchaseOrderHeader) p

      PIVOT

      (

      COUNT (PurchaseOrderID)

      FOR EmployeeID IN

      ( [164], [198], [223], [231], [233] )

      ) AS pvt

      ORDER BY VendorID

      资源: 使用 PIVOT 和UNPIVOT, SQL Server 2005 在线书籍:ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/24ba54fc-98f7-4d35-8881-b5158aac1d66.htm

      改进的XML

      XML普遍应用在通过许多异构的环境进行数据传输和在许多微软的应用程序之间传输数据上;SQL Server 2005 XML特性改善了创建、存储、传输和查询XML数据的内在能力。现在可以在SQL Server中自然地完成如下:

      创建一个可以被表的某列引用的XML计划

      CREATE XML SCHEMA COLLECTION [ . ]sql_identifier AS Expression

      为一个表创建一个本地的数据类型,这个表在创建的时候具有指向XML计划集合的指针,同时这个表放在与基本表不同的数据页上,就像SQL Server 2000中的BLOB。

      CREATE TABLE Orders

      (OrderID int PRIMARY KEY NOT NULL,

      OrderDetailsID int NOT NULL,

      OrderDate datetime NOT NULL,

      …

      XMLOrder xml NOT NULL)

      为存储过程或者特别的事务创建一个变量作为XML数据类型

      DECLARE @OrdersSchema xml

      …

      CREATE XML SCHEMA COLLECTION OrdersSchema AS @OrdersSchema

      通过创建主要和第二索引来提高对XML数据访问的速度

      CREATE PRIMARY XML INDEX PXML_Orders_OrderID

      ON OrdersSchema.Orders (OrderID);

      GO

      CREATE XML INDEX SXML_Order_OrderDetailsID

      ON OrdersSchema.Orders (OrderDetailsID)

      USING XML INDEX PXML_Orders_OrderID FOR PATH ;

      GO

      通过一个简单的SELECT语句来查询XML数据,将XML作为结果集的一部分,与表中余下的字段一起返回。

      SELECT *

      FROM Orders

      WHERE OrderID = 123

    如何在SQLSERVER中快速有条件删除海量数据

    最近有个朋友问我,他说他在SQLSERVER删除几百万到几千万数据是显的很慢,帮他分析了一下,提了一些以下意见,或许对很多人有用,再者也好长没写过BLOG了,一起探讨一下

    如果你的硬盘空间小,并且不想设置数据库的日志为最小(因为希望其他正常的日志希望仍然记录),而且对速度要求比较高,并清除所有的数据建议你用turncate table1,因为truncate 是DDL操作,不产生rollback,不写日志速度快一些,然后如果有自增的话,恢复到1开始,而delete会产生rollback,如果删除大数据量的表速度会很慢,同时会占用很多的rollback segments,同时还要记录下G级别的日志 ;当然如果有条件删除比如where time<'2006-3-10' 怎么办,能不能不记录日志用delete,回答是不行的,SQL Server 引擎在设计上就会对 Delete 操作进行日志记录。至今没有办法强制制定某一些语句不记录到日志中,如果在执行 Delete Table1 where Time < '2006-3-10' 由于涉及的记录比较多,所以日志记录也相应很大(3-4G),如果可行,我建议用以下方式:

    选出您所需要保留的记录到新的表。如果您使用 Full Recovery Mode
    根据SELECT INTO的记录数,日志可能会比较大
    Select * into Table2 From Table1 Where Time > = '2006-03-10' 

    然后直接Truncate Table1。无论何种恢复模式都不会进行日志记录
    Truncate table Table1

    最后对Table2进行改名为Table1
    EC sp_rename 'Table2', 'Table1'

    整理了一些t-sql技巧-3

    八、 树型的实现
    --参考

    --树形数据查询示例
    --
    作者: 邹建

    --示例数据
    create table [tb]([id] int identity(1,1),[pid] int,name varchar(20))
    insert [tb] select 0,'中国'
    union  all  select 0,'美国'
    union  all  select 0,'加拿大'
    union  all  select 1,'北京'
    union  all  select 1,'上海'
    union  all  select 1,'江苏'
    union  all  select 6,'苏州'
    union  all  select 7,'常熟'
    union  all  select 6,'南京'
    union  all  select 6,'无锡'
    union  all  select 2,'纽约'
    union  all  select 2,'旧金山'
    go

    --查询指定id的所有子
    create function f_cid(
    @id int
    )
    returns @re table([id] int,[level] int)
    as
    begin
     
    declare @l int
     
    set @l=0
     
    insert @re select @id,@l
     
    while @@rowcount>0
     
    begin
      
    set @l=@l+1
      
    insert @re select a.[id],@l
      
    from [tb] a,@re b
      
    where a.[pid]=b.[id] and b.[level]=@l-1
     
    end
    /**//**//**//*--如果只显示最明细的子(下面没有子),则加上这个删除
     delete a from @re a
     where exists(
      select 1 from [tb] where [pid]=a.[id])
    --
    */

     
    return
    end
    go

    --调用(查询所有的子)
    select a.*,层次=b.[level] from [tb] a,f_cid(2)b where a.[id]=b.[id]
    go

    --删除测试
    drop table [tb]
    drop function f_cid
    go

     

    九、 排序问题

    CREATE TABLE [t] (
     
    [id] [int] IDENTITY (11NOT NULL ,
     
    [GUID] [uniqueidentifier] NULL 
    ON [PRIMARY]
    GO


    下面这句执行5次

    insert t values (newid())


    查看执行结果

    select * from t


    1、 第一种

    select * from t
     
    order by case id when 4 then 1
                      
    when 5 then 2
                      
    when 1 then 3
                      
    when 2 then 4
                      
    when 3 then 5 end


    2、 第二种

    select * from t order by (id+2)%6


    3、 第三种

    select * from t order by charindex(cast(id as varchar),'45123')


    4、 第四种

    select * from t
    WHERE id between 0 and 5
    order by charindex(cast(id as varchar),'45123')


    5、 第五种

    select * from t order by case when id >3 then id-5 else id end


    6、 第六种

    select * from t order by id / 4 desc,id asc

     

    十、 一条语句删除一批记录
    首先id列是int标识类类型,然后删除ID值为5,6,8,9,10,11的列,这里的cast函数不能用convert函数代替,而且转换的类型必须是varchar,而不能是char,否则就会执行出你不希望的结果,这里的"5,6,8,9,10,11"可以是你在页面上获取的一个chkboxlist构建成的值,然后用下面的一句就全部删
    除了,比循环用多条语句高效吧应该。

    delete from [fujian] where charindex(','+cast([id] as varchar)+',',','+'5,6,8,9,10,11,'+',')>0


    还有一种就是

    delete from table1 where id in(1,2,3,4 )


    十一、获取子表内的一列数据的组合字符串
    下面这个函数获取05年已经注册了的某个所的律师,唯一一个参数就是事务所的名称,然后返回zhuce字段里包含05字样的所有律师。

    CREATE   FUNCTION fn_Get05LvshiNameBySuo  (@p_suo Nvarchar(50))
    RETURNS Nvarchar(2000)
    AS
    BEGIN  
     
    DECLARE @LvshiNames varchar(2000), @name varchar(50)
     
    select @LvshiNames=''
     
    DECLARE lvshi_cursor CURSOR FOR

    数据库里有1,2,3,4,5 共5条记录,要用一条sql语句让其排序,使它排列成4,5,1,2,3,怎么写?

    整理了一些t-sql技巧-2

    四、 一条语句执行跨越若干个数据库
    我要在一条语句里操作不同的服务器上的不同的数据库里的不同的表,怎么办呢?
    第一种方法:

    select * from OPENDATASOURCE('SQLOLEDB','Data Source=远程ip;User ID=sa;Password=密码').库名.dbo.表名

    第二种方法:
    先使用联结服务器:

    EXEC sp_addlinkedserver '别名','','MSDASQL',NULL,NULL,'DRIVER={SQL Server};SERVER=远程名;UID=用户;PWD=密码;'
    exec sp_addlinkedsrvlogin  @rmtsrvname='别名',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword='密码'
    GO

    然后你就可以如下:

    select * from 别名.库名.dbo.表名
    insert 库名.dbo.表名 select * from 别名.库名.dbo.表名
    select * into 库名.dbo.新表名 from 别名.库名.dbo.表名
    go

    五、 怎样获取一个表中所有的字段信息
    蛙蛙推荐:怎样获取一个表中所有字段的信息
    先创建一个视图

    Create view fielddesc    
    as
    select o.name as table_name,c.name as field_name,t.name as type,c.length as 

    length,c.isnullable 
    as isnullable,convert(varchar(30),p.value) as desp 
    from syscolumns c  
    join systypes t on c.xtype = t.xusertype
    join sysobjects o on o.id=c.id 
    left join    sysproperties p on p.smallid=c.colid and p.id=o.id    
    where o.xtype='U'

    查询时:

    Select * from fielddesc where table_name = '你的表名'

     

    还有个更强的语句,是邹建写的,也写出来吧

    SELECT 
     (
    case when a.colorder=1 then d.name else '' end) N'表名',
     a.colorder N
    '字段序号',
     a.name N
    '字段名',
     (
    case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then ''else '' end) N'标识',
     (
    case when (SELECT count(*)
     
    FROM sysobjects
     
    WHERE (name in
               (
    SELECT name
              
    FROM sysindexes
              
    WHERE (id = a.id) AND (indid in
                        (
    SELECT indid
                       
    FROM sysindexkeys
                       
    WHERE (id = a.id) AND (colid in
                                 (
    SELECT colid
                                
    FROM syscolumns
                                
    WHERE (id = a.id) AND (name = a.name))))))) AND
            (xtype 
    = 'PK'))>0 then '' else '' end) N'主键',
     b.name N
    '类型',
     a.length N
    '占用字节数',
     
    COLUMNPROPERTY(a.id,a.name,'PRECISION'as N'长度',
     
    isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0as N'小数位数',
     (
    case when a.isnullable=1 then ''else '' end) N'允许空',
     
    isnull(e.text,'') N'默认值',
     
    isnull(g.[value],''AS N'字段说明'
    --into ##tx

    FROM  syscolumns  a left join systypes b 
    on  a.xtype=b.xusertype
    inner join sysobjects d 
    on a.id=d.id  and  d.xtype='U' and  d.name<>'dtproperties'
    left join syscomments e
    on a.cdefault=e.id
    left join sysproperties g
    on a.id=g.id AND a.colid = g.smallid  
    order by object_name(a.id),a.colorder

    六、 时间格式转换问题
    因为新开发的软件需要用一些旧软件生成的一些数据,在时间格式上不统一,只能手工转换,研究了一下午写了三条语句,以前没怎么用过convert函数和case语句,还有"+"操作符在不同上下文环境也会起到不同的作用,把我搞晕了要,不过现在看来是差不多弄好了。

    1、把所有"70.07.06"这样的值变成"1970-07-06"

    UPDATE lvshi
    SET shengri = '19' + REPLACE(shengri, '.''-')
    WHERE (zhiyezheng = '139770070153')

     

    2、在"1970-07-06"里提取"70","07","06"

    SELECT SUBSTRING(shengri, 32AS yearSUBSTRING(shengri, 62AS month
          
    SUBSTRING(shengri, 92AS day
    FROM lvshi
    WHERE (zhiyezheng = '139770070153')

    3、把一个时间类型字段转换成"1970-07-06"

    UPDATE lvshi
    SET shenling = CONVERT(varchar(4), YEAR(shenling)) 
          
    + '-' + CASE WHEN LEN(MONTH(shenling)) = 1 THEN '0' + CONVERT(varchar(2), 
          
    month(shenling)) ELSE CONVERT(varchar(2), month(shenling)) 
          
    END + '-' + CASE WHEN LEN(day(shenling)) = 1 THEN '0' + CONVERT(char(2), 
          
    day(shenling)) ELSE CONVERT(varchar(2), day(shenling)) END
    WHERE (zhiyezheng = '139770070153')

    七、 分区视图
    分区视图是提高查询性能的一个很好的办法

    --看下面的示例

    --示例表
    create table tempdb.dbo.t_10(
    id 
    int primary key check(id between 1 and 10),name varchar(10))

    create table pubs.dbo.t_20(
    id 
    int primary key check(id between 11 and 20),name varchar(10))

    create table northwind.dbo.t_30(
    id 
    int primary key check(id between 21 and 30),name varchar(10))
    go

    --分区视图
    create view v_t
    as
    select * from tempdb.dbo.t_10
    union all
    select * from pubs.dbo.t_20
    union all
    select * from northwind.dbo.t_30
    go

    --插入数据
    insert v_t select 1 ,'aa'
    union  all select 2 ,'bb'
    union  all select 11,'cc'
    union  all select 12,'dd'
    union  all select 21,'ee'
    union  all select 22,'ff'

    --更新数据
    update v_t set name=name+'_更新' where right(id,1)=1

    --删除测试
    delete from v_t where right(id,1)=2

    --显示结果
    select * from v_t
    go

    --删除测试
    drop table northwind.dbo.t_30,pubs.dbo.t_20,tempdb.dbo.t_10
    drop view v_t

    /**//*--测试结果

    id          name       
    ----------- ---------- 
    1           aa_更新
    11          cc_更新
    21          ee_更新

    (所影响的行数为 3 行)
    ==
    */


    整理了一些t-sql技巧-1

     

    一、 只复制一个表结构,不复制数据

     

    select top 0 * into [t1] from [t2]


    二、 获取数据库中某个对象的创建脚本

    1、 先用下面的脚本创建一个函数

    if exists(select 1 from sysobjects where id=object_id('fgetscript'and objectproperty(id,'IsInlineFunction')=0)
     
    drop function fgetscript
    go

    create function fgetscript(
     
    @servername varchar(50)     --服务器名
     ,@userid varchar(50)='sa'    --用户名,如果为nt验证方式,则为空
     ,@password varchar(50)=''    --密码
     ,@databasename varchar(50)    --数据库名称
     ,@objectname varchar(250)    --对象名

    returns varchar(8000)
    as
    begin
     
    declare @re varchar(8000)        --返回脚本
     declare @srvid int,@dbsid int       --定义服务器、数据库集id
     declare @dbid int,@tbid int        --数据库、表id
     declare @err int,@src varchar(255), @desc varchar(255--错误处理变量

    --创建sqldmo对象
     exec @err=sp_oacreate 'sqldmo.sqlserver',@srvid output
     
    if @err<>0 goto lberr

    --连接服务器
     if isnull(@userid,'')='' --如果是 Nt验证方式
     begin
      
    exec @err=sp_oasetproperty @srvid,'loginsecure',1
      
    if @err<>0 goto lberr

      
    exec @err=sp_oamethod @srvid,'connect',null,@servername
     
    end
     
    else
      
    exec @err=sp_oamethod @srvid,'connect',null,@servername,@userid,@password

     
    if @err<>0 goto lberr

    --获取数据库集
     exec @err=sp_oagetproperty @srvid,'databases',@dbsid output
     
    if @err<>0 goto lberr

    --获取要取得脚本的数据库id
     exec @err=sp_oamethod @dbsid,'item',@dbid output,@databasename
     
    if @err<>0 goto lberr

    --获取要取得脚本的对象id
     exec @err=sp_oamethod @dbid,'getobjectbyname',@tbid output,@objectname
     
    if @err<>0 goto lberr

    --取得脚本
     exec @err=sp_oamethod @tbid,'script',@re output
     
    if @err<>0 goto lberr

     
    --print @re
     return(@re)

    lberr:
     
    exec sp_oageterrorinfo NULL@src out, @desc out 
     
    declare @errb varbinary(4)
     
    set @errb=cast(@err as varbinary(4))
     
    exec master..xp_varbintohexstr @errb,@re out
     
    set @re='错误号: '+@re
       
    +char(13)+'错误源: '+@src
       
    +char(13)+'错误描述: '+@desc
     
    return(@re)
    end
    go

    2、 用法如下
    用法如下,

    print dbo.fgetscript('服务器名','用户名','密码','数据库名','表名或其它对象名')

    3、 如果要获取库里所有对象的脚本,如如下方式

    declare @name varchar(250)
    declare #aa cursor for
     
    select name from sysobjects where xtype not in('S','PK','D','X','L')
    open #aa
    fetch next from #aa into @name
    while @@fetch_status=0
    begin
     
    print dbo.fgetscript('onlytiancai','sa','sa','database',@name)
     
    fetch next from #aa into @name
    end
    close #aa
    deallocate #aa

    4、 声明,此函数是csdn邹建邹老大提供的
    三、 分隔字符串
    如果有一个用逗号分割开的字符串,比如说"a,b,c,d,1,2,3,4",如何用t-sql获取这个字符串有几个元素,获取第几个元素的值是多少呢?因为t-sql里没有split函数,也没有数组的概念,所以只能自己写几个函数了。
    1、 获取元素个数的函数

    create function getstrarrlength (@str varchar(8000))
    returns int
    as
    begin
      
    declare @int_return int
      
    declare @start int
      
    declare @next int
      
    declare @location int
      
    select @str =','+ @str +','
      
    select @str=replace(@str,',,',',')
      
    select @start =1
      
    select @next =1 
      
    select @location = charindex(',',@str,@start)
      
    while (@location <>0)
      
    begin
        
    select @start = @location +1
        
    select @location = charindex(',',@str,@start)
        
    select @next =@next +1
      
    end
     
    select @int_return = @next-2
     
    return @int_return
    end

    2、 获取指定索引的值的函数

    create function getstrofindex (@str varchar(8000),@index int =0)
    returns varchar(8000)
    as
    begin
      
    declare @str_return varchar(8000)
      
    declare @start int
      
    declare @next int
      
    declare @location int
      
    select @start =1
      
    select @next =1 --如果习惯从0开始则select @next =0
      select @location = charindex(',',@str,@start)
      
    while (@location <>0 and @index > @next )
      
    begin
        
    select @start = @location +1
        
    select @location = charindex(',',@str,@start)
        
    select @next =@next +1
      
    end
      
    if @location =0 select @location =len(@str)+1 --如果是因为没有逗号退出,则认为逗号在字符串后
      select @str_return = substring(@str,@start,@location -@start--@start肯定是逗号之后的位置或者就是初始值1
      if (@index <> @next ) select @str_return = '' --如果二者不相等,则是因为逗号太少,或者@index小于@next的初始值1。
      return @str_return
    end

    3、 测试

    SELECT [dbo].[getstrarrlength]('1,2,3,4,a,b,c,d')
    SELECT [dbo].[getstrofindex]('1,2,3,4,a,b,c,d',5)

     

    Transact_SQL小手册

     

    *******************Transact_SQL********************

    --语 句                                功 能
    --数据操作
    SELECT      --从数据库表中检索数据行和列
    INSERT      --向数据库表添加新数据行
    DELETE      --从数据库表中删除数据行
    UPDATE      --更新数据库表中的数据
    --数据定义
    CREATE TABLE    --创建一个数据库表
    DROP TABLE     --从数据库中删除表
    ALTER TABLE     --修改数据库表结构
    CREATE VIEW     --创建一个视图
    DROP VIEW     --从数据库中删除视图
    CREATE INDEX    --为数据库表创建一个索引
    DROP INDEX     --从数据库中删除索引
    CREATE PROCEDURE   --创建一个存储过程
    DROP PROCEDURE    --从数据库中删除存储过程
    CREATE TRIGGER    --创建一个触发器
    DROP TRIGGER    --从数据库中删除触发器
    CREATE SCHEMA    --向数据库添加一个新模式
    DROP SCHEMA     --从数据库中删除一个模式
    CREATE DOMAIN    --创建一个数据值域
    ALTER DOMAIN    --改变域定义
    DROP DOMAIN     --从数据库中删除一个域
    --数据控制
    GRANT      --授予用户访问权限
    DENY      --拒绝用户访问
    REVOKE      --解除用户访问权限
    --事务控制
    COMMIT      --结束当前事务
    ROLLBACK     --中止当前事务
    SET TRANSACTION    --定义当前事务数据访问特征
    --程序化SQL
    DECLARE      --为查询设定游标
    EXPLAN      --为查询描述数据访问计划
    OPEN      --检索查询结果打开一个游标
    FETCH      --检索一行查询结果
    CLOSE      --关闭游标
    PREPARE      --为动态执行准备SQL 语句
    EXECUTE      --动态地执行SQL 语句
    DESCRIBE     --描述准备好的查询

    ---局部变量
    declare @id char(10)
    --set @id = '10010001'
    select @id = '10010001'

    ---全局变量
    ---必须以@@开头

    --IF ELSE
    declare @x int @y int @z int
    select @x = 1 @y = 2 @z=3
    if @x > @y
     print 'x > y' --打印字符串'x > y'
    else if @y > @z
     print 'y > z'
    else print 'z > y'

    --CASE
    use pangu
    update employee
    set e_wage =
     case
      when job_level = ’1’ then e_wage*1.08
      when job_level = ’2’ then e_wage*1.07
      when job_level = ’3’ then e_wage*1.06
      else e_wage*1.05
     end

    --WHILE CONTINUE BREAK
    declare @x int @y int @c int
    select @x = 1 @y=1
    while @x < 3
     begin
      print @x --打印变量x 的值
      while @y < 3
       begin
        select @c = 100*@x + @y
        print @c --打印变量c 的值
        select @y = @y + 1
       end
      select @x = @x + 1
      select @y = 1
     end

    --WAITFOR
    --例 等待1 小时2 分零3 秒后才执行SELECT 语句
    waitfor delay ’01:02:03’
    select * from employee
    --例 等到晚上11 点零8 分后才执行SELECT 语句
    waitfor time ’23:08:00’
    select * from employee

     

    ***SELECT***

       select *(列名) from table_name(表名) where column_name operator value
       ex:(宿主)
      select * from stock_information where stockid   = str(nid)
         stockname = 'str_name'
         stockname like '% find this %'
         stockname like '[a-zA-Z]%' --------- ([]指定值的范围)
         stockname like '[^F-M]%'   --------- (^排除指定范围)
         --------- 只能在使用like关键字的where子句中使用通配符)
         or stockpath = 'stock_path'
         or stocknumber < 1000
         and stockindex = 24
         not stocksex = 'man'
         stocknumber between 20 and 100
         stocknumber in(10,20,30)
         order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
         order by 1,2 --------- by列号
         stockname = (select stockname from stock_information  where stockid  = 4)
         --------- 子查询
         --------- 除非能确保内层select只返回一个行的值,
         --------- 否则应在外层where子句中用一个in限定符
      select distinct column_name form table_name --------- distinct指定检索独有的列值,不重复
      select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
      select stockname , "stocknumber" = count(*) from table_name group by stockname
                                          --------- group by 将表按行分组,指定列中有相同的值
              having count(*) = 2  ---------  having选定指定的组
           
      select *
      from table1, table2                 
      where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示
         table1.id =* table2.id -------- 右外部连接

      select stockname from table1
      union [all]  -----  union合并查询结果集,all-保留重复行
      select stockname from table2

    ***insert***

      insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")
                  value (select Stockname , Stocknumber from Stock_table2)---value为select语句

    ***update***

      update table_name set Stockname = "xxx" [where Stockid = 3]
             Stockname = default
             Stockname = null
             Stocknumber = Stockname + 4

    ***delete***

      delete from table_name where Stockid = 3
      truncate table_name ----------- 删除表中所有行,仍保持表的完整性
      drop table table_name --------------- 完全删除表

    ***alter table*** --- 修改数据库表结构

      alter table database.owner.table_name add column_name char(2) null .....
      sp_help table_name ---- 显示表已有特征
      create table table_name (name char(20), age smallint, lname varchar(30))
      insert into table_name select ......... ----- 实现删除列的方法(创建新表)
      alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束
       
    ***function(/*常用函数*/)***

    ----统计函数----
    AVG    --求平均值
    COUNT   --统计数目
    MAX    --求最大值
    MIN    --求最小值
    SUM    --求和

    --AVG
    use pangu
    select avg(e_wage) as dept_avgWage
    from employee
    group by dept_id

    --MAX
    --求工资最高的员工姓名
    use pangu
    select e_name
    from employee
    where e_wage =
     (select max(e_wage)
      from employee)

    --STDEV()
    --STDEV()函数返回表达式中所有数据的标准差

    --STDEVP()
    --STDEVP()函数返回总体标准差

    --VAR()
    --VAR()函数返回表达式中所有值的统计变异数

    --VARP()
    --VARP()函数返回总体变异数

    ----算术函数----

    /***三角函数***/
    SIN(float_expression) --返回以弧度表示的角的正弦
    COS(float_expression) --返回以弧度表示的角的余弦
    TAN(float_expression) --返回以弧度表示的角的正切
    COT(float_expression) --返回以弧度表示的角的余切
    /***反三角函数***/
    ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
    ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
    ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
    ATAN2(float_expression1,float_expression2)
            --返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
    DEGREES(numeric_expression)
                           --把弧度转换为角度返回与表达式相同的数据类型可为
            --INTEGER/MONEY/REAL/FLOAT 类型
    RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为
            --INTEGER/MONEY/REAL/FLOAT 类型
    EXP(float_expression)  --返回表达式的指数值
    LOG(float_expression)  --返回表达式的自然对数值
    LOG10(float_expression)--返回表达式的以10 为底的对数值
    SQRT(float_expression) --返回表达式的平方根
    /***取近似值函数***/
    CEILING(numeric_expression)  --返回>=表达式的最小整数返回的数据类型与表达式相同可为
            --INTEGER/MONEY/REAL/FLOAT 类型
    FLOOR(numeric_expression)    --返回<=表达式的最小整数返回的数据类型与表达式相同可为
            --INTEGER/MONEY/REAL/FLOAT 类型
    ROUND(numeric_expression)    --返回以integer_expression 为精度的四舍五入值返回的数据
            --类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
    ABS(numeric_expression)      --返回表达式的绝对值返回的数据类型与表达式相同可为
            --INTEGER/MONEY/REAL/FLOAT 类型
    SIGN(numeric_expression)     --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型
            --与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
    PI()       --返回值为π 即3.1415926535897936
    RAND([integer_expression])   --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数


    ----字符串函数----

    March 22

    复杂查询语句的使用

    ############################复杂查询语句的使用#####################################
    1.查询语句的使用
    使用 select语句和子查询(subquery)可以从一个或多个表,视图,实体试图中返回数据.
     
    1.1相关子查询
    可以将子查询(as subquery)或in或exists当成where的一个条件的一部分,这样的查询称为子查询
      .where中可以包含一个select语句的子查询
      .where中可以包含in,exists语句
      .最多可以嵌套16层
      .层次过多会影响性能
      [例]简单子查询实例
      查询是否有的专家既以研究所的名义来申请基金项目,又以大学系为单位申请项目
      (按规定只能以一个单位来申请)
      SQL> create table univ_subject
      2    (
      3       name                 varchar2(12) not null,
      4       per_id                number     not null,
      5      dept_name       varchar2(20)            
      6    );
      SQL> insert into univ_subject  values('gaoqianjing',1001,'信息工程系');
      SQL> insert into univ_subject  values('wangbing',1002,'物理系');
      SQL> insert into univ_subject  values('liming',1003,'化学系');
      ===============
       SQL> create table  colle_subject
      2     (
      3              colle_name    varchar2(20),
      4              per_id              number
      5     );
      SQL> insert into colle_subject values('电子研究所',1001);
      SQL>  insert into colle_subject values('物理研究所',1005);
      ================
      SQL> select name,per_id,dept_name from univ_subject where per_id in
      2    (select per_id from colle_subject);
      NAME            PER_ID   DEPT_NAME
      ------------          ---------     --------------------
      gaoqianjing  1001      信息工程系
    1.2外连接
     [例]外连接实例
     招生中所有学生的信息放在students表中,而部分有特长的学生在另一个表中stuent_skill中同样有该学生
     的信息。现在要全部列出所有学生,如果某个学生在表student_skill中就有其特长信息,并显示特长信息,如果
     某个学生没有特长就显示特长问空.
     SQL>  create table students
      2    (
      3       st_id    varchar2(20),
      4       name  varchar2(10),
      5       age      number(2),
      6       tol_score   number(3)
      7    ) ;
    SQL>   insert into students values('973231','wangbindu',22,501);
    SQL>   insert into students values('973232','zhuzhijing',21,538);
    SQL>  insert into students values('973233','gaojing',21,576);
    ===================
    SQL>  create table student_skill
      2   (
      3      st_id  varchar2(20),
      4      skill    varchar2(20)
      5  );
    SQL>  insert into student_skill values('973231','篮球');
    SQL>  insert into student_skill(st_id) values('973232');
    SQL>  insert into student_skill values('973233','足球');
    ===================
    SQL>   select a.* , b.skill from students a,student_skill b where a.st_id=b.st_id(+)
    order by a.st_id;
    ST_ID                NAME             AGE TOL_SCORE SKILL
    -------------------- ---------- --------- --------- ------------------  --
    973231               wangbindu         22       501        篮球
    973232               zhuzhijing           21       538
    973233               gaojing                21       576        足球
    1.3自我连接
    自我连接是在同一个表或视图内进行条件连接.
    [例]自我连接实例
    查询每个雇员的名字和该雇员的经理的名字:
    SQL> select e1.ename||'   work for   '||e2.ename "Employees and their Managers"
      2  from  scott.emp e1,scott.emp e2 where e1.mgr=e2.empno;
    Employees and their Managers
    -------------------------------------------------
    SMITH      work for   FORD
    ALLEN     work for   BLAKE
    WARD      work for   BLAKE
    JONES     work for   KING
    MARTIN   work for   BLAKE
    BLAKE     work for   KING
    CLARK     work for   KING
    SCOTT      work for   JONES
    TURNER  work for   BLAKE
    ADAMS     work for   SCOTT
    JAMES      work for   BLAKE
    FORD        work for   JONES
    MILLER     work for   CLARK
    1.4UNION , INTERSECT及 MINUS
    UNION:            可以将两个以上的表的相类似的查询结果放在一起 (union all则表示返回所有的行)
    具体语法:
    select ...
    union[all]
    select...
    ==========
    INTERSECT:  返回两个表中相同的信息
    具体语法:
    select ...
    intersect
    select...
    ==========
    MINUS          :  返回一个表中出现的信息
    具体语法:
    select ...
    minus
    select...
    [例1]UNION操作实例
    SQL> select  st_id  from students
      2  union
      3  select  st_id  from student_skill;
    ST_ID
    --------------------
    973231
    973232
    973233
    [例2]INTERSECT操作实例
    列出有特长的学生的学号
    SQL> select st_id from students
      2  intersect
      3  select st_id from student_skill;
    ST_ID
    --------------------
    973231
    973233
    [例3]MINUS操作实例
    列出没有特长学生的学号
    select st_id from students
    minus
    select st_id from student_skill;
    ST_ID
    --------------------
    973232

    2.创建复杂的视图
    许多应用系统有统计等功能,建议最好把这些复杂语句写成视图.下面是几个常用的视图.
    2.1分组视图
    [例1]简单的分组视图
    SQL> create or replace view dept_tot as
      2  select a.dname dept,sum(b.sal) total_sal from scott.dept a,scott.emp b
      3  where a.deptno=b.deptno group by a.dname;
    查看已建立。
    SQL> select * from dept_tot;
    DEPT                           TOTAL_SAL
    --------------                     ---------
    ACCOUNTING          8750
    RESEARCH              10875
    SALES                        9400
    [例2]带复杂函数视图
    SQL> create or replace view itemtot as
      2  select persion,sum(amount) itemtot from ledger
      3  where actiondate between
      4  to_date('01-MAR-1901','dd-mon-yyyy') and
      5  to_date('31-MAR-1901','dd-mon-yyyy')
      6  and action in('bought','raid') group by persion;
    2.2合计视图
    [例]合计函数视图实例
    SQL> create or replace view emp_no1  as
      2  select deptno,sum(sal) 工资和,sum(comm) 总和
      3  from scott.emp group by deptno;
    SQL> select * from emp_no1;
    DEPTNO    工资和      总和
    --------- --------- ---------
           10      8750
           20     10875
           30      9400      2200
    2.3组合视图
    [例]带组合函数的视图
    SQL> create or replace view byitem as
      2  select l.persion persion.item, amount, 100*amount/item bypersion,100*amount/total bytotal
      3  from ledgent l,itemtotal i,total where l.persion=i.persion where l.persion=i.persion
      4  and actiondate between
      5  to_date('01-MAR-1901','dd-mon-yyyy') and
      6  to_date('31-MAR-1901','dd-mon-yyyy')
      7   and action in('bought','raid') ;
    3.家族树
    语法:
    select column from table_name start with column=value
    connect by prior 父主键=子主键
    3.1排除单一性和分枝
    以ORACLE中的EMP表为例
    [例]从顶到底列出各雇员的信息
    SQL> select lpad(' ',4*(level-1))||ename name,empno,mgr from emp start with mgr is null
      2  connect by prior empno=mgr;
    NAME                                 EMPNO       MGR
    ---------                                  ---------           ---------
    KING                                   7839           
        JONES                           7566            7839
              SCOTT                     7788            7566
                    ADAMS              7876            7788
    3.2遍历至根
    [例1]现在要从某个雇员开始向他的上级列出该雇员的层次结构
    SQL> col ename for a30;
    SQL> select lpad(' ',4*(level-1))||ename ename,mgr,empno from scott.emp
      2  start with mgr=7788 connect by prior mgr=empno;
    ENAME                                MGR     EMPNO
    ------------------------------         ---------    ---------
    ADAMS                               7788      7876
        SCOTT                           7566       7788
            JONES                       7839       7566
                KING                                        7839
    [例2]列出所有雇员的层次结构
    SQL> select lpad(' ',4*(level-1))||ename ename,empno,mgr from scott.emp
      2  start with mgr is not null
      3  connect by empno=prior mgr;
    ENAME                              EMPNO       MGR
    ------------------------------       ---------           ---------
    SMITH                               7369          7902
        FORD                            7902         7566
            JONES                       7566        7839
                KING                    7839
    ALLEN                               7499        7698
        BLAKE                           7698        7839
            KING                        7839
    WARD                                7521        7698
        BLAKE                           7698        7839
            KING                        7839
    JONES                               7566        7839
        KING                            7839
    MARTIN                              7654        7698
        BLAKE                           7698         7839
            KING                        7839
    BLAKE                               7698        7839
        KING                            7839
    CLARK                               7782         7839
        KING                            7839
    SCOTT                               7788         7566
        JONES                           7566        7839
    March 20

    FSO操作文本的几个函数

    使用FSO修改文件特定内容的函数


    function  FSOchange(filename,Target,String)
    Dim  objFSO,objCountFile,FiletempData
    Set  objFSO  =  Server.CreateObject("Scripting.FileSystemObject")
    Set  objCountFile  =  objFSO.OpenTextFile(Server.MapPath(filename),1,True)
    FiletempData  =  objCountFile.ReadAll
    objCountFile.Close
    FiletempData=Replace(FiletempData,Target,String)
    Set  objCountFile=objFSO.CreateTextFile(Server.MapPath(filename),True)
    objCountFile.Write  FiletempData  
    objCountFile.Close
    Set  objCountFile=Nothing
    Set  objFSO  =  Nothing
    End  Function


    使用FSO读取文件内容的函数

    function  FSOFileRead(filename)  
    Dim  objFSO,objCountFile,FiletempData  
    Set  objFSO  =  Server.CreateObject("Scripting.FileSystemObject")  
    Set  objCountFile  =  objFSO.OpenTextFile(Server.MapPath(filename),1,True)  
    FSOFileRead  =  objCountFile.ReadAll  
    objCountFile.Close  
    Set  objCountFile=Nothing  
    Set  objFSO  =  Nothing  
    End  Function


    使用FSO读取文件某一行的函数

    function  FSOlinedit(filename,lineNum)  
    if  linenum  <  1  then  exit  function  
    dim  fso,f,temparray,tempcnt  
    set  fso  =  server.CreateObject("scripting.filesystemobject")  
    if  not  fso.fileExists(server.mappath(filename))  then  exit  function  
    set  f  =  fso.opentextfile(server.mappath(filename),1)  
    if  not  f.AtEndofStream  then  
    tempcnt  =  f.readall  
    f.close  
    set  f  =  nothing  
    temparray  =  split(tempcnt,chr(13)&chr(10))  
    if  lineNum>ubound(temparray)+1  then  
        exit  function  
    else  
        FSOlinedit  =  temparray(lineNum-1)  
    end  if  
    end  if  
    end  function


    使用FSO写文件某一行的函数

    function  FSOlinewrite(filename,lineNum,Linecontent)  
    if  linenum  <  1  then  exit  function  
    dim  fso,f,temparray,tempCnt  
    set  fso  =  server.CreateObject("scripting.filesystemobject")  
    if  not  fso.fileExists(server.mappath(filename))  then  exit  function  
    set  f  =  fso.opentextfile(server.mappath(filename),1)  
    if  not  f.AtEndofStream  then  
    tempcnt  =  f.readall  
    f.close  
    temparray  =  split(tempcnt,chr(13)&chr(10))  
    if  lineNum>ubound(temparray)+1  then  
        exit  function  
    else  
        temparray(lineNum-1)  =  lineContent  
    end  if  
    tempcnt  =  join(temparray,chr(13)&chr(10))  
    set  f  =  fso.createtextfile(server.mappath(filename),true)  
    f.write  tempcnt  
    end  if  
    f.close  
    set  f  =  nothing  
    end  function    


    使用FSO添加文件新行的函数

    function  FSOappline(filename,Linecontent)  
    dim  fso,f  
    set  fso  =  server.CreateObject("scripting.filesystemobject")  
    if  not  fso.fileExists(server.mappath(filename))  then  exit  function  
    set  f  =  fso.opentextfile(server.mappath(filename),8,1)  
    f.write  chr(13)&chr(10)&Linecontent  
    f.close  
    set  f  =  nothing  
    end  function  


    读文件最后一行的函数

    function  FSOlastline(filename)  
    dim  fso,f,temparray,tempcnt  
    set  fso  =  server.CreateObject("scripting.filesystemobject")  
    if  not  fso.fileExists(server.mappath(filename))  then  exit  function  
    set  f  =  fso.opentextfile(server.mappath(filename),1)  
    if  not  f.AtEndofStream  then  
    tempcnt  =  f.readall  
    f.close  
    set  f  =  nothing  
    temparray  =  split(tempcnt,chr(13)&chr(10))  
        FSOlastline  =  temparray(ubound(temparray))  
    end  if  
    end  function

     

    获取一个文本的所有行数


    Function  filenum(filename)
    Dim  temparray
    set  fso  =  server.CreateObject("scripting.filesystemobject")
    if  not  fso.fileExists(server.mappath(filename))  then  exit  Function
    set  f  =  fso.opentextfile(server.mappath(filename),1)
    if  not  f.AtEndofStream  then
    tempcnt  =  f.readall
    temparray  =  split(tempcnt,chr(13)&chr(10))
    lineNum=ubound(temparray)
    filenum  =lineNum
    f.close
    End  if
    End  Function  


    动态include文件

    '利用FSO动态调用文件
    Function  include(filename)
    Dim  re,Content,FSO,F,aspStart,aspEnd
    Set  FSO  =  CreateObject("Scripting.FileSystemObject")
    Set  F  =  FSO.OpenTextFile(Server.MapPath(filename))
    Content  =  F.ReadAll
    F.Close
    Set  =  Nothing
    Set  FSO  =  Nothing
    Set  re  =  New  RegExp
    re.pattern  =  "s*="
    aspEnd  =  1
    aspStart  =  inStr(aspEnd,content,"<%")+2
    Do  While  aspStart>aspEnd+1
    Response.Write  Mid(content,aspEnd,aspStart-aspEnd-2)
    aspEnd=inStr(aspStart,content,"%>")+2
    Execute(re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write  "))
    aspStart=inStr(aspEnd,content,"<%")+2
    Loop
    Response.Write  Mid(content,aspEnd)
    Set  re  =  Nothing
    End  Function


    删除文件

    '删除文件
    Function  DelFile(Filename)
    If  Filename  <>  ""  Then
    Set  FSO  =  Server.CreateObject("Scripting.FileSystemObject")
    If  FSO.FileExists(Filename)  Then
    FSO.DeleteFile  Filename
    End  If
    Set  FSO  =  Nothing
    End  If
    End  Function


    判断文件是否存在

    '判断文件是否存在
    Function  ReportFileStatus(filespec)
    Dim  FSO,msg
    Set  FSO  =  CreateObject("Scripting.FileSystemObject")
    If  (FSO.FileExists(filespec))  Then
    msg  =  filespec  &  "  exists."
    Else
    msg  =  filespec  &  "  doesn't  exist."
    End  If
    ReportFileStatus  =  msg
    End  Function


    使用FSO修改文件特定内容的函数

    '使用FSO修改文件特定内容的函数
    Function  FSOchange(filename,Target,String)
    Dim  objFSO,objCountFile,FiletempData
    Set  objFSO  =  Server.CreateObject("Scripting.FileSystemObject")
    Set  objCountFile  =  objFSO.OpenTextFile(Server.MapPath(filename),1,True)
    FiletempData  =  objCountFile.ReadAll
    objCountFile.Close
    FiletempData  =  Replace(FiletempData,Target,String)
    Set  objCountFile  =  objFSO.CreateTextFile(Server.MapPath(filename),True)
    objCountFile.Write  FiletempData  
    objCountFile.Close
    Set  objCountFile  =  Nothing
    Set  objFSO  =  Nothing
    End  Function


    使用FSO写文件某一行的函数

    '使用FSO写文件某一行的函数
    Function  FSOlinewrite(filename,lineNum,Linecontent)
    If  linenum  <  1  Then  Exit  Function
    Dim  FSO,f,temparray,tempCnt
    Set  FSO  =  Server.CreateObject("Scripting.FileSystemObject")
    If  Not  FSO.FileExists(Server.MapPath(filename))  Then  Exit  Function
    Set  f  =  FSO.OpenTextFile(Server.MapPath(filename),1)
    If  Not  f.AtEndofStream  Then
    tempcnt  =  f.ReadAll
    f.Close
    temparray  =  Split(tempcnt,Chr(13)&Chr(10))
    If  lineNum>UBound(temparray)+1  Then
    Exit  Function
    Else
    temparray(lineNum-1)  =  lineContent
    End  If
    tempcnt  =  jo&  #105;n(temparray,Chr(13)&Chr(10))
    Set  f  =  FSO.cr&  #101;atetextfile(Server.MapPath(filename),true)
    f.Write  tempcnt
    End  If
    f.Close
    Set  f  =  Nothing
    End  Function


    FSO替换指定文件的字符

    'FSO替换指定文件的字符
    Function  FSOLineEdit(filename,Target,String)
    Dim  objFSO,objCountFile,FiletempData
    Set  objFSO  =  Server.CreateObject("Scripting.FileSystemObject")
    Set  objCountFile  =  objFSO.OpenTextFile(Server.MapPath(filename),1,True)
    FiletempData  =  objCountFile.ReadAll
    objCountFile.Close
    FiletempData  =  Replace(FiletempData,Target,String)
    Set  objCountFile  =  objFSO.CreateTextFile(Server.MapPath(filename),True)
    objCountFile.Write  FiletempData
    objCountFile.Close
    Set  objCountFile  =  Nothing
    Set  objFSO  =  Nothing
    End  Function
    'Response.Write  FSOLineEdit("test.txt","世界","明天是一个好天去")


    使用FSO读取文件内容的函数

    '使用FSO读取文件内容的函数
    Function  FSOFileRead(filename)
    Dim  objFSO,objCountFile,FiletempData
    Set  objFSO  =  Server.CreateObject("Scripting.FileSystemObject")
    Set  objCountFile  =  objFSO.OpenTextFile(Server.MapPath(filename),1,True)
    FSOFileRead  =  objCountFile.ReadAll
    objCountFile.Close
    Set  objCountFile  =  Nothing
    Set  objFSO  =  Nothing
    End  Function


    建立目录的程序,如果有多级目录,则一级一级的创建

    '建立目录的程序,如果有多级目录,则一级一级的创建
    Function  CreateDIR(ByVal  LocalPath)
    On  Error  Resume  Next
    LocalPath  =  Replace(LocalPath,"","/")
    Set  FileObject  =  Server.CreateObject("Scripting.FileSystemObject")
    patharr  =  Split(LocalPath,"/")
    path_level  =  UBound(patharr)
    For  i  =  0  to  path_level
    If  i=0  Then  pathtmp=patharr(0)  &  "/"  Else  pathtmp  =  pathtmp  &  patharr(i)  &  "/"
    cpath  =  Left(pathtmp,Len(pathtmp)-1)
    If  Not  FileObject.FolderExists(cpath)  Then  FileObject.CreateFolder  cpath
    Next
    Set  FileObject  =  Nothing
    If  Err.Number  <>  0  Then
    CreateDIR  =  False
    Err.Clear
    Else
    CreateDIR  =  True
    End  If
    End  Function


    复制某目录下所有文件至指定目录

    '复制某目录下所有文件至指定目录
    Set  fso=CreateObject("Scripting.FileSystemObject")
    Set  Cur_Folder  =  fso.getfolder(Server.MapPath(SourcePath))  ''源文件夹  
    Distination_Path="c:\test"
    Set  sub_files  =  Cur_Folder.files
    for  each  each_file  in  sub_files
    sub_file_path=each_file.name
    fso.CopyFile  Server.MapPath(SourcePath)&"/"&sub_file_path,Distination_Path&"/"&sub_file_path,True
    Next

    一些增加页面友好性的代码

    不要小看这些,这些是提高网页友好性的重要方面,也是留住网页浏览者的一个重要的因素。相关的网站/网页应该有相关的实用工具,比方说一个学习英语的网站,应该有在线翻译的功能,所以应该嵌入“词霸”的代码,这样用户就不用再去google,baidu找了,这样就延长了用户的逗留时间,而且更重要的是提高了网站操作的友好性。如果是一个娱乐性网站就一般要有“电视节目查询”,如果是一个生理卫生方面的网站当然就要有“安全期查询”了。

    也可以把这些代码直接嵌入到相关的论坛中,现在已经有人这样做了。把词霸嵌入到英语角这样的论坛,把电视节目嵌入到影视剧场这样的论坛,使用的人还是非常多的。

    <!--ip查询-->
    <form action="http://ip.wisa.com.cn/ipsearch.php"  target="_blank">
    <P><SPAN class=style2222>请输入IP:</SPAN> <INPUT
                                maxLength =25 name=textfield> <INPUT type=submit value=查找 name=Submit> </P></form>

    <!--域名查询-->
    <iframe marginWidth=0 marginHeight=0
    src="::URL:http://hi.www.net.cn/hi/265/265.html" frameBorder=0 width="500" scrolling=no height="300"></iframe>
    <!--手机位置查询-->
    <iframe src="http://tool.yok.com/simcard.php"  width="760" height="300" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>

    <!--妇女安全期查询-->
    <IFRAME marginWidth=0 marginHeight=0
    src="http://www.xmdao.com/other/fna.htm"  frameBorder=0 width="100%" scrolling=no
    height=430> </IFRAME>

    <!--电视节目查询-->

    <form name="wsh1" METHOD=POST ACTION="http://wanshanghao.cn/servlet/search/out_search.jsp"  target="_blank">
    <table border=0>
    <tr><td valign="bottom">
    <input type="hidden" name="province" value="北京">
    <input type="hidden" name="channel" value="all">
    <input type="hidden" name="date" value="thisWeek">
    <INPUT TYPE="text" NAME="program" style="width:100" value="电视节目名称" onclick="javascript:this.value=’;"><IMG SRC="http://wanshanghao.cn/images/search.gif"  WIDTH="45" HEIGHT="21" BORDER="0" ALT="查询电视节目" onclick="document.wsh1.submit()">
    </td></tr>
    </table>
    </form>

    <!--词霸-->
    <TABLE width="351"  bgcolor="#FFFFFF">
    <form method=GET action="http://cb.kingsoft.com/search"  target=’_blank’>
    <tr><td width="343">
    <A HREF="http://cb.kingsoft.com/search"  target=’_blank’>
    <IMG SRC="http://cb.kingsoft.com/html/help/images/w_38X38.gif"  width=25 height="25" border="0" ALT="金山词霸" align="absmiddle" ></A><font class="abc">英文查词</font>
    < INPUT TYPE=text name=s size=25 maxlength=255 value="" class="input">< INPUT TYPE=hidden name=lang  value=’gb2312’> <INPUT type= submit value="词霸搜索" class="input" style="cursor:hand">
    </td>
    </tr>
    </form>

    <!--天气预报-->
    <form name="form1" method="post" action="http://www.tq121.com.cn/forecast/searchcity.php"   target="_blank">
        在输入框中输入您要查询的城市名称,查询到该城市当日天气。

        

        <input name="cityname"  size=36 type="text">
          
        <input name="Input" type="submit" value="查询天气">
        </span></td></form>

    </TABLE>

    <!--车次-->
    <form  name="frmGetZM" method="POST" action="http://train.chinamor.cn.net/zzcx2.asp"  class="p2"  target="_blank">
          <span class="p4">查询具体到达的车次信息。</span><font color="#666666"><span class="p4">
          </span></font>

    March 19

    Web上日历选择的HTC封装组件

    Date.htm

    <input type="text" style="behavior:url('Date.htc');" value="2004-01-01">

    Date.htc

    <public:attach event=oncontentready onevent=initDate()>
    <script>
    //该HTC组件目前只支持INPUT并TYPE=TEXT下使用

    //日期面板容器
    var vDiv=null;
    //框架
    var vFieldset=null;
    //日期面板
    var vTable=null;
    //日期格式字符串
    var strDate="";

    //静态数组
    var strWeekArray=new Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");

    function initDate()
    {
     //初始化日期
     if(element.value)
     {strDate=element.value;}
     else
     {strDate=getToday();}
     //创建容器
     vDiv=document.createElement("vDiv");
     vDiv.style.position="absolute";
     vDiv.style.left=0;
     vDiv.style.top=0;
     vDiv.style.width="275px";
     //绘制框架
     vFieldset=document.createElement("fieldset");
     var vLegend=document.createElement("legend");
     vLegend.style.font="normal 9pt 宋体";
     vLegend.innerHTML="日期";
     vFieldset.appendChild(vLegend);
     //绘制年月栏
     initYearMonthBar();
     //绘制面板
     initPanel();
     //绘制控制区
     initConsole();

     vDiv.appendChild(vFieldset);
     window.document.body.insertAdjacentElement("afterbegin",vDiv);
     vDiv.style.display="none";

     //事件绑定
     element.attachEvent("onmousedown",onMouseDown);
     element.readOnly="true";
    }
    //绘制面板
    function initPanel()
    {
     vTable=document.createElement("table");
     vTable.style.backgroundColor="#EEEEEE";
     vTable.border="0";
     vTable.cellSpacing="1";
     vTable.cellPadding="0";
     //vTable.width="80%";
     vTable.style.borderLeft="1px solid #000000";
     vTable.style.borderBottom="1px solid #000000";
     initWeekCol();
     initDayCell();
     vFieldset.appendChild(vTable);
    }
    //画年月
    function initYearMonthBar()
    {
     vInput=document.createElement("input");
     vInput.type="button";
     vInput.style.font="normal 9pt Marlett";
     vInput.value="3";
     vFieldset.appendChild(vInput);
     vSelect=document.createElement("select");
     vSelect.style.font="normal 8pt 宋体";
     for(mIndex=eval("getDateYear()-20");mIndex<=eval("getDateYear()+20");mIndex++)
     {
      vOption=document.createElement("option");
      vOption.value=mIndex;
      vOption.text=mIndex+"年";    
      vSelect.add(vOption);
      if(getDateYear()==mIndex)
      {
       vOption.selected="selected";
      }
     }
     vSelect.attachEvent("onchange",onYearChange);
     vFieldset.appendChild(vSelect);
     vInput=document.createElement("input");
     vInput.type="button";
     vInput.style.font="normal 9pt Marlett";
     vInput.value="4";
     vFieldset.appendChild(vInput);

     vInput=document.createElement("input");
     vInput.type="button";
     vInput.style.font="normal 9pt Marlett";
     vInput.value="3";
     vFieldset.appendChild(vInput);
     vSelect=document.createElement("select");
     vSelect.style.font="normal 8pt 宋体";
     var now=new Date();
     for(nIndex=1;nIndex<=12;nIndex++)
     {
      vOption=document.createElement("option");
      vOption.value=strFormat(nIndex,2);
      vOption.text=strFormat(nIndex,2)+"月";  
      vSelect.add(vOption);
      if(getDateMonth()==nIndex)
      {
       vOption.selected="selected";
      }
     }
     vSelect.attachEvent("onchange",onMonthChange);
     vFieldset.appendChild(vSelect);
     vInput=document.createElement("input");
     vInput.type="button";
     vInput.style.font="normal 9pt Marlett";
     vInput.value="4";
     vFieldset.appendChild(vInput);
    }
    //绘制控制区
    function initConsole()
    {
     vInput=document.createElement("input");
     vInput.type="button";
     vInput.style.font="normal 9pt 宋体";
     vInput.value="今天";
     vInput.attachEvent("onmousedown",onTodayMouseDown);
     vFieldset.appendChild(vInput);

     vInput=document.createElement("input");
     vInput.type="button";
     vInput.style.font="normal 7pt Webdings";
     vInput.value="a";
     vInput.attachEvent("onmousedown",onOKMouseDown);
     vFieldset.appendChild(vInput);
     
     vInput=document.createElement("input");
     vInput.type="button";
     vInput.style.font="normal 7pt Webdings";
     vInput.value="r";
     vInput.attachEvent("onmousedown",onCancelMouseDown);
     vFieldset.appendChild(vInput);
    }
    function onTodayMouseDown()
    {
     strDate=getToday();
     element.value=strDate;
     hideDate();
    }
    function onOKMouseDown()
    {
     element.value=strDate;
     hideDate();
    }
    function onCancelMouseDown()
    {
     hideDate();
    }
    //画星期列
    function initWeekCol()
    {
     var vTr=vTable.insertRow(0);
     for(nIndex=0;nIndex<7;nIndex++)
     {
      var vTd=vTr.insertCell(nIndex);
      vTd.innerHTML=strWeekArray[nIndex];
      vTd.style.font="normal 9pt 宋体";
      vTd.style.borderTop="1px solid #000000";
      vTd.style.borderRight="1px solid #000000";
      vTd.style.backgroundColor="#DDDDDD";
     }
    }
    //画天单元格
    function initDayCell()
    {
     var iCurDay=0;
     for(mIndex=1;mIndex<7;mIndex++)
     {
      var vTr=vTable.insertRow(mIndex);
      for(nIndex=0;nIndex<7;nIndex++)
      {
       var vTd=vTr.insertCell(nIndex);
       if(mIndex==1&&nIndex==1*getYearMonthWeek())
       {
        iCurDay=1;
        vTd.innerHTML=iCurDay;
       }
       else if(iCurDay!=0&&iCurDay<=1*getYearMonthDays())
       {
        vTd.innerHTML=iCurDay;
       }
       else
       {
        vTd.innerHTML="&nbsp;"
       }
       if(iCurDay==getDateDay())
       {
        vTd.style.color="#FF0000";
       }
       if(iCurDay!=0)
       {
        iCurDay++;
       }
       vTd.style.font="normal 9pt 宋体";
       vTd.style.borderTop="1px solid #000000";
       vTd.style.borderRight="1px solid #000000";
       vTd.attachEvent("onmousedown",onCellMouseDown);
      }
     }
    }
    //选择框年鼠标按下
    function onYearChange()
    {
     var vObject=window.event.srcElement;
     var strYearMonth=strDate.split("-");
     strDate=vObject.options[vObject.selectedIndex].value+"-"+strYearMonth[1]+"-"+strYearMonth[2];
     for(iRowCount=6;iRowCount>=1;iRowCount--)
     {
      vTable.deleteRow(iRowCount);
     }
     initDayCell();
    }
    //选择框月鼠标按下
    function onMonthChange()
    {
     var vObject=window.event.srcElement;
     var strYearMonth=strDate.split("-");
     strDate=strYearMonth[0]+"-"+vObject.options[vObject.selectedIndex].value+"-"+strYearMonth[2];
     for(iRowCount=6;iRowCount>=1;iRowCount--)
     {
      vTable.deleteRow(iRowCount);
     }
     initDayCell();
    }
    //单元格天鼠标按下
    function onCellMouseDown()
    {
     for(mIndex=1;mIndex<7;mIndex++)
     {
      for(nIndex=0;nIndex<7;nIndex++)
      {
       vTable.rows(mIndex).cells(nIndex).style.backgroundColor="transparent";
      }
     }
     var vObject=window.event.srcElement;
     var strYearMonth=strDate.split("-");
     strDate=strYearMonth[0]+"-"+strYearMonth[1]+"-"+strFormat(vObject.innerHTML,2);
     vObject.style.backgroundColor="#FFFFFF";
    }
    //元素中鼠标按下[显示面板]
    function onMouseDown()
    {
     if(element.value)
     {strDate=element.value;}
     else
     {strDate=getToday();}
     for(iRowCount=6;iRowCount>=1;iRowCount--)
     {
      vTable.deleteRow(iRowCount);
     }
     initDayCell();

    可编辑的 HTML JavaScript 表格控件 DataGrid

    转载:作者Blog:http://blog.csdn.net/jordan119/

    <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
    http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>无标题文档</title>

    <script language=javascript1.2>

    /*
     *====================================================================================================================
    */

    //定义全局的表格行列值
    var col = 5;
    var row = 2;

    //currRowIndex 选定行
    var currRowIndex = 0;

    //表单域数组(这部分作废)-----------------
    var elementNames = new Array(col);
    var k = 0;
    for(k=0;k<col;k++)
     elementNames[k] = k;
    //---------------------------------------

    //标题头数组
    var headers = new Array(col);
    for(k=0;k<col;k++)
    {
     headers[k] = "第" + k + "列";
    }

    //columnPropertys : 装载要创建的列读写属性
    var colPropertys = new Array(col)
    for(k=0;k<10;k++)
     colPropertys[k] = 1;

     colPropertys[0] = 0;

    //colDefaultValues : 代表每次增加行的时候需要装入的默认值
    var colDefaultValues = new Array(col);
    for(k=0;k<col;k++)
    {
     if(k%2==0)
      colDefaultValues[k] = "o";
     else
      colDefaultValues[k] = "j"; //代表这个不是默认值
    }

    //dataArray : 需要修改的数据集,修改之前预先装入,供用户参考
    var dataArray = new Array(row*col);
    var m=0,n=0;
    for(m=0;m<row;m++)
    {
     for(n=0;n<col;n++)
     {
      dataArray[m*col + n] ="array(" + m + "," + n + ")";  //注意这里代表2维数组
     }
    }


    /*
     *====================================================================================================================
    */
    var oPopup = window.createPopup();

    //创建一个公共的可编辑的表格
    //参数: 
    //   formName : 表单名
    //   action : 代表当前要执行的提交动作 : 1:add 2:del 3:modefy 4:query
    //   formAction : 表格对应Form的Action
    //   tableId :表格ID
    //   colNum:表单列数目
    //   rowNum:初始表格的行数目
    function CreateTable(formName,action,formAction,tableId,colNum,rowNum)

     var startStr = new String("");
     var endStr = new String("");
     var colStr = new String("");
     startStr = "<form name=\"" + formName + "\" method=post action=\"" + formAction + "\">";
     startStr += "<table id=\"" + tableId +"\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">";
     
     colStr = createTrs(colNum,rowNum);
     
     endStr = "</table>";

     //创建用来获取最后表格输出数据的隐藏域
     var hiddens = CreateHiddens(colNum,action);
     endStr += hiddens;
     endStr += "</form>";
     //输出表格
     //document.forms(0).elements("t").value = (startStr + colStr + endStr);
     document.write(startStr + colStr + endStr);
    }

    function CreateHiddens(cols,action)
    {
     var str = new String("");
     var i=0;
     for(i=0;i<cols;i++)
     {
      str +="<input type=\"hidden\" name=\"col" + (i+1) + "\" >";
     }
     str+="<input type=hidden name=\"action\" value=\"" + action + "\">";
     return str;
    }

    function createTrs(colNum,rowNum)
    {
     var colStr = new String("");
     var i = 0;
     var j = 0;

     colStr += "<tr bgColor='#00ccff'>"
     
     //创建表头行
      colStr += "<td onClick=orderTb1(this,1); onMouseOver=\"showTip('单击对本列排序');\" onMouseOut=\"hideTip();\"><center>"
      colStr += "序号";
      colStr += "</center></td>";
     for(i=1;i<=colNum;i++)
     {
      colStr += "<td align=center onClick=orderTb1(this,1); onMouseOver=\"showTip('单击对本列排序');\" onMouseOut=\"hideTip();\" >";
      colStr += headers[i-1];
      colStr += "</td>";
     }

     //创建表体行
     for(i=0;i<rowNum;i++)
     {
      colStr += "<tr ";
      colStr += "onDblClick=\"ChangeInput(this);\" ";  //表格行中的事件支持部分
      colStr += "onBlur=\"ResetTR(this);\" >";
      
      //创建每行的所有单元格
       colStr += "<td  onClick=SelectRow(this);>";
       colStr += i+1;
       colStr +="</td>";
      for(j=1;j<=colNum;j++)
      {
       colStr += "<td onMouseOut=\"this.bgColor='#FFFFFF';\" onMouseOver=\"this.bgColor='#00CCFF';\" >";
       colStr += dataArray[i*colNum+j-1];
       colStr +="</td>";
      }
      colStr +="</tr>";
     }
     return colStr;
    }

    //把某行转变为输入状态
    function ChangeInput(objTR)
    {
     var str = new String("");
     var i = 0;
     
     for(i=1;i<objTR.cells.length;i++)
     {
      str = "<input type=text name=\"" + elementNames[i-1] + "\" style=\"width:" + objTR.cells[i].width + "\" ";
      //装入默认值
      if(colDefaultValues[i-1]=="j") //j代表该列不能装入默认值
       str += "value=\"" + objTR.cells[i].innerText + "\"";
      else//否则装入默认值
       str += "value=\"" + colDefaultValues[i-1] + "\"";
      //控制控件的读写属性
      if(colPropertys[i-1] == 0)
      {
       str += " disabled ";
      }
      str += "/>";
      objTR.cells[i].innerHTML = str;
     }

     objTR.ondblclick=doNothing;  //使行保持原始状态
    }

    //把行恢复为非输入状态
    function ResetTR(objTR)
    {
     var str = new String("");
     var i = 0;
     for(i=0;i<objTR.cells.length;i++)
     {
      var objChild;
      var tmpStr = "";
      tmpStr = objTR.cells[i].innerHTML;

      //里面包含控件
      if(objTR.cells[i].firstChild!=undefined && objTR.cells[i].firstChild.value!=undefined)
      {
       tmpStr = objTR.cells[i].firstChild.value;
       if(tmpStr=="")
        tmpStr = "&nbsp;"
       objTR.cells[i].innerHTML = tmpStr + "&nbsp;";
       continue;
      }
      
      //里面不包含控件
      if(tmpStr=="&nbsp;" || tmpStr=="")
      {
       if(objTR.cells[i].innerHTML!="")
        tmpStr += objTR.cells[i].innerHTML;
       else
        tmpStr += "&nbsp;";
      }
      objTR.cells[i].innerHTML = tmpStr;

      if(objTR.cells[i].innerHTML=="")
       objTR.cells[i].innerHTML="&nbsp;";
     }
    }

    //对表格指定列进行排序
    function orderTB(objTB,index,type){
     for(var i=1;i<(objTB.rows.length-1);i++){
      for(var j=i+1;j<objTB.rows.length;j++){
       var tmp1,tmp2;
       
       if(objTB.rows[j].cells[index].firstChild.value==undefined)
        tmp1 = objTB.rows[j].cells[index].innerText;
       else
        tmp1 = objTB.rows[j].cells[index].firstChild.value;
       
       if(objTB.rows[i].cells[index].firstChild.value==undefined)
        tmp2 = objTB.rows[i].cells[index].innerText;
       else
        tmp2 = objTB.rows[i].cells[index].firstChild.value;
        if(tmp1>tmp2)
        {
         objTB.moveRow(j,i);
        }
      }
     }
    }

    function orderTb1(objTD,type)
    {
     var objTR =objTD.parentElement;
     var objTable = objTR.parentElement;
     var colIndex = objTD.cellIndex;
     orderTB(objTable,colIndex); 
    }

    //在表格末尾增加一行
    function InsertRow(tableId)
    {
     var objTable = document.getElementById(tableId);
     var col = objTable.cells.length/objTable.rows.length;
     var row = objTable.rows.length;
     var objRow = objTable.insertRow();  //增加行
     var i = 0;
     
     //取得最大序号
     var max1 = 1;
     for(i=1;i<row-1;i++)
     {
      var tmpMax = 1;
      if(parseFloat(objTable.rows[i].cells[0].innerText) > parseFloat(objTable.rows[i+1].cells[0].innerText))
      {
       tmpMax = parseFloat(objTable.rows[i].cells[0].innerText);
      }
      else
      {
       tmpMax = parseFloat(objTable.rows[i+1].cells[0].innerText);
      }
      if(tmpMax>=max1)
       max1= tmpMax;
     }
     for(i=1;i<=col;i++)
     { 
      var objCell = objRow.insertCell();
      objRow.cells[0].innerText = parseFloat(max1)+1;
      objCell.innerHTML = "&nbsp;";
      objCell.onmouseover = Td_MouseOver_Handle;
      objCell.onmouseout = Td_MouseOut_Handle
      objRow.cells[0].onclick = TD_Click_Handle;
      objRow.cells[0].onmouseover = doNothing;
      objRow.cells[0].onmouseout = doNothing;
     }
     //为新增的行提供事件绑定支持
     //objRow.attachEvent('ondblclick', dblClick_Handle);
     objRow.ondblclick = dblClick_Handle;
     objRow.onblur = click_Handle;
    }

    //删除最后1行
    function DeleteRow(tableId)
    {
     var objTable = document.getElementById(tableId);
     if(objTable.rows.length==1)
     {
      alert("对不起,你不能删除表格头!!!");
      return;
     }
     if(confirm("确定删除?"))
     {
      objTable.deleteRow();
     }
    }

    //选定指定行
    function SelectRow(objTD)
    {
     var objTR =objTD.parentElement;
     var objTable = objTR.parentElement;
     
     for(var i=1;i<objTable.rows.length;i++)
      objTable.rows[i].cells[0].bgColor = "#ffffff";
      
     objTD.bgColor="#ff0000";
     currRowIndex = objTR.rowIndex;
    }

    //删除指定的行
    function DeleteOneRow(tableId,rowIndex)
    {
     var objTable = document.getElementById(tableId);
     var objTable = document.getElementById(tableId);
     if(objTable.rows.length==1 || rowIndex==0)
     {
      alert("对不起,你首先必须选择要删除的行!!!");
      return;
     }
     if(confirm("确定删除?"))
     {
      objTable.deleteRow(rowIndex);
      currRowIndex = 0;
     }
     else
     {
      for(var i=1;i<objTable.rows.length;i++)
      {
       objTable.rows[i].cells[0].bgColor = "#ffffff";
       currRowIndex = 0;
      }
     }
    }

    //鼠标选择指定列
    function  TD_Click_Handle()
    {
     SelectRow(this)
    }

    //鼠标移入事件支持
    function Td_MouseOver_Handle()
    {
     this.bgColor = "#00ccff";
    }

    //鼠标移出事件支持
    function Td_MouseOut_Handle()
    {
     this.bgColor = "#ffffff";
    }

    //鼠标双击事件支持
    function dblClick_Handle()
    {
     ChangeInput(this);// 切换到输入状态
     this.ondblclick=doNothing;
    }

    //鼠标单击事件支持
    function click_Handle()
    {
     ResetTR(this);
    }
    //保持行的原始状态
    function doNothing()
    {
     return;
    }

    function showTip(msg)
    {

    with (oPopup.document.body)
    {
     style.backgroundColor="lightyellow";
     style.border="solid black 1px";
     style.fontSize = 12;
     innerHTML=msg;
    }
    oPopup.show(event.x, event.y, 95, 16, document.body);
    }

    function hideTip()
    {
     if(oPopup!=undefined)
      oPopup.hide();
    }
    //===格式化字符串函数(删除前后空格)================
    function trim(str)
    {
     var tmpStr = new String(str);
     var startIndex = 0,endIndex = 0;
     for(var i=0;i<tmpStr.length;i++)
     {
      if(tmpStr.charAt(i)==" ")
      {
       continue;
      }
      else
      {
       startIndex = i;
       break;
      }
     }
     for(var i=tmpStr.length;i>=0;i--) //注意开始最大下标必须减1
     {
      if(tmpStr.charAt(i-1)==" ")
      {
       
       continue;
      }
      else
      {
       endIndex = i;
       break;
      }
     }

      tmpStr = tmpStr.substring(startIndex,endIndex);
      return tmpStr;
    }
    //====================================================================================================================
    //submit 方法
    function getData(tableId,form)
    {
     var objTable = document.getElementById(tableId);
     var cols = objTable.cells.length/objTable.rows.length-1;
     var rows = objTable.rows.length-1;
     //为每个隐藏域设置值
     var i=0,j=0;
     for(i=1;i<=cols;i++)
     {
      for(j=1;j<=rows;j++)
      {
       if(objTable.rows[j].cells[i].firstChild.value==undefined)
       {
        document.forms(form).elements("col" + i).value += trim(objTable.rows[j].cells[i].innerText);
       }
       else
        document.forms(form).elements("col" + i).value += trim(objTable.rows[j].cells[i].firstChild.value);
       
       document.forms(form).elements("col" + i).value +=  "#";
      }
     }
     document.forms(form).submit();
    }
    //====================================================================================================================
    </script>

    </head>

    <body>
    <input type="button" onClick="InsertRow('tableId');" value="InsertRow">
    <input type="button" onClick="DeleteRow('tableId');" value="DeleteRow">
    <input type="button" onClick="getData('tableId','specForm');" value="submit">
    <input type="button" onClick="DeleteOneRow('tableId',currRowIndex)" value="Delete Spec Row">
    <input type="button" onClick="orderTB(document.getElementById('tableId'),3);" value="order Spec Col">

    </body>
    </html>
    <script language="javascript1.2">
    CreateTable('specForm','1','sub.jsp','tableId',col,row);
    </script>

     

    我的Javascript函数

    //检测文件扩展名
    function EuwCheckExt(path,extList){
     var ext = getFileExt(path);
     var cExt = extList.indexOf("," + ext + ",");
     if (ext == "") return -1;
     if (cExt){
      return 1;
     }else{
      return 0;
     }
    }

    //取得文件扩展名
    function getFileExt(path){
     var tmp = path;
     tmp = tmp.substring(tmp.lastIndexOf(".")+1);
     return tmp.toUpperCase();
    }

    //操作样式
    function init(a){
      var styleText1 = "";
        styleText1 +="font-family: Arial, Verdana;";
        styleText1 +="font-size: 18pt;";
        styleText1 +="font-weight: bold;";
        styleText1 +="font-style: italic;";
        styleText1 +="color: #33CC00;";
        //styleText1 +="background-color: #CCCC00;";
        styleText1 +="filter: DropShadow(Color=#000000, OffX=1, OffY=1, Positive=0);";
        tdTmp.style.cssText=styleText1;
    }

    //粘贴前过滤剪贴板数据
    function EuwColorOnBeforePaste(objColor){
        clipboardData.setData('text',clipboardData.getData('text').replace(/[^a-fA-F0-9]/g,'').toUpperCase());
    }

    //颜色值输入
    function EuwColorOnKeyUp(objColor){

        objColor.value=objColor.value.replace(/[^#a-fA-F0-9]/g,'').toUpperCase();

    }

    //setTimeout()应用
    function loopshow(name){
     xxx.location="a.jpg";
     setTimeout("loopshow(" + name + ");",100);
    }

    //数字输入
    function EuwCheckNumOnKeyUp(obj){
        obj.value=obj.value.replace(/[^0-9.]/g,'').toUpperCase();
    }

    //按比例缩放图片
    var loadNum=0;
    var loadTimes = 3;
    checkShowSize = false;
    function showsize()
    {
     //document.upload.FILE1.value = trim(document.upload.FILE1.value);
     document.all.view.src = document.upload.FILE1.value;
     //alert(document.all.view.height + "x" + document.all.view.width + " -> " + document.all.view.fileSize);
     

     var diskuse = 5190970
     var quota = 5242880
        var maxfilesize = 512000;
        var showimg = new Image();
        Image.create(22,22).
        showimg.src = document.upload.FILE1.value;
        alert(showimg.fileSize);
        if(showimg.fileSize>0)
     {
      if(showimg.fileSize > maxfilesize)
      {
       alertmsg = "您选中的图片大于" + maxfilesize+ ",目前字节数=" + showimg.fileSize;
       return false;
      }

      if(showimg.fileSize > quota - diskuse) {
       alertmsg = "您选中的图片文件过大,或者相册已满";
       return false;
      }

      if(showimg.width > 100)
      {
       alert(showimg.width);
       var ori_w= showimg.width;
       var ori_h = showimg.height;
       showimg.width = 100;
       showimg.height = ori_h * showimg.width / ori_w;
      }

      if(showimg.width < 5 || showimg.height <5)
      {
       showimg.width = showimg.height = 150;
      }

      //document.all.view.src = showimg.src;
      document.all.view.style.width = showimg.width;
      document.all.view.style.height = showimg.height;
      checkShowSize = true;
      return true;
     } else if(loadNum<loadTimes) {
      loadNum ++ ;
      setTimeout('showsize()',500); 
     } else if(loadNum>=loadTimes){
      loadNum = 0;
      alertmsg = "图片字节数=0,请换张图片上传";
      return false;
     }
    }

    //字符串长度属性
    String.prototype.len=function()
    {
        return this.replace(/[^\x00-\xff]/g,"**").length;
    }

    //
    日期自动补0
    function appendZero(n){return(("00"+ n).substr(("00"+ n).length-2));}

    //字符串去空格属性
    function String.prototype.trim(){return this.replace(/(^\s*)|(\s*$)/g,"");}

    //
    打开一个全屏或者居中的窗口
    function openwindow( url, winName,width,height,otherproperty)
    {
       //width,height
       //otherproperty
       xposition=0; yposition=0;
       if ((parseInt(navigator.appVersion) >= 4 ))
       {
            if(width == 1)
            {
                width=screen.width - 10;
                height=screen.height - 55;
                xposition = 0;
                yposition = 0;
            }
            else
            {
                if (width < 1)
                {
                    width=screen.width*width;
                    height=screen.height*height;
                }
                xposition = (screen.width - width) / 2;
                yposition = (screen.height - height) / 2 - 15;
            }

          if (yposition < 0 )
          {
                yposition = 0;
          }
        }
        theproperty= "width=" + width + ", " + "height=" + height + ", "
            + "screenX=" + xposition + ", " //Netscape
            + "screenY=" + yposition + ", " //Netscape
            + "left=" + xposition + ", " //IE
            + "top=" + yposition + ", "; //IE

        theproperty = theproperty + "location=0, "
            + "menubar=0, "
            + "resizable=0, "
            + "scrollbars=1, "
            + "status=0, "
            + "toolbar=0, "
            + "hotkeys=0, ";
        theproperty = theproperty + ', ' + otherproperty;
        winobj=window.open( url,winName,theproperty );
        if (url == "about:blank")
        {
            winobj.document.writeln("<font face='Arial' color='red' size='4'>Loading.....</font>");
        }
        winobj.focus();
        return winobj;
    }

    //给定图片的最大高宽,取得缩放的比例
     function EuwResizeRatio(maxWidth,maxHeight, objImgTmp)
     {
        var hRatio;
        var wRatio;
        var Ratio = 1;
        var maxHeight;
        var maxWidth;
        var width = objImgTmp.width;
        var height = objImgTmp.height;
        wRatio = EuwStr2Float(maxWidth / width,2);
        hRatio = EuwStr2Float(maxHeight / height,2);
        if (wRatio<1 || hRatio<1){
            if (wRatio<=hRatio)
                Ratio = wRatio
            else
                Ratio = hRatio
        }
        return Ratio;
     }
    //改进版本,结合setTimeout传递参数做法(脚本块中有此方法)
     function EuwResizeRatio(maxWidth,maxHeight,objImgTmp,srcImg)
    {
        var hRatio;
        var wRatio;
        var Ratio = 1;
        var isKernel = true;
        if (objImgTmp==null) {isKernel = false};
        if (isKernel && objImgTmp.width==0) {isKernel = false};
        var width = 0;
        var height = 0;
        if (isKernel){
            width = objImgTmp.width;
            height = objImgTmp.height;
            wRatio = EuwStr2Float(maxWidth / width,2);
            hRatio = EuwStr2Float(maxHeight / height,2);
            //alert(wRatio + "--" + hRatio);
            if (maxWidth==0){//
                if (hRatio<1) Ratio = hRatio;
            }else if (maxHeight==0){
                if (wRatio<1) Ratio = wRatio;
            }else if (wRatio<1 || hRatio<1){
                Ratio = (wRatio<=hRatio?wRatio:hRatio);
            }
            width = width * Ratio;
            height = height * Ratio;
            if (Ratio<1){
             objImgTmp.width = width;
            objImgTmp.height = height;
            }
            if (srcImg!=null){
                srcImg.width = width;
                srcImg.height = height;
            }
        }else{
            var timer=window.setTimeout(EuwResizeRatio,100,maxWidth,maxHeight,objImgTmp,srcImg);
        }
    }

    function String.prototype.trim(){return this.replace(/(^\s*)|(\s*$)/g,"");}
    function gf_AppendZero(n){return(("00"+ n).substr(("00"+ n).length-2));}//日期自动补零程序//

    //取得当前系统日期时间
    function gf_now()  
    {
     var fs_now = new Date();
     var fs_return="";
     fs_return = fs_now.getFullYear() + "-" + gf_AppendZero(fs_now.getMonth() + 1) + "-" + gf_AppendZero(fs_now.getDate());
     fs_return +=" " + gf_AppendZero(fs_now.getHours()) + ":" + gf_AppendZero(fs_now.getMinutes()) + ":" + gf_AppendZero(fs_now.getSeconds());
     return fs_return;

    //取得当前系统日期
    function gf_today()  
    {
     var fs_now = new Date();
     var fs_return="";
     fs_return = fs_now.getFullYear() + "-" + gf_AppendZero(fs_now.getMonth() + 1) + "-" + gf_AppendZero(fs_now.getDate());
     return fs_return;

    //验证日期是否合法(true/false)
    function  gf_chkdate(as_datestr) 

     var fs_year="";fs_mon="";fs_day="";fs_time="";fs_hour="";fs_min="";fs_sec="";fs_obj="";fs_syn="";
     var fi_loop,fi_len
     
     fi_len = as_datestr.length
     fs_obj = "year"
     if (fi_len<=0) return true;
     for (fi_loop=0;fi_loop<fi_len;fi_loop++ )
     {
      if (as_datestr.charAt(fi_loop)==" " && fs_obj == "day" ) fs_obj = "hour";
      if  (as_datestr.charAt(fi_loop)==  '-'|| as_datestr.charAt(fi_loop)==  '/')
      {
       if (fs_syn == "")
       {
        fs_syn = as_datestr.charAt(fi_loop)
       }
       else
       {
        if (fs_syn != as_datestr.charAt(fi_loop)) return false //没有用统一的"-"或"/"符号错误
       } 
       
       if (fs_obj == "year" )
       {
        fs_obj = "month"
       }
       else if (fs_obj == "month" )
       {
        fs_obj = "day"
       }
      }
      else if (as_datestr.charAt(fi_loop)==  ':')
      {
       if (fs_obj == "hour" )
       {
        fs_obj = "minute"
       }
       else if (fs_obj == "minute" )
       {
       fs_obj = "second"
       }
      }
      else //取出相应的值
      {
       if (!(as_datestr.charAt(fi_loop) >= 0 && as_datestr.charAt(fi_loop) <= 9)) return false
       if (fs_obj == "year" )
       {
        fs_year += as_datestr.charAt(fi_loop)
       }
       else if (fs_obj == "month" )
       {
        fs_mon += as_datestr.charAt(fi_loop)
       }
       else if (fs_obj == "day" )
       {
        fs_day += as_datestr.charAt(fi_loop)
       }
       else if (fs_obj == "hour" )
       {
        if (as_datestr.charAt(fi_loop)!= " ") fs_hour += as_datestr.charAt(fi_loop)
       }
       else if (fs_obj == "minute" )
       {
        fs_min += as_datestr.charAt(fi_loop)
       }
       else if (fs_obj == "second" )
       {
        fs_sec += as_datestr.charAt(fi_loop)
       }
      }
     }
        //验证时间的合法性
     if (fs_hour != "")
     {
      if ( fs_min == "" )
      {
       return false
      }
      else
      {
       if (fs_sec == "") fs_sec = "0"
      }
      if ( fs_hour > 24 || fs_hour < 0 || fs_min >= 60 || fs_min < 0 || fs_sec >= 60 || fs_sec < 0 )
      {
       return false //时间错误
      }
      if (fs_hour.length>2 || fs_min.length>2) return false
     }
     //验证日期的合法性
     if ( fs_year == "" || fs_mon=="" || fs_day=="" ) return false;
     if (fs_year.length == 2 )
     {
      fs_year = '20'+ fs_year;
     }
     else if (fs_year.length != 4 )
     {
      return false;
     }
     if ( fs_year.length > 4 || fs_mon.length > 2 || fs_day.length > 2 ) return false;
     if (!(fs_year>1901 && fs_year < 2999 && 1<=fs_mon  && 12>=fs_mon && 31>=fs_day && 1<=fs_day) ) return false;
     if (( fs_mon==4 || fs_mon==6 || fs_mon==9 || fs_mon==11 ) && (fs_day>30)) return false;
     if  ((fs_year % 4 == 0) && (fs_mon==2) && (fs_day > 29))   return false;
     if  (!(fs_year % 4 == 0) && (fs_mon==2) && (fs_day > 28))   return false;

     return true; 
    }

    //验证只能录入整数onkeypress
    function gf_checkint()
    {
    if ((window.event.keyCode<48 || window.event.keyCode>57) && window.event.keyCode!=45 ) window.event.returnValue=false;
    }

    //验证只能录入实数onkeypress
    function gf_checkobjfloat(objectname) 
    {
    if ((window.event.keyCode<45 || window.event.keyCode>57 || window.event.keyCode==47) && window.event.keyCode!=45)  window.event.returnValue=false;
    if( window.event.keyCode==46 && objectname.value.indexOf(".")>-1) window.event.returnValue=false;
    }


    //验证不能为空的数据//
    function gf_mandatory(as_prompt)

       //as_prompt:tbx_a,不能为空*tbx_b,不能为空*
       var fs_src = as_prompt;
       var fas_p = fs_src.split("*");
       var fas_n;
       for(var i=0;i<fas_p.length;i++)
       {
          if (fas_p[i]!="")
          {
             fas_n = fas_p[i].split(",");
             if (fas_n.length<2){alert("验证表达式有误,请检查");return false;}
             if (document.all(fas_n[0])==null){alert("Control Name:" + fas_n[0] + " is wrong!");return false;}
             if (gf_trim(document.all(fas_n[0]).value)=="")
             {
                alert(fas_n[1]);
                document.all(fas_n[0]).focus();
                return false;
             }
          }
       }
       return true;
    }

    //检查是否是数字,小数
    function gf_chknum(ai_num) 

       var fi_i,fi_j,fi_dot,strTemp; 
       strTemp=".0123456789";
       fi_dot = 0;  //小数点个数
       if (ai_num.toString().length == 0) return false;
       if (ai_num.charAt(0) == "." || ai_num.charAt(ai_num.length - 1) == ".")  return false;
       for(fi_i=0;fi_i<ai_num.length;fi_i++) 
       { 
          fi_j = strTemp.indexOf(ai_num.charAt(i));             
          if (fi_j == -1) return false;
      if (ai_num.charAt(i) == ".")
          {
       fi_dot++;
       if (fi_dot>1) return false;
          }
       } 
       return true; 
    }

    //去除字符串的空格
    function gf_trim(as_string)
    {
       while(as_string.length > 0 && as_string.indexOf(" ")==0) as_string = as_string.substr(1);
       while(as_string.length > 0 && as_string.lastIndexOf(" ")==(as_string.length-1)) as_string = as_string.substr(0,as_string.length-1);
       return as_string;
    }

    //只能输入大写字符
    function gf_lc2uc()
    {
     if (window.event.keyCode>=97 & window.event.keyCode<=122 )
     {
      window.event.keyCode = window.event.keyCode - 32;
     }
    }

    /**
    格式化日期函数
    D--日期2004-12-25
    DT--日期时间2004-12-25 12:05:56
    **/
    function gf_formatdate(as_date,as_datetype)
    {
     //2003-11-12 11:25:13
     var fs_tmp = new Array();
     var fs_date = (as_date==null?"":gf_trim(as_date));
     var fs_datetype = (as_datetype==null?"D":"DT");
     if (fs_date=="") return fs_date;
     var fi_space = fs_date.indexOf(" ");
     var fs_ymd = fs_date.substr(0,fi_space);
     var fs_hms = fs_date.substr(fi_space+1);
       if (fs_ymd == "") {fs_ymd = fs_hms;fs_hms = "";}
     fs_tmp = fs_ymd.split("-");
     fs_ymd = (fs_tmp[0].length==2?("20" + fs_tmp[0]):fs_tmp[0]) + "-" + gf_AppendZero(fs_tmp[1]) + "-" + gf_AppendZero(fs_tmp[2]);
     if (fs_hms != "")
     {
        fs_tmp = fs_hms.split(":");
        fs_hms = " " + gf_AppendZero(fs_tmp[0]) + ":" + gf_AppendZero(fs_tmp[1]) + (fs_tmp.length==3?(":" + gf_AppendZero(fs_tmp[2])):"");
     }
     fs_date = fs_ymd + (fs_datetype=="D"?"":fs_hms);
     return fs_date;
    }

    //集装箱箱号验证
    //Author: sundy 20003-4-28
    //格式:gf_chkcntrno(as_cntrno, fi_choice ) return( boolean )
    //功能:验证集装箱箱号:
    //参数:
    //   as_cntrno 是否符合国际标准,
    //返回值:True 符合国际标准或强行通过(特殊箱号)
    //举例:gf_chkcntrno( 'TEXU2982987', 0 )
         
    function gf_chkcntrno(as_cntrno,ai_choice)
    {
     var fi_ki;
     var fi_numsum;
     var fi_nummod;
     var fai_num = new Array(11);
     var fb_errcntrno=false;

     if (as_cntrno==null) return true; //null不进行验证
     if (gf_trim(as_cntrno)=="") return true; //空不进行验证
     
     if (as_cntrno.length == 11)   //国际标准为11位,最后一位是校验位,若不是11位肯定不是标准箱
     { for(fi_ki=1;fi_ki<=11;fi_ki++)
       fai_num[fi_ki] = 0;
      for(fi_ki=1;fi_ki<=4;fi_ki++)     //根据国际标准验证法则处理箱号前面的4个英文字母
      {
       fch_char=as_cntrno.charAt(fi_ki-1).toUpperCase();
       switch(true)
       { case (fch_char=="A"):{fai_num[fi_ki] = 10;break;}
        case (fch_char>="V" && fch_char<="Z"):{fai_num[fi_ki] = fch_char.charCodeAt() - 52;break;}
        case (fch_char>="L" && fch_char<="U"):{fai_num[fi_ki] = fch_char.charCodeAt() - 53;break;}
        default:{fai_num[fi_ki] = fch_char.charCodeAt() - 54;break;}
       }
      }
      for(fi_ki=5;fi_ki<=11;fi_ki++)
      {  fch_char=as_cntrno.charAt(fi_ki-1);
       fai_num[fi_ki] = parseInt(fch_char); //ctype((mid(as_cntrno, fi_ki, 1)), integer)
          }
      fi_numsum = 0
      
      for(fi_ki=1;fi_ki<=10;fi_ki++)
      { 
       fi_sqr = 1;
       for(i=1;i<fi_ki;i++){fi_sqr *=2;}
       fi_numsum += fai_num[fi_ki] * fi_sqr;
      }

      if (as_cntrno.substr(0,4) == "HLCU") fi_numsum = fi_numsum - 2; //hapaq lloyd的柜号与国际标准相差2
      fi_nummod = fi_numsum % 11;
      if (fi_nummod == 10) fi_nummod = 0;
      if (fi_nummod == fai_num[11]) fb_errcntrno = true;
      return fb_errcntrno;
     }else{
        return fb_errcntrno;
     }  
    }


    /*由于在Js中Replace只能替换一次,下面函数能全局替换2003.5.13 -sundy
    as_expression --包含要替换的字符串
    as_find --搜索的子字符串
    as_replacement --要替换的字符串
    替换字符串函数,如:"'"转换为"''"
    */
    function gf_replace(as_expression,as_find,as_replacement)
    {
       var fs_expression = as_expression;
       var fs_find = as_find;
       var fs_replacement = as_replacement;
       if (fs_expression == "") return "";
       if (fs_find == "") return "";
       //构造正则表达式\,$,(,),*,+,.,[,?,{,^,|为特殊字符,必须转义后替换
       fs_regx1 = /\\/gi;
       fs_find = fs_find.replace(fs_regx1,"
    \\\\");
       fs_replacement = fs_replacement.replace(fs_regx1,"\\");
      
       fs_regx1 = /\$/gi;
       fs_find = fs_find.replace(fs_regx1,"
    \\\$");
       fs_replacement = fs_replacement.replace(fs_regx1,"\$");        
       fs_regx1 = /\(/gi;
       fs_find = fs_find.replace(fs_regx1,"
    \\\(");
       fs_replacement = fs_replacement.replace(fs_regx1,"\(");        
       fs_regx1 = /\)/gi;
       fs_find = fs_find.replace(fs_regx1,"
    \\\)");
       fs_replacement = fs_replacement.replace(fs_regx1,"\)");        
       fs_regx1 = /\*/gi;
       fs_find = fs_find.replace(fs_regx1,"
    \\\*");
       fs_replacement = fs_replacement.replace(fs_regx1,"\*");        
       fs_regx1 = /\+/gi;
       fs_find = fs_find.replace(fs_regx1,"
    \\\+");
       fs_replacement = fs_replacement.replace(fs_regx1,"\+");
       fs_regx1 = /\./gi;
       fs_find = fs_find.replace(fs_regx1,"
    \\\.");
       fs_replacement = fs_replacement.replace(fs_regx1,"\.");
       fs_regx1 = /\[/gi;
       fs_find = fs_find.replace(fs_regx1,"
    \\\[");
       fs_replacement = fs_replacement.replace(fs_regx1,"\[");
       fs_regx1 = /\?/gi;
       fs_find = fs_find.replace(fs_regx1,"
    \\\?");
       fs_replacement = fs_replacement.replace(fs_regx1,"\?");
       fs_regx1 = /\^/gi;
       fs_find = fs_find.replace(fs_regx1,"
    \\\^");
       fs_replacement = fs_replacement.replace(fs_regx1,"\^");
       fs_regx1 = /\{/gi;
       fs_find = fs_find.replace(fs_regx1,"
    \\\{");
       fs_replacement = fs_replacement.replace(fs_regx1,"\{");
       fs_regx1 = /\|/gi;
       fs_find = fs_find.replace(fs_regx1,"
    \\\|");
       fs_replacement = fs_replacement.replace(fs_regx1,"\|");
       fs_find = "/" + fs_find + "/gi";

       //返回替换后的值
       return fs_expression.replace(eval(fs_find),fs_replacement);
    }

    /*Jun.14,2003--sundy
    字符串转换为数字(""-->0)as_type--str,num
    参数说明:as_str--转换的字符串
             ai_digit--转换的小数位数(null--不限制小数位数,0--转换为整型,>0按小数位数转换)
             as_type--转换后返回的类型(null,"num"--转换为数字类型,"str"--转换为字符串(按小数格式化后的字符串)
    例如:
    gf_str2float("10.2124568795")返回float类型10.2124568795
    gf_str2float("10.6",0)返回Int类型11(使用四舍五入的方法)
    gf_str2float("10.2",2)返回float类型10.1
    gf_str2float("10.2",2,"str")返回String类型"10.20"(按小数位数格式化字符串)
    gf_str2float("10.216",2)返回float类型10.22
    gf_str2float("10.216",2,"str")返回String类型"10.22"
    */
    function gf_str2float(as_str,ai_digit,as_type)
    {
       var fdb_tmp = 0;
       var fi_digit = 0;
       var fs_digit = "1";
       var fs_str = "" + as_str;
       var fs_tmp1 = "";
       var fs_tmp2 = "";
       var fi_pos = 0;
       var fi_len = 0;
       fdb_tmp = parseFloat(isNaN(parseFloat(fs_str))?0:fs_str);
      
       switch (true)
       {
          case (ai_digit==null)://不改变值,只转换为数字
             fdb_tmp = fdb_tmp;
             break;
          case (ai_digit==0)://取得整数
             fdb_tmp = Math.round(fdb_tmp);
             break;
          case (ai_digit>0)://按照传入的小数点位数四舍五入取值
             for (var i=0;i<ai_digit;i++) fs_digit +="0";
             fi_digit = parseInt(fs_digit);
             fdb_tmp = Math.round(fdb_tmp * fi_digit) / fi_digit;
             if (as_type=="str")
             {
                fs_tmp1 = fdb_tmp.toString();
                fs_tmp1 +=((fs_tmp1.indexOf(".")!=-1)?"":".") + fs_digit.substr(1);
                fi_pos = fs_tmp1.indexOf(".") + 1 + ai_digit;
                fdb_tmp = fs_tmp1.substr(0,fi_pos);
             }
             break;
       }
       return fdb_tmp;
    }

    //打印数据
    function gf_dgdprint(as_reportname,as_where,as_subtitle,as_footer)
    {  //打印datagrid  --sherry 2003-08-19
       /*
       as_reportname--报表格式名  不能为空
       as_where--where 提取条件,形如" From cod_Driver Where Corp ='本单位' 不能为空
       as_subtitle --表头小标题
       as_footer--表尾,
       */
       var fs_Rpt_Property="width=" + (screen.width - 10) + ",height=" + (screen.height - 55) + ",left=0,top=0";
     if (as_reportname==null) as_reportname="";
     if (as_where==null) as_where="";
     if (as_subtitle==null) as_subtitle="";
     if (as_footer==null) as_footer="";
     var S_Rpt_ReportName=escape(as_reportname) ;
     var S_Rpt_Where=escape(as_where) ;
     var S_Rpt_SubTitle=escape(as_subtitle) ;
     var S_Rpt_Footer=escape(as_footer) ;
     var fs_parm = "";
     fs_parm += "?S_Rpt_ReportName=" + S_Rpt_ReportName  ;
     fs_parm += "&S_Rpt_Where=" + S_Rpt_Where ;
     fs_parm += "&S_Rpt_SubTitle=" + S_Rpt_SubTitle ;
     fs_parm += "&S_Rpt_Footer=" + S_Rpt_Footer  ;
       window.open( "../SysPublic/sys_printer.aspx" + fs_parm,"sys_printer",fs_Rpt_Property );
    }

     

    经常用到的javaScript技术代码(经典)

    一、验证类
    1、数字验证内
    1.1 整数
    1.2 大于0的整数 (用于传来的ID的验证)
    1.3 负整数的验证
    1.4 整数不能大于iMax
    1.5 整数不能小于iMin
    2、时间类
    2.1 短时间,形如 (13:04:06)
    2.2 短日期,形如 (2003-12-05)
    2.3 长时间,形如 (2003-12-05 13:04:06)
    2.4 只有年和月。形如(2003-05,或者2003-5)
    2.5 只有小时和分钟,形如(12:03)
    3、表单类
    3.1 所有的表单的值都不能为空
    3.2 多行文本框的值不能为空。
    3.3 多行文本框的值不能超过sMaxStrleng
    3.4 多行文本框的值不能少于sMixStrleng
    3.5 判断单选框是否选择。
    3.6 判断复选框是否选择.
    3.7 复选框的全选,多选,全不选,反选
    3.8 文件上传过程中判断文件类型
    4、字符类
    4.1 判断字符全部由a-Z或者是A-Z的字字母组成
    4.2 判断字符由字母和数字组成。
    4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母
    4.4 字符串替换函数.Replace();
    5、浏览器类
    5.1 判断浏览器的类型
    5.2 判断ie的版本
    5.3 判断客户端的分辨率

    6、结合类
    6.1 email的判断。
    6.2 手机号码的验证
    6.3 身份证的验证


    二、功能类

    1、时间与相关控件类
    1.1 日历
    1.2 时间控件
    1.3 万年历
    1.4 显示动态显示时钟效果(文本,如OA中时间)
    1.5 显示动态显示时钟效果 (图像,像手表)
    2、表单类
    2.1 自动生成表单
    2.2 动态添加,修改,删除下拉框中的元素
    2.3 可以输入内容的下拉框
    2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字(多用于短信发送)

    3、打印类
    3.1 打印控件
    4、事件类
    4.1 屏蔽右键
    4.2 屏蔽所有功能键
    4.3 --> 和<-- F5 F11,F9,F1
    4.4 屏蔽组合键ctrl+N
    5、网页设计类
    5.1 连续滚动的文字,图片(注意是连续的,两段文字和图片中没有空白出现)
    5.2 html编辑控件类
    5.3 颜色选取框控件
    5.4 下拉菜单
    5.5 两层或多层次的下拉菜单
    5.6 仿IE菜单的按钮。(效果如rongshuxa.com的导航栏目)
    5.7 状态栏,title栏的动态效果(例子很多,可以研究一下)
    5.8 双击后,网页自动滚屏
    6、树型结构。
    6.1 asp+SQL版
    6.2 asp+xml+sql版
    6.3 java+sql或者java+sql+xml
    7、无边框效果的制作
    8、连动下拉框技术
    9、文本排序
    ---------------------------------------------------------------------------------------

    一、验证类
    1、数字验证内
    1.1 整数
    /^(-|\+)?\d+$/.test(str)
    1.2 大于0的整数 (用于传来的ID的验证)
    /^\d+$/.test(str)
    1.3 负整数的验证
    /^-\d+$/.test(str)
    2、时间类
    2.1 短时间,形如 (13:04:06)
    function isTime(str)
    {
    var a = str.match(/^(\d{1,2})(?(\d{1,2})\2(\d{1,2})$/);
    if (a == null) {alert('输入的参数不是时间格式'); return false;}
    if (a[1]>24 || a[3]>60 || a[4]>60)
    {
    alert("时间格式不对");
    return false
    }
    return true;
    }
    2.2 短日期,形如 (2003-12-05)
    function strDateTime(str)
    {
    var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
    if(r==null)return false;
    var d= new Date(r[1], r[3]-1, r[4]);
    return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
    }
    2.3 长时间,形如 (2003-12-05 13:04:06)
    function strDateTime(str)
    {
    var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2})\d{1,2})\d{1,2})$/;
    var r = str.match(reg);
    if(r==null)return false;
    var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);
    return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
    }
    2.4 只有年和月。形如(2003-05,或者2003-5)
    2.5 只有小时和分钟,形如(12:03)
    3、表单类
    3.1 所有的表单的值都不能为空

    3.2 多行文本框的值不能为空。
    3.3 多行文本框的值不能超过sMaxStrleng
    3.4 多行文本框的值不能少于sMixStrleng
    3.5 判断单选框是否选择。
    3.6 判断复选框是否选择.
    3.7 复选框的全选,多选,全不选,反选
    3.8 文件上传过程中判断文件类型
    4、字符类
    4.1 判断字符全部由a-Z或者是A-Z的字字母组成

    4.2 判断字符由字母和数字组成。

    4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母
    /^([a-zA-z_]{1})([\w]*)$/g.test(str)
    4.4 字符串替换函数.Replace();
    5、浏览器类
    5.1 判断浏览器的类型
    window.navigator.appName
    5.2 判断ie的版本
    window.navigator.appVersion
    5.3 判断客户端的分辨率
    window.screen.height; window.screen.width;

    6、结合类
    6.1 email的判断。
    function ismail(mail)
    {
    return(new RegExp(/^\w+((-\w+)|(\.\w+))*\-AT-[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(mail));
    }
    6.2 手机号码的验证
    6.3 身份证的验证
    function isIdCardNo(num)
    {
    if (isNaN(num)) {alert("输入的不是数字!"); return false;}
    var len = num.length, re;
    if (len == 15)
    re = new RegExp(/^(\d{6})()?(\d{2})(\d{2})(\d{2})(\d{3})$/);
    else if (len == 18)
    re = new RegExp(/^(\d{6})()?(\d{4})(\d{2})(\d{2})(\d{3})(\d)$/);
    else {alert("输入的数字位数不对!"); return false;}
    var a = num.match(re);
    if (a != null)
    {
    if (len==15)
    {
    var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);
    var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
    }
    else
    {
    var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);
    var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
    }
    if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对!"); return false;}
    }
    return true;
    }
    -------------------------------------------------------------------------------------

    3.7 复选框的全选,多选,全不选,反选

    全选


    全选

    function checkAll(str)
    {
    var a = document.getElementsByName(str);
    var n = a.length;
    for (var i=0; ia[i].checked = window.event.srcElement.checked;
    }
    function checkItem(str)
    {
    var e = window.event.srcElement;
    var all = eval("document.hrong."+ str);
    if (e.checked)
    {
    var a = document.getElementsByName(e.name);
    all.checked = true;
    for (var i=0; i{
    if (!a[i].checked){ all.checked = false; break;}
    }
    }
    else all.checked = false;
    }


    3.8 文件上传过程中判断文件类型


    -------------------------------------------------------------------------------------
    1.身份证严格验证:

    2.验证IP地址

    function isip(s){
    var check=function(v){try{return (v<=255 && v>=0)}catch(x){return false}};
    var re=s.split(".")
    return (re.length==4)?(check(re[0]) && check(re[1]) && check(re[2]) && check(re[3])):false
    }

    var s="202.197.78.129";
    alert(isip(s))

    3.加sp1后还能用的无边框窗口!!


    /*--- Special Thanks For andot ---*/

    /*
    This following code are designed and writen by Windy_sk
    You can use it freely, but u must held all the copyright items!
    /

    /- Thanks For andot Again ---*/

    var CW_width = 400;
    var CW_height = 300;
    var CW_top = 100;
    var CW_left = 100;
    var CW_url = "/";
    var New_CW = window.createPopup();
    var CW_Body = New_CW.document.body;
    var content = "";
    var CSStext = "margin:1px;color:black; border:2px outset;border-style:expression(onmouseout=onmouseup=function(){this.style.borderStyle='outset'}, onmousedown=function(){if(event.button!=2)this.style.borderStyle='inset'});background-color:buttonface;width:16px;height:14px;font-size:12px;line-height:11px;cursor:Default;";

    //Build Window
    include.startDownload(CW_url, function(source){content=source});

    function insert_content(){
    var temp = "";
    CW_Body.style.overflow = "hidden";
    CW_Body.style.backgroundColor = "white";
    CW_Body.style.border = "solid black 1px";
    content = content.replace(/]*)>/g,"");
    temp += "";
    temp += "";
    temp += "Chromeless Window For IE6 SP1";
    temp += "";
    temp += "?";
    temp += "0";
    temp += "1";
    temp += "x";
    temp += "";
    temp += "";
    temp += content;
    temp += "

    ";
    temp += "";
    CW_Body.innerHTML = temp;
    }

    setTimeout("insert_content()",1000);

    var if_max = true;
    function show_CW(){
    window.moveTo(10000, 10000);
    if(if_max){
    New_CW.show(CW_top, CW_left, CW_width, CW_height);
    if(typeof(New_CW.document.all.include)!="undefined"){
    New_CW.document.all.include.style.width = CW_width;
    New_CW.document.all.Max.innerText = "1";
    }

    }else{
    New_CW.show(0, 0, screen.width, screen.height);
    New_CW.document.all.include.style.width = screen.width;
    }
    }

    window.onfocus = show_CW;
    window.onresize = show_CW;

    // Move Window
    var drag_x,drag_y,draging=false

    function drag_move(e){
    if (draging){
    New_CW.show(e.screenX-drag_x, e.screenY-drag_y, CW_width, CW_height);
    return false;
    }
    }

    function drag_down(e){
    if(e.button==2)return;
    if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height)return;
    drag_x=e.clientX;
    drag_y=e.clientY;
    draging=true;
    e.srcElement.setCapture();
    }

    function drag_up(e){
    draging=false;
    e.srcElement.releaseCapture();
    if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height) return;
    CW_top = e.screenX-drag_x;
    CW_left = e.screenY-drag_y;
    }


     
    电话号码的验证

    要求:
      (1)电话号码由数字、"("、")"和"-"构成
      (2)电话号码为3到8位
      (3)如果电话号码中包含有区号,那么区号为三位或四位
      (4)区号用"("、")"或"-"和其他部分隔开
      (5)移动电话号码为11或12位,如果为12位,那么第一位为0
      (6)11位移动电话号码的第一位和第二位为"13"
      (7)12位移动电话号码的第二位和第三位为"13"
      根据这几条规则,可以与出以下正则表达式:
      (^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)

    function PhoneCheck(s) {
    var str=s;
    var reg=/(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/
    alert(reg.test(str));
    }

    --------------------------------------------------------------------------------------


    ---------------------------------------------------------------------------------

    //检验法人代码
    function isCorporationCode(s){
    var patrn=/^(\d){15}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串
    function isRegisterUserName(s)
    {
    var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    //校验用户姓名:只能输入1-30个以字母开头的字串
    function isTrueName(s)
    {
    var patrn=/^[^`~!@#$%^&*()+-=|\\\[\]\{\}:;\'\,.<>/? 0-9]{2,19}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验密码:只能输入6-15个字母、数字
    function isPasswd(s)
    {
    var patrn=/^[a-zA-Z0-9]{6,15}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //检验体重
    function isAvoirdupois(s)
    {
    var patrn=/^[1-9]{1}[0-9]{0,2}$/;
    var patrn2=/^[1-9]{1}$/;
    var intPart=s.indexOf('.');
    var decPart=s.lastIndexOf('.');
    if (intPart==-1 && patrn.exec(s) && eval(s)>=2 && eval(s)<=200) return true
    if (intPart!=decPart || intPart==0 || intPart+2!=s.length) return false
    if (!patrn.exec(s.substring(0,intPart)) || !patrn2.exec(s.substring(decPart+1))) return false
    if (eval(s)<2 || eval(s)>200) return false
    return true
    }

    //校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”
    function isTel(s)
    {
    var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验手机号码:必须以数字开头,除数字外,可含有“-”
    function isMobile(s)
    {
    var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验地区代码
    function isAreaCode(s)
    {
    var patrn=/^(\d){6}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验邮政编码
    function isPostalCode(s)
    {
    var patrn=/^[1-9]{1}(\d){5}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验搜索关键字
    function isSearch(s)
    {
    var patrn=/^[^`~!@#$%^&*()+=|\\\[\]\{\}:;\'\,.<>/? ]{1}[^`~!@$%^&()+=|\\\[\]\{\}:;\'\,.<>?]{0,19}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验是否为ip地址
    function isIP(s)
    {
    var patrn=/^[0-9.]{1,20}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //检验页码是否正确
    function isPage(s)
    {
    var patrn=/^[1-9]{1}[0-9]{0,2}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //表单输入值错误提示
    function vErr(o,s){
    alert(s);
    if (o) o.focus();
    return false;
    }

    //判断单选
    function chkRadio(o){
    for (i=0;iif (o[i].checked) return true;
    }
    return false;
    }
    //====================================表单类================================
    // 文件上传过程中判断文件类型
    /*

    /

    //表单的值不能为空
    function isNull(elem){
    //var pattern=/^\s+|\s+$/;
    if(elem.replace(/(^\s+|\s$)/g, "")==""){
    return false;
    }else{
    return true;
    }
    }
    //不能超过imax字符
    function imax(elem){
    if(elem.length>imax){
    return false;
    }else{
    return true;
    }
    }
    //不能少于imix字符
    function imix(elem){
    if(elem.lengthreturn false;
    }else{
    return true;
    }
    }
    //输入为中文判断
    function isChinese(elem){
    var pattern=/[^\x00-\xff]/g;
    if(pattern.test(elem)){
    //包含中文
    return false;
    }else{
    //不包含中文
    return true;
    }
    }

    / *********************************************************************************************************************

    .cMenu {
    FILTER: alpha(opacity=0);BACKGROUND-COLOR: #D6D3CE;BORDER-BOTTOM: #666666 2px solid; BORDER-LEFT: #E4E4E4 2px solid; BORDER-RIGHT: #666666 2px solid; BORDER-TOP: #E4E4E4 2px solid; COLOR: #000000; CURSOR: default; FONT-SIZE: 9pt; color:#000000;FONT-WEIGHT: normal; LINE-HEIGHT: 20px; POSITION: absolute; VISIBILITY: hidden; WIDTH: 110px
    }
    .menuitems {
    font-size:9pt;
    MARGIN: 2px;
    PADDING-BOTTOM: 0px;
    PADDING-LEFT: 15px;
    PADDING-RIGHT: 3px;
    PADDING-TOP: 0px;
    }

    <!--[if IE]>
    onmouseover=highlightie5()>

    电话号码的验证

    要求:
      (1)电话号码由数字、"("、")"和"-"构成
      (2)电话号码为3到8位
      (3)如果电话号码中包含有区号,那么区号为三位或四位
      (4)区号用"("、")"或"-"和其他部分隔开
      (5)移动电话号码为11或12位,如果为12位,那么第一位为0
      (6)11位移动电话号码的第一位和第二位为"13"
      (7)12位移动电话号码的第二位和第三位为"13"
      根据这几条规则,可以与出以下正则表达式:
      (^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)


    <script language="javascript">
    function PhoneCheck(s) {
    var str=s;
    var reg=/(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/
    alert(reg.test(str));
    }
    </script>
    <input type=text name="iphone">
    <input type=button onclick="PhoneCheck(document.all.iphone.value)" value="Check">
    ----------------------------------------------------------------------------------------

    <%
    '********************************************
    '函数功能:正则表达式校验
    '参数patrn:要校验的类型
    ' "User" - 用户名
    ' "Truename" - 英文姓名
    ' "Passwd" - 密码
    ' "Tel" - 电话/传真
    ' "Mobil" - 手机
    ' "Date" - 日期(格式:yyyy-mm-dd)
    ' "Email" - 电子邮件
    ' "Postalcode" - 邮政编码
    ' "Search" - 搜索关键字
    ' "Int" - 整数
    '参数strng:要校验的字串
    '返回值:校验结果,正确返回true,错误返回false
    '********************************************
    Function IsVerify(patrn,strng)
    strng=Trim(strng)
    Select Case patrn
    Case "User" '用户名
    patrn="^[a-z]{1}([a-z0-9]|[._]){2,19}$"
    Case "Truename" '英文姓名
    patrn="^[a-zA-Z]{1,30}$"
    Case "Passwd" '密码
    patrn="^(\w){6,20}$"
    Case "Tel" '电话/传真
    patrn="^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$"
    Case "Mobil" '手机
    patrn="^(\d)+[-]?(\d){6,12}$"
    Case "Date" '日期(格式:yyyy-mm-dd)
    patrn="^[12]{1}(\d){3}[-][01]?(\d){1}[-][0123]?(\d){1}$"
    Case "Email" '电子邮件
    patrn="^((\w)|[-]|[.])+@(((\w)|[-])+[.])+[a-z]{2,4}$"
    Case "Postalcode" '邮政编码
    patrn="^[a-z0-9 ]{3,12}$"
    Case "Search" '搜索关键字
    patrn="^[^`~!@#$%^&*()+=|\\\[\]\{\}:;\'\,.<>/?]{1}[^`~!@$%^&()+=|\\\[\]\{\}:;\'\,.<>?]{0,19}$"
    Case "Int" '整数
    patrn="^[1-9]{1}[0-9]{0,6}$"
    Case "Array"
    patrn="^[0-9]{1}([0-9]|[\,]){0,150}$"
    End Select
    Dim regEx
    Dim Match
    Set regEx = New RegExp
    regEx.Pattern = patrn
    regEx.IgnoreCase = True
    regEx.Global = True
    Matches = regEx.test(strng)
    IsVerify = Matches
    Set regEx = Nothing
    End Function

    '********************************************
    '函数功能:对输入框的特殊字串进行过滤保存
    '参数strPass:过滤前的字符串
    '返回值:过滤后的字符串
    '********************************************
    Function SQLencode(byVal strPass)
    strPass = Replace(strPass, "&", "&")
    strPass = Replace(strPass, "<", "<")
    strPass = Replace(strPass, ">", ">")
    strPass = Replace(strPass, """", """)
    strPass = Replace(strPass, "'", "'")
    strPass = Replace(strPass, " ", " ")
    strPass = Replace(strPass,chr(13)&chr(10),"<br/>")
    SQLencode = strPass
    End Function

    '********************************************
    '函数功能:对SQLencode函数过滤后的字符串进行还原
    '参数strPass:经过过滤后的字符串
    '返回值:还原的过滤前的字符串
    '********************************************
    Function SQLdecode(byVal strPass)
    If Not isNull(strPass) Then
    strPass = Replace(strPass, "<", "<")
    strPass = Replace(strPass, ">", ">")
    strPass = Replace(strPass, ""","""" )
    strPass = Replace(strPass, "'","'" )
    strPass = Replace(strPass,"<br/>",chr(13)&chr(10))
    End If
    SQLdecode = strPass
    End Function

    '********************************************
    '函数功能:生成随机密码(字符为数字与大小写字母集合)
    '参数length:密码长度
    '返回值:随机密码
    '********************************************
    Function random(length)
    Dim n,str
    rnds=""
    Randomize
    For i=1 To length
    n=Int(75*Rnd+48)
    If (n>57 and n<65) Or (n>90 and n<97) Then
    i=i-1
    Else
    rnds=rnds&Chr(n)
    End If
    Next
    random=rnds
    End Function

    '********************************************
    '函数功能:对密码进行加密/解密(最大长度为15位)
    '********************************************
    Function Encrypt(preString)
    Dim pwds,s
    pwds=""
    s=Left(preString,15)
    For i=1 To Len(s)
    seed=170-Asc(Mid(s,i,1))-i
    pwds=pwds & Chr(seed)
    Next
    Encrypt=pwds
    End Function

    '********************************************
    '函数功能:格式化当前时间字串
    '参数:无
    '返回值:返回当前时间的纯数字字符串方式的表示(例如:当前时间2001-10-3 2:34:6,返回字符串"20011003023406")
    '********************************************
    Function TheDate()
    y=year(date())
    m=month(date())
    d=day(date())
    h=Hour(time())
    n=Minute(time())
    s=Second(time())
    If Len(m)=1 Then m="0"&m
    If Len(d)=1 Then d="0"&d
    If Len(h)=1 Then h="0"&h
    If Len(n)=1 Then n="0"&n
    If Len(s)=1 Then s="0"&s
    thedate=y&m&d&h&n&s
    End Function

    '********************************************
    '函数功能:返回字符串的长度
    '参数:字符串
    '返回值:字符串长度
    '********************************************
    Function strLen(str)
    dim p_len
    p_len=0
    strlen=0
    if trim(str)<>"" then
    p_len=len(trim(str))
    for xx=1 to p_len
    if asc(mid(str,xx,1))<0 then
    strlen=int(strlen) + 2
    else
    strlen=int(strlen) + 1
    end if
    next
    end if
    End Function

    '********************************************
    '函数功能:发送邮件通知
    '参数:字符串
    '返回值:成功/失败
    '********************************************
    Function SendMail(ToAddress, Subject, Body)
    On Error Resume Next
    Set objMail = Server.CreateObject("JMail.Message")
    objMail.From = ADR_Email
    objMail.FromName = "ADR管理中心"
    objMail.Subject = Subject
    objMail.AddRecipient ToAddress
    objMail.Body = Body
    If objMail.Send("") Then
    SendMail = True
    Else
    SendMail = False
    End If
    If Err.Number<> 0 Then SendMail = False
    Set objMail = Nothing
    On Error Goto 0
    End Function
    %>
    -----------------------------------------------------------------------------------

    //检验法人代码
    function isCorporationCode(s){
    var patrn=/^(\d){15}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串
    function isRegisterUserName(s)
    {
    var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$/;
    if (!patrn.exec(s)) return false
    return true
    }
    //校验用户姓名:只能输入1-30个以字母开头的字串
    function isTrueName(s)
    {
    var patrn=/^[^`~!@#$%^&*()+-=|\\\[\]\{\}:;\'\,.<>/? 0-9]{2,19}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验密码:只能输入6-15个字母、数字
    function isPasswd(s)
    {
    var patrn=/^[a-zA-Z0-9]{6,15}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //检验体重
    function isAvoirdupois(s)
    {
    var patrn=/^[1-9]{1}[0-9]{0,2}$/;
    var patrn2=/^[1-9]{1}$/;
    var intPart=s.indexOf('.');
    var decPart=s.lastIndexOf('.');
    if (intPart==-1 && patrn.exec(s) && eval(s)>=2 && eval(s)<=200) return true
    if (intPart!=decPart || intPart==0 || intPart+2!=s.length) return false
    if (!patrn.exec(s.substring(0,intPart)) || !patrn2.exec(s.substring(decPart+1))) return false
    if (eval(s)<2 || eval(s)>200) return false
    return true
    }

    //校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”
    function isTel(s)
    {
    var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验手机号码:必须以数字开头,除数字外,可含有“-”
    function isMobile(s)
    {
    var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验地区代码
    function isAreaCode(s)
    {
    var patrn=/^(\d){6}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验邮政编码
    function isPostalCode(s)
    {
    var patrn=/^[1-9]{1}(\d){5}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验搜索关键字
    function isSearch(s)
    {
    var patrn=/^[^`~!@#$%^&*()+=|\\\[\]\{\}:;\'\,.<>/? ]{1}[^`~!@$%^&()+=|\\\[\]\{\}:;\'\,.<>?]{0,19}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //校验是否为ip地址
    function isIP(s)
    {
    var patrn=/^[0-9.]{1,20}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //检验页码是否正确
    function isPage(s)
    {
    var patrn=/^[1-9]{1}[0-9]{0,2}$/;
    if (!patrn.exec(s)) return false
    return true
    }

    //表单输入值错误提示
    function vErr(o,s){
    alert(s);
    if (o) o.focus();
    return false;
    }

    //判断单选
    function chkRadio(o){
    for (i=0;i<o.length;i++){
    if (o[i].checked) return true;
    }
    return false;
    }



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=532132

    java实现FTP功能(源代码)2

    GBC.gridwidth=1; 
    ((GridBagLayout)getLayout()).setConstraints(LblHost,GBC); 
    add(LblHost); 
    GBC.gridwidth=GridBagConstraints.REMAINDER; 
    ((GridBagLayout)getLayout()).setConstraints(TxtHost,GBC); 
    add(TxtHost); 

    GBC.gridwidth=1; 
    ((GridBagLayout)getLayout()).setConstraints(LblUID,GBC); 
    add(LblUID); 
    GBC.gridwidth=1; 
    ((GridBagLayout)getLayout()).setConstraints(TxtUID,GBC); 
    add(TxtUID); 

    GBC.gridwidth=1; 
    ((GridBagLayout)getLayout()).setConstraints(LblPWD,GBC); 
    add(LblPWD); 
    GBC.gridwidth=1; 
    ((GridBagLayout)getLayout()).setConstraints(TxtPWD,GBC); 
    add(TxtPWD); 

    GBC.gridwidth=1; 
    GBC.weightx=2; 
    ((GridBagLayout)getLayout()).setConstraints(BtnConn,GBC); 
    add(BtnConn); 
    GBC.gridwidth=GridBagConstraints.REMAINDER; 

    ((GridBagLayout)getLayout()).setConstraints(BtnClose,GBC); 
    add(BtnClose); 

    GBC.gridwidth=GridBagConstraints.REMAINDER; 
    GBC.fill     = GridBagConstraints.HORIZONTAL; 
    ((GridBagLayout)getLayout()).setConstraints(lsArea,GBC); 
    add(lsArea); 
            } 

    public boolean connect(String hostname, String uid,String pwd) 

                    this.hostname = hostname; 
    LblPrompt.setText("正在连接,请等待....."); 
    try{ 
      aftp =new FtpClient(hostname); 
      aftp.login(uid,pwd); 
      aftp.binary(); 
      showFileContents(); 

    catch(FtpLoginException e){ 
    a="无权限与主机:"+hostname+"连接!"; 
    LblPrompt.setText(a); 
    return false; 

    catch (IOException e){ 
    a="连接主机:"+hostname+"失败!"; 
    LblPrompt.setText(a); 
    return false; 

    catch(SecurityException e) 

    a="无权限与主机:"+hostname+"连接!"; 
    LblPrompt.setText(a); 
    return false; 

    LblPrompt.setText("连接主机:"+hostname+"成功!"); 
    return true; 


    public void stop() 

    try 

    aftp.closeServer(); 

    catch(IOException e) 




    public void paint(Graphics g){ 
    }

    java实现FTP功能(源代码)1

    import sun.net.ftp.*; 
    import sun.net.*; 
    import java.awt.*; 
    import java.awt.event.*; 
    import java.applet.*; 
    import java.io.*; 

    public class FtpApplet extends Applet 

    FtpClient aftp; 
    DataOutputStream outputs ; 
    TelnetInputStream ins; 
    TelnetOutputStream outs; 
    TextArea lsArea; 
    Label    LblPrompt; 
    Button   BtnConn; 
    Button   BtnClose; 
    TextField  TxtUID; 
    TextField  TxtPWD; 
    TextField  TxtHost; 
    int ch; 
    public String a="没有连接主机"; 
            String hostname=""; 
    public void init () { 
    setBackground(Color.white); 
    setLayout(new GridBagLayout()); 
    GridBagConstraints GBC = new GridBagConstraints(); 
    LblPrompt = new Label("没有连接主机"); 
    LblPrompt.setAlignment(Label.LEFT); 

    BtnConn = new Button("连接"); 
    BtnClose = new Button("断开"); 
    BtnClose.enable(false); 
    TxtUID = new TextField("",15); 
    TxtPWD = new TextField("",15); 
    TxtPWD.setEchoCharacter(’*’); 
    TxtHost = new TextField("",20); 
    Label LblUID = new Label("User ID:"); 
    Label LblPWD = new Label("PWD:"); 
    Label LblHost = new Label("Host:"); 

    lsArea = new TextArea(30,80); 
    lsArea.setEditable(false); 

    GBC.gridwidth= GridBagConstraints.REMAINDER; 
    GBC.fill     = GridBagConstraints.HORIZONTAL; 
    ((GridBagLayout)getLayout()).setConstraints(LblPrompt,GBC); 
    add(LblPrompt);

    用Visual Basic创建FTP组件

    何为FTP?


      文件传输协议(FTP)是IP世界的核心协议,网络管理人员,Web 开发人员,以及那些想要恢复他们的祖先照片的人天天都在使用它。但是对于ASP开发人员来说,如果没有第三方服务器组件提供这一功能的话,FTP功能就不存在。



      猜猜看会怎么样?Microsoft的开发人员已经在WinINet.DLL中为我们提供了FTP功能。这个DLL是与Internet Explorer 和其它一些内容集成在一起的,处理有关FTP协议的低级任务。我们所需要做的是将一些提供的功能集合起来以便ASP代码调用方便。



      听起来这是一个将我们的Visual Basic技巧用于实际的好机会。

    来自朋友的一点帮助
      对于那些从来没有使用VB编写过ActiveX 组件的人来说,在网上有许多可用的资源。就在15 Seconds上有许多文章可以参考。COM for ASP Programmers

    ( http://www.15seconds.com/Issue/971214.htm) 覆盖了创建组件的一些基本技巧,如果你对此是个新手的话,这篇文章一定要读。Creating a Server Component with Visual Basic

    ( http://www.15seconds.com/issue/98930.htm ) 引导你走过创建组件的所有步骤。

      上面已经提到,Microsoft在WinINet.DLL中为我们提供了FTP功能。WinINet API 的说明文件位于http://msdn.microsoft.com/developer/sdk/inetsdk/help/itt/wininet/wininet.htm#book_wininet。同大多数API说明文件一样,这个文件也是针对C++ 编程人员的。但是如果你不理解C++ 或是很容易对这些API说明文件的说教感到厌烦,还继续读下去吗?

    一步步地来
      现在开始,对于FTP.MICROSOFT.COM的文件DIRMAP.TXT执行一个FTP GET命令,并将文件存储为C:\DIRMAP.TXT。基本步骤是:



    1、用一个InternetOpen调用设置环境。

    2、调用InternetConnect 函数与主机连接。

    3、调用FtpGetFile 达到文件。

    4、关闭第1、2步创建的句柄,用InternetCloseHandle 函数。

    现在来仔细看看每一步:
    1、通过调用InternetOpen 函数设置环境。下面是VB特定调用这一函数的声明:



    Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _

      (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _

      ByVal sProxyBypass As String, ByVal lFlags As Long) As Long



      参数sAgent 用来指定调用WinINet 函数的应用程序或实体。为了达到目的,可以设置FTP控制。



      参数lAccessType 指定我们是直接与某一主机相连还是使用代理服务器相连。如果传递值1,就直接与主机连接。如果传递3,就通过代理服务器。如果传递0,连接时就要基于

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings下的注册表数值

    ProxyEnable、ProxyServer和 ProxyOverride 。



      我们可以使用参数sProxyName和 sProxyBypass,而不是注册设置来提供代理服务器和不使用代理服务器的IP地址和名字。列出代理的基本格式是rotocol=protocol://proxy_name:access_port?。例如,要指定Proxy1 上的端口21为代理服务器,用Ftp=ftp://Proxy1:21?作为sProxyName。要饶过以ov? 开始的任何主机,sProxyBypass 字符串应为ov*? 。



      最后,lFlags 用来显示影响函数结果的不同选择。在我们的例子中,我们传递0。

      所以,不使用代理而打开一个Internet session 时,我们的调用是这样的:

    lngINet = InternetOpen(揗yFTP Control? 1, vbNullString, vbNullString, 0)

      如果函数调用失败,lngINet 为0。不然,lngINet 就保存在下一步中将要传递给InternetConnect

    函数的句柄的值。

    2、通过调用InternetConnect 函数与主机连接。VB特定调用这一函数的声明是:

    Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" _

      (ByVal hInternetSession As Long, ByVal sServerName As String, _

      ByVal nServerPort As Integer, ByVal sUsername As String, _

      ByVal sPassword As String, ByVal lService As Long, _

      ByVal lFlags As Long, ByVal lContext As Long) As Long



      第一个参数hInternetSession 是InternetOpen 调用返回的句柄值。

      sServerName 是我们即将连接的FTP服务器的IP地址或主机名。

      nServerPort 指示与哪一个端口连接。在我们的例子中使用的值为0,它指示的是默认的端口21。

      sUsername 和 sPassword 分别传递用户名和口令。

      lService 用来指示使用的服务类型,如HTTP, FTP等。通常传递值为1,表示FTP服务。

      如果将x8000000传递到 lFlags 参数,连接将使用被动FTP语义。或者,在我们的例子中,传递0来使用非被动语义。



      最后,当使用回叫信号时,lContext 用来识别应用程序的前后关系。因为在我们的例子中不使用回叫信号,所以这个值为0。



      现在使用匿名的电子邮件用户名与主机FTP.MICROSOFT.COM 相连接:

    lngINetConn = InternetConnect(lngINet, ftp.microsoft.com, 0, _

      揳anonymous,ally@wallyworld.com, 1, 0, 0)



      如果函数调用失败,则lngINetConn 为0。反之,lngINetConn 就保存在下一步中将传递给FtpGetFile 的句柄的值。



    3、现在我们已经实现了连接,然后就需要调用FtpGetFile 。这个函数完成从一个FTP服务器上读取文件并在本地存储时有关的所有管理功能。VB特定调用这一函数的声明是:



    Private Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" _

      (ByVal hFtpSession As Long, ByVal lpszRemoteFile As String, _

      ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, _

      ByVal dwFlagsAndAttributes As Long, ByVal dwFlags As Long, _

      ByVal dwContext As Long) As Boolean



      第一个参数hFtpSession 是InternetConnect 调用返回的句柄值。

      lpszRemoteFile和lpszNewFile 分别是FTP服务器上的文件名和将在本地机上创建的文件名。

      fFailIfExists 标志是0(替换本地文件)或1 (如果本地文件已经存在则取消)。

      dwFlagsAndAttributes 用来指定本地文件的文件属性。在我们的例子中忽略,只传递0。

      dwFlags 参数指定为1是用ASCII 传输文件(A类传输方法),指定为2是用二进制传输文件(1类传输方法)。由于DIRMAP.TXT 是ASCII 文本文件,我们传递值1。

      最后,当使用回叫信号时,lContext 用来识别应用程序前后关系。因为在我们的例子中不使用回叫信号,所以这个值为0。

      所以,以下是得到DIRMAP.TXT文件并将其存在 C:\DIRMAP.TXT的调用。如果本地文件已经存在,就覆盖它。

    blnRC = FtpGetFile(lngINetConn, dirmap.txt,c:\dirmap.txt, 0, 0, 1, 0)

      如果函数调用成功,blnRC为 True, 反之为False。

    4、现在文件已经被接收,使用InternetCloseHandle 调用来关闭连接和session 句柄。VB特定调用这一函数的声明是:



    Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer.



      如同指明的一样,此函数只有一个参数hInet,是要关闭或抛弃的句柄的值。因为InternetConnection 和InternetOpen 中有句柄,就需要调用这个关闭函数两次。另外因为InternetConnection 句柄是由InternetOpen 句柄决定的,关闭他们时的顺序与创建时相反。

      以下是调用函数:

    InternetCloseHandle lngINetConn

    InternetCloseHandle lngINet



      恭喜!用这短短的四步就完成了FTP GET。



    接下来

      在FTP中,Put、Rename、 Delete是怎样的?这些函数也相当简单。首先来看看Put 函数。



      基本步骤是:



    1、调用InternetOpen函数设置环境。

    2、调用InternetConnect 函数连接主机。

    3、调用FtpPutFile 函数得到文件。

    4、用InternetCloseHandle 函数关闭第1、2步的句柄。



      当使用FtpGetFile 时与上面的步骤看起来完全一样。事实上唯一的区别是在第3步中调用了FtpPutFile 。VB特定调用这一函数的声明是:



    Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" _

      (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, _

      ByVal lpszRemoteFile As String, ByVal dwFlags As Long, _

      ByVal dwContext As Long) As Boolean



      第一个参数hFtpSession 是InternetConnect 调用返回的句柄值。

      lpszNewFile 和lpszRemoteFile 分别是本地机上的文件名和将在远程主机上创建的文件名。

      参数dwFlags 指定为1时,用ASCII 传输文件(A类传输方法),指定为2是用二进制传输文件(1类传输方法)。由于DIRMAP.TXT 是ASCII 文本文件,我们传递值1。

      最后,当使用回叫信号时,lContext 用来识别应用程序前后关系。因为在我们的例子中不使用回叫信号,所以这个值为0。

      以下是得到DIRMAP.TXT文件并将其存在 C:\DIRMAP.TXT的调用。

    blnRC = FtpPutFile(lngINetConn, 揷:\dirmap.txt? 揹irmap.txt? 1, 0)

      如果函数调用成功,blnRC为 True, 反之为False。

      你可以看到,把文件放到FTP服务器上与从FTP服务器上得到文件一样简单。有一点要注意,匿名用户无权在FTP服务器上创建文件。所以要确定用来与FTP服务器连接的用户帐号要有创建文件的权限。不然的话,FtpPutFile函数调用就会返回False,说明Put 失败了。

      现在我们用FtpDeleteFile 函数删除一个名为Test.txt的文件。同样只有第三步中的函数调用发生了改变。VB特定调用这一函数的声明是:



    Private Declare Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" _

      (ByVal hFtpSession As Long, ByVal lpszFileName As String) As Boolean

      第一个参数hFtpSession 是InternetConnect 调用返回的句柄值。

      lpszFileName 是FTP服务器上要删除的文件。

      下面是在FTP服务器上删除TEST.TXT 文件的调用:

    blnRC = FtpDeleteFile(lngINetConn, Test.txt)

      如果函数调用成功,blnRC为 True, 反之为False。

    要注意什么?
      几乎所有的FTP函数都一样:设置环境,连接主机,执行FTP任务,清除。但是也有例外。如何得到一个路径列表或者得到文件之前读文件的内容?这些类型的FTP任务只是有一点点复杂。首先看看路径列表问题。

      列举路径的基本步骤也是一样的。首先还是要设置环境,连接FTP服务器。结束之后还是要清楚连接和句柄。为了实际得到路径内容,需要使用两个新函数:FtpFindFirstFile 和InternetFindNextFile。VB特定调用这一函数的声明是:

    Private Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _

      (ByVal hFtpSession As Long, ByVal lpszSearchFile As String, _

      lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, _

      ByVal dwContent As Long) As Long



      第一个参数hFtpSession 是InternetConnect 调用返回的句柄值。

      lpszSearchFile 是FTP服务器上的路径或文件名。如果你指定了一个空字符,就使用当前路径。另外还可以指定通配符。例如,要列出以ms开始的根目录下的路径内容,就使用ms*? 。

      lpFindFileData 与我们使用的其它参数有一点不同。数据类型WIN32_FIND_DATA 是用户定义类型,保存关于路径下的文件的信息。类型看起来是这样的:

    Private Type WIN32_FIND_DATA

        dwFileAttributes As Long

        ftCreationTime As FILETIME

        ftLastAccessTime As FILETIME

        ftLastWriteTime As FILETIME

        nFileSizeHigh As Long

        nFileSizeLow As Long

        dwReserved0 As Long

        dwReserved1 As Long

        cFileName As String * MAX_PATH

        cAlternate As String * 14

    End Type



      注意,有许多参数有不同的用户定义数据类型:FILETIME。下面是它们的类型定义:

    Private Type FILETIME

        dwLowDateTime As Long

        dwHighDateTime As Long

    End Type

      在我们的例子中,只使用dwFileAttributes的内容,其中包含文件的属性,还有cFileName,其中包含文件名。

      最后,我们的例子不使用dwFlags 和 dsContext ,所以每个都传递0。

      下面在当前路径下开始路径列举的调用:

    lngHINet = FtpFindFirstFile(lngINetConn, "*.*", pData, 0, 0)

      如果函数失败,就返回0。否则,用来继续进行路径列举的lngHInet 是一个有效句柄。另外,第一个文件名和属性储存在pData 参数中。

      一旦调用了FtpFindFirstFile 并返回一个有效句柄,我们要调用InternetFindNextFile 函数除非它返回错误值18表示没有可以列举的文件。对InternetFindNextFile的VB特定声明是:

    Private Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" _

      (ByVal hFind As Long, lpvFindData As WIN32_FIND_DATA) As Long

      第一个参数,hFind 是 FtpFindFirstFile 调用所返回的句柄。

      lpvFindData 是同样的用户定义类型,用在FtpFindFirstFile 调用中存储文件信息。

      下面是在路径中得到下一个文件的调用:

    blnRC = InternetFindNextFile(lngHINet, pData)

      如果调用成功,blnRC 返回 True,否则 blnRC 为False。Err对象的LastDllError返回18表明再没有文件存在了。

      现在再回来看看基本的四步:第1步和第2步(设置环境和连接服务器)应该已经完成。以下列出的第三步。最后一步,第四步,就清除环境和连接句柄,跟前面一样:

    Dim pData As WIN32_FIND_DATA

    Dim lngHINet As Long

    Dim intError As Integer

    Dim strTemp As String

    Dim blnRC As Boolean



    'init the filename buffer

    pData.cFileName = String(260, 0)



    'get the first file in the directory...

    lngHINet = FtpFindFirstFile(mlngINetConn, "*.*", pData, 0, 0)



    'how'd we do?

    If lngHINet = 0 Then

      'get the error from the findfirst call

      intError = Err.LastDllError

      

      'is the directory empty?

      If intError < > ERROR_NO_MORE_FILES Then

        'whoa...a real error

        卐rror handler?

      End If

      

    Else

      

      'we got some dir info...

      'get the name

      strTemp = Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)



      卻tore the file info someplace?

          

      'now loop through the rest of the files...

      Do

        'init the filename buffer

        pData.cFileName = String(260, 0)

        

        'get the next item

        blnRC = InternetFindNextFile(lngHINet, pData)

        

        'how'd we do?

        If Not blnRC Then

        

          'get the error from the findnext call

          intError = Err.LastDllError

          

          'no more items

          If intError < > 18 Then

            'whoa...a real error

            卐rror handler?

            

            Exit Do

          

          Else

            

            'no more items...

            Exit Do

            

          End If

          

        Else

          

          'get the last item returned

          strTemp = Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)

          

          卻tore the file info someplace?



        End If

        

      Loop

      

      'close the handle for the dir listing

      InternetCloseHandle lngHINet

      

    End If



      现在可以看到,即使是有一些复杂的任务,例如列举路径,都可以简单地纳入这简单的四步过程:设置环境,连接主机,执行FTP任务,关闭环境和连接句柄。

    你自己的FTP ActiveX 服务器组件
      要使这篇文章完整,本文包括一个FTP ActiveX 服务器组件的VB源代码。代码中包含3个类模块:clsITEM.CLS 、colITEM.CLS和 FTP.CLS。clsITEM.CLS 包含的类定义以clsITEM作为类名,在列举一个路径时包含着单独的文件信息。colITEM.CLS 包含的类定义以colItem作为类名,用于使用clsITEM 类的文件集合。最后FTP.CLS 包含的类定义以ASPFTP 作为类名,用于所有的FTP函数。我还要包含一个工程文件TP_CLASSES.VBP)。

      除了源代码,还包含了每个函数的样本ASP文件,一个包含文件(ASPFTP2.INC) ,你可以将它包含在每个ASP文件中使一些函数的调用更简单。例如,这里是使用FTP Get 函数的ASP代码。服务器,电子邮件用户名,口令,远程和本地文件名,使用的传输类型(ASCII 或 Binary),当本地文件存在时是否覆盖,这些都被输入一个表单中(未显示)并用ASP Request 对象引用:

    < %@ LANGUAGE=VBScript % >

    < !--#Include File="aspftp2.inc"-- >

    < %

    'check to see if user submitted form

    If Request.Form("GetIt") < > "" Then

    Dim objFTP

    Dim strMsg



    'create reference to object

    Set objFTP = Server.CreateObject("NIBLACK.ASPFTP")



    'set the properties for the connection

    objFTP.sServerName = Request.Form("Server")

    objFTP.sUserID = Request.Form("User_ID")

    objFTP.sPassword = Request.Form("Password")



    'connect to the host

    If objFTP.bConnect Then

    'set the properties for the get function

    objFTP.bOverWrite = Request.Form("OverWrite")

    objFTP.lTransferType = Request.Form("Transfer_Type")



    'now get the file

    If objFTP.bGetFile(Request.Form("Remote_File"), Request.Form("Local_File")) Then

      'get was successful

      strMsg = "Get Successful!"

    Else

      'get failed...let user know

      strMsg = "Get Failed: " & objFTP.sError

    End If

    Else

    'connection failed...let user know

    strMsg = "Connection Failed: " & objFTP.sError

    End If

      

    'clean up...

    Set objFTP = Nothing



    Else

    'default return msg

    strMsg = ""

    End If

    % >



      我还为许多许多FTP函数创建了uick?方法。基本上,你调用一种uick?方法,用来完成任务的所有参数都包含在方法调用中,而不用在ASP代码中设置每一个属性。举例说,这里的ASP代码使用FTP Get 函数。服务器,电子邮件用户名,口令,远程和本地文件名,使用的传输类型(ASCII 或 Binary),当本地文件存在时是否覆盖,这些都被输入一个表单中(未显示)并用ASP Request 对象引用。



    < %@ LANGUAGE=VBScript % >

    < !--#Include File="aspftp2.inc"-- >

    < %

    'check to see if user submitted form

    If Request.Form("GetIt") < > "" Then

    Dim objFTP

    Dim strMsg



    'create reference to object

    Set objFTP = Server.CreateObject("NIBLACK.ASPFTP")



    'now get the file

    If objFTP.bQGetFile(Request.Form("Server"), Request.Form("User_ID"), _

      Request.Form("Password"), Request.Form("Remote_File"), Request.Form("Local_File"), _

      Request.Form("Transfer_Type"), Request.Form("OverWrite")) Then

      'get was successful

      strMsg = "Get Successful!"

    Else

      'get failed...let user know

      strMsg = "Get Failed: " & objFTP.sError

    End If

      

    'clean up...

    Set objFTP = Nothing



    Else

    'default return msg

    strMsg = ""

    End If

    % >

    下面如何?
      有了提供的源代码,你就已经有了一个FTP函数的ActiveX服务器组件。现在我们可以跟随同样的基本步骤,创建一个客户机侧的OCX ,你可以将其包含在你的HTML页中以允许用户从他们的PC进行FTP。还可以看看WinINet API提供的一些其它函数。例如你可以使用HTTP函数创建一个机器人,将Web 站点的内容拉回来,对所有的页进行索引。或者创建一个探测器,在一个预定的基础上,

    用HTTP函数检测Web 站点或Web 页的状态。用WinINet API所提供的功能,这些和更多的想法都可以相当简单地来探索。

    用VB编写一个可以在ASP环境下调用的运行CMD命令的组件

    有时我们在管理服务器时为了安全起见会禁用Windows Scripting Host,这样能防止某些不法用户利用WSH生成一个WebShell,对服务器造成很大的安全隐患。但如果我们又想禁用WSH,又想使用自己的WebShell用于服务器的管理怎么办呢?这里介绍了一种实现ASP中运行CMD并显示结果的组件编程。希望对大家能有所帮助。

    首先我们新建一个ActiveDLL工程,命名为ASPCMD,新建的类命名为CMDShell。在“Project“的“Referenct“中添加一个引用:Microsoft Active Server Pages Object Library。

    然后我们的思路是使用Window API ShellExecute调用cmd.exe,将运行的结果保存到一个临时文本文件,然后读出这个文件的内容显示出来。

    以下是工程ASPCMD的类CMDShell.cls的代码。

    Option Explicit
    Dim rp As Response
    Dim rq As Request
    Dim ap As Application
    Dim sr As Server
    Dim sn As Session
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long


    Private Sub ShellEx(ByVal sLocation As String, ByVal sPara As String, Optional MaxedForm As Boolean = False)
    On Error GoTo errhandle:
    Dim lR As Long
    Dim Style As Long
    Dim hWnd As Long
    If MaxedForm Then
    Style = vbMaximizedFocus
    Else
    Style = vbNormalFocus
    End If

    lR = ShellExecute(hWnd, "open", sLocation, sPara, "", Style)
    If (lR < 0) Or (lR > 32) Then
    'success
    Else
    rp.Write "Error Occered when starting the program " & sLocation
    End If
    errhandle:
    rp.Write "Error:" & Err.Description
    End Sub

    Public Sub OnStartPage(ByVal mysc As ScriptingContext)
    Set rp = mysc.Response
    Set rq = mysc.Request
    Set sr = mysc.Server
    Set ap = mysc.Application
    Set sn = mysc.Session
    End Sub

    Public Sub OnEndPage()
    Set rp = Nothing
    Set rq = Nothing
    Set sr = Nothing
    Set ap = Nothing
    Set sn = Nothing
    End Sub

    Private Function FileExists(Filename As String) As Boolean
    Dim i As Integer
    On Error Resume Next
    i = Len(Dir$(Filename))
    If Err Or i = 0 Then FileExists = False Else FileExists = True
    End Function

    Private Function IsOpen(Filename As String) As Boolean
    Dim fFile As Integer
    Dim msg As String
    fFile = FreeFile()
    On Error GoTo ErrOpen
    Open Filename For Binary Lock Read Write As fFile
    Close fFile
    Exit Function
    ErrOpen:
    If Err.Number <> 70 Then
    msg = "Error # " & Str(Err.Number) & " was generated by " _
    & Err.Source & Chr(13) & Err.Description
    Else
    IsOpen = True
    End If
    End Function

    Public Sub Exec1(ByVal strCmd As String)
    On Error GoTo errhandle:
    Dim myTimer As Integer
    myTimer = 0

    Dim strOut As String
    Dim strFname As String
    //生成一个临时文件
    If Len(App.Path) = 3 Then
    strFname = App.Path & "lhtmp.txt"
    Else
    strFname = App.Path & "\lhtmp.txt"
    End If
    //如果在运行前文件已存在则删除之
    If FileExists(strFname) Then
    Kill strFname
    End If

    //运行行用户的CMD命令,并将结果输出到临时文件中
    //注意cmd.exe的/c参数是指运行完一个命令后马上结束会话状态。等同于在windows的run中输入的CMD命令
    Dim strPara As String
    strPara = "/c " & strCmd & ">" & strFname
    ShellEx "cmd.exe", strPara
    //等待生成输出文件
    Do While Not FileExists(strFname)
    Sleep 1000
    DoEvents
    myTimer = myTimer + 1
    If myTimer = 15 Then
    Exit Do
    End If
    Loop
    myTimer = 0
    //等待文件输出完毕
    Do While IsOpen(strFname)
    Sleep 1000
    DoEvents
    myTimer = myTimer + 1
    If myTimer = 15 Then
    Exit Do
    End If
    Loop

    //显示输出文件的内容
    Open strFname For Input As #1
    Do While Not EOF(1)
    Line Input #1, strOut
    rp.Write strOut & vbCrLf
    Loop
    Close #1
    Sleep 1000
    //删除临时文件
    Kill strFname
    Exit Sub
    errhandle:
    rp.Write "error occured:" & Err.Description
    End Sub

    生成ASPCMD.dll,使用regsvr32 aspcmd.dll注册组件。

    以下是调用该DLL的一个ASP程序例子:

    <%@LANGUAGE="VBSCRIPT"%>

    <br>.singleborder {;} <br>.noborder {;} <br>body {background-color:#000000;scrollbar-face-color:#333333;font-size:12px;scrollbar-highlight-color:#000000;scrollbar-shadow-color:#000000;scrollbar-3dlight-color:#000000;scrollbar-arrow-color:#000000;scrollbar-darkshadow-color:#000000<br> font-family: Fixedsys;font-size:9pt;}


    " size=102>


    <%
    if request.form("cmd")<>"" then
    set testme=server.createobject("aspcmd.cmdshell")
    %>
    <%=request.Form("cmd")%>
    <br><%=testme.exec1(request.form("cmd"))%>
    <% set testme=nothing
    end if
    %>

    以下是运行Ipconfig /all的结果:

    Windows 2000 IP Configuration

    Host Name . . . . . . . . . . . . : ibm-wrk-02
    Primary DNS Suffix . . . . . . . :
    Node Type . . . . . . . . . . . . : Broadcast
    IP Routing Enabled. . . . . . . . : No
    WINS Proxy Enabled. . . . . . . . : No

    Ethernet adapter 本地连接:

    Connection-specific DNS Suffix . :
    Description . . . . . . . . . . . : Intel(R) PRO/100 VM Network Connection
    Physical Address. . . . . . . . . : 00-08-02-BD-D7-EB
    DHCP Enabled. . . . . . . . . . . : No
    IP Address. . . . . . . . . . . . : 192.168.0.4
    Subnet Mask . . . . . . . . . . . : 255.255.255.0
    Default Gateway . . . . . . . . . : 192.168.0.1
    DNS Servers . . . . . . . . . . . : 202.106.196.115