zoukankan      html  css  js  c++  java
  • [转贴]ASP与数据库应用(给初学者)以及一些精华收藏

    见最近许多网友询问一些关于数据库操作的基础问题,现把我以前写的一篇简单教程贴上来,好让一些初学者最快的入门:

    ASP与数据库应用(给初学者)

      一般来说,一个真正的、完整的站点是离不开数据库的,因为实际应用中,需要保存的数据很多,而且这些数据之间往往还有关联,利用数据库来管理这些数据,可以很方便的查询和更新。数据库有很多种,如:Fox 数据库(.dbf)、Access 数据库(.mdb)、Informix、Oracle 和 SQL Server 等等,在这里,我将以 Microsoft Access 数据库为例来说明ASP是如何访问数据库的。

    常用数据库语句

      1.SELECT 语句:命令数据库引擎从数据库里返回信息,作为一组记录。
      2.INSERT INTO 语句:添加一个或多个记录至一个表。
      3.UPDATE 语句:创建更新查询来改变基于特定准则的指定表中的字段值。
      4.DELETE 语句:创建一个删除查询把记录从 FROM 子句列出并符合 WHERE 子句的一个或更多的表中清除。
      5.EXECUTE 语句:用于激活 PROCEDURE(过程)

    用 ASP 来做一个自己的通讯录练练手吧……

    一、建立数据库:

      用 Microsoft Access 建立一个名为 data.mdb 的空数据库,使用设计器创建一个新表。输入以下几个字段:

      字段名称  数据类型  说明      其它
      ID     自动编号  数据标识    字段大小:长整型 新值:递增 索引:有(无重复)
      username  文本    姓名      缺省值
      usermail  文本    E-mail     缺省值
      view    数字    查看次数    字段大小:长整型 默认值:0 索引:无
      indate   时间日期  加入时间    缺省值

      保存为 data.mdb 文件,为了便于说明,只是做了一个比较简单的库。

    二、连接数据库

      方法1:
      Set conn = Server.CreateObject("ADODB.Connection")
      conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")

      方法2:
      Set conn = Server.CreateObject("ADODB.Connection")
      conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("data.mdb")

      注意:一个页面中,只要连接一次就可以了,数据库使用完后要及时关闭连接。
      conn.Close
      Set conn = Nothing

    三、添加新记录到数据库

      Set conn = Server.CreateObject("ADODB.Connection")
      conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")

      username = "风云突变"
      usermail = "fytb@163.com"
      indate = Now()

      sql = "insert into data (username,usermail,indata) values('"&username&"','"&usermail&"','"&indate&"')"
      conn.Execute(sql)

      conn.Close
      Set conn = Nothing

      说明:建立数据库连接;通过表单获取姓名、E-mail 字符串,Now()获取当前时间日期;使用 insert into 语句添加新记录;conn.Execute 来执行;最后关闭。

    四、选择数据库里的记录

      1.选择所有记录的字段(按记录倒序排序):sql = "select * from data order by ID desc"
      2.选择所有记录的姓名和E-mail字段(不排序):sql = "select username,usermail from data"
      3.选择姓名为“风云突变”的所有记录:sql = "select * from data where username='"风云突变"'"
      4.选择使用 163 信箱的所有记录(按查看次数排序):sql = order by view desc"
      5.选择最新的10个记录:sql = "select top 10 * from data order by ID desc"

      SQL 语句已经知道了,不过在Web应用时,还得创建一个 RecordSet 对象得到记录集,才能把从数据库里取出的值应用在网页上,如果现在将所有的记录显示在网页上就这样:

      Set conn = Server.CreateObject("ADODB.Connection")
      conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")

      sql = "select * from data"
      Set rs = Server.CreateObject("ADODB.RecordSet")
      rs.Open sql,conn,1,1

      Do While Not rs.Eof
        Response.Write "<p>姓名:"& rs("username") &" E-mail:"& rs("usermail") &" 查看:"& rs("view") &"次 "& rs("indate") &"加入</p>"
        rs.MoveNext
      Loop

      rs.Close
      Set rs = Nothing
      conn.Close
      Set conn = Nothing

      说明:建立数据库连接;创建 rs 得到记录集;循环显示记录,rs.Eof 表示记录末,rs.MoveNext 表示移到下一个记录;最后关闭。

    五、修改(更新)数据库记录

      修改记录的E-mail:

      Set conn = Server.CreateObject("ADODB.Connection")
      conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")

      ID = 1
      usermail = "
    fytb@163.com"

      sql = "update data set usermail='"&usermail&"' where ID="&CInt(ID)
      conn.Execute(sql)

      conn.Close
      Set conn = Nothing

      说明:建立数据库连接;获取记录ID、新 E-mail 字符串;使用 update 语句修改记录;conn.Execute 来执行;最后关闭。
      如果使记录的查看值加1,则:sql = "update data set view=view+1 where ID="&CInt(ID)

    六、删除数据库记录

      删除某一条记录:

      Set conn = Server.CreateObject("ADODB.Connection")
      conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")

      ID = 1

      sql = "delete from data where ID="&CInt(ID)
      conn.Execute(sql)

      conn.Close
      Set conn = Nothing

      说明:建立数据库连接;获取记录ID;使用 delete 语句删除记录;conn.Execute 来执行;最后关闭。
      删除多条记录为:sql = "delete from data where ID in (ID1,ID2,ID3)"
      删除所有记录为:sql = "delete from data"

    总结:

      以上教程是针对ASP的初学者而写的,只是介绍了一些基本的用法,在了解之后可以自己去试试,重要的在于能举一反三、综合运用。更多的语法和参数请参阅 Microsoft Access 帮助中的 Microsoft Jet SQL 参考,由于本人才疏学浅、能力有限,如有表达不明确有地方还望指出,如果在应用当中遇到什么问题,也希望能够提出。谢谢。


    利用ASP存取各种常用类型数据库

      摘要:

      本文讨论利用ASP存取DBF、DBC、MDB、Excel、SQL Server型数据的方法及函数实现,最后给出一个利用本文提供的函数存取Excel型数据库的例子,对企事业数据重用及共享具有很强的实际意义。

      关键词:  ASP数据库存取 DBF DBC MDB Excel SQL Server

      前言

      在Internet/Intranet网页上随处可见留言板、讨论组、网上投票、网上调查、聊天室等Internet功能模块,这些程序都是利用ASP(Active Server Page)与数据库技术结合而实现的。在Internet/Intranet上用的数据库大都是mdb数据库或SQL<数据库,但是在企事业Intranet<网中,各种版本的数据库已存在如DBF<、DBC、Excel、文本数据库,这些数据库是由应用软件如办公自动化系统、财务软件等所生成,如果ASP能直接利用这些类型数据库,就不需要重新建立数据库,进一步实现企业数据共享,究竟这些数据库能不能直接被ASP使用,笔者经过长期探讨总结出给出肯定的答案。

     一、ASP的对象存取数据库方法

      在ASP中,用来存取数据库的对象统称ADO(Active Data Objects),主要含有三种对象:Connection、Recordset 、Command,其中Connection负责打开或连接数据库,Recordset负责存取数据表,Command负责对数据库执行行动查询(Action Query)命令和执行SQL Server的Stored Procedure。只依靠这三个对象还是无法存取数据库的,还必须具有数据库存取的驱动程序:OLE DB驱动程序和ODBC驱动程序。对于任何一种数据库都必须有相对应的OLE DB驱动程序和ODBC驱动程序,ADO<才能对数据库进行存取。存取过程可用下图描述:
    <图> http://computer.mblogger.cn/images/computer.mblogger.cn/wucountry/3235/o_10079488_11428.gif 
      由上图可知,ADO对象必须与各种驱动程序结合才能存取各种类型数据库,不同的数据库需要不同的驱动程序。究竟机器上已安装哪些驱动程序呢?可通过如下的方法来验证:Windows9X或NT的“开始”→“设置”→“控制面板”→“ODBC Data Source(32Bit)”中的“驱动程序”标签页查证我们的机器上究竟装了哪些驱动程序。大致有如下表所列的驱动程序:

      <驱动程序           <适用数据库类型
      
      Microsoft.Jet.OLEDB.4.0     Mdb
      
      Microsoft Access Driver     Access
      
      Microsoft dBase Driver     Dbase

     Microsoft Excel Driver     Excel
      
      Microsoft Visual FoxPro Driver   Dbc
      
      SQLOLEDB.1           SQL Server7.0
      

      二、连接数据库和打开数据表

      不同的数据库连接方法不一样(即建立Connection的实例方法不一样),一旦建立Connection实例完毕,利用Recordset对象进行存取数取数据的方法大同小异,下面对于不同的数据类型,编写了相对应的连接函数,其原型如下:

      1)Function CreatMdbRecordset( 数据库文件名, 数据表文件名或Select语句 );建立Mdb类型的数据库对象

      2)Function CreateSecuredMdbRecordset( 数据库文件名,数据表文件名或Select语句, 密码 );建立带密码的MDB类型的数据库对象;

      3)Function CreateDbfRecordset(目录名, DBF文件名或Select语句);建立DBF类型的数据库对象;

      4)Function CreateDbcRecordset(DBC数据库文件名, 数据表名或Select语句);建立DBC类型的数据库对象;

      5)Function CreateExcelRecordset(XLS文件名,Sheet名);建立Excel类型的数据库对象;

      6)Function CreateSQLServerRecordset(计算机名称,用户ID, 用户密码,数据库名称 数据表或查看表或Select指令 );建立SQL Server 类型的数据库对象;


      三、程序清单

      ‘以下程序用VBScript编写

      1)建立MdbRecordset对象,Mdb数据库是一个完整的数据库,内部可能含有若干个数据表,在此函数中,Connection的作用是连接数据库,Recordset的作用是打开数据表。

      Function CreateMdbRecordset(数据库文件名, 数据表名或Select语句 )

      Dim conn,Provider,DBPath

      ‘ 建立Connection 对象
      Set conn = Server.CreateObject("ADODB.Connection")
      Provider = "Provider=Microsoft.Jet.OLEDB.4.0;"
      DBPath = "Data Source=" & Server.MapPath( "数据库文件名" )
      ‘打开数据库
      conn.Open Provider & DBPath

      Set CreateMdbRecordset = Server.CreateObject("ADODB.Recordset")
      ‘ 打开数据表,参数二为Connection对象
      CreateMdbRecordset.Open "数据表名", conn, 2, 2

      End Function


      2)建立带密码的Mdb数据库的Recordset对象,它的建立方式与建立不带密码的Mdb数据库的Recordset对象类似,只是多了一个密码参数,即在与数据库连接时,必须给出密码信息。

     Function CreateSecuredMdbRecordset( 数据库文件名, 数据表名或Select语句,password )

      Dim conn,Provider,DBPath

      ‘ 建立Connection 对象
      Set conn = Server.CreateObject("ADODB.Connection")
      Provider = "Provider=Microsoft.Jet.OLEDB.4.0;"
      DBPath = "Data Source=" & Server.MapPath( "数据库文件名" )
      ‘ 连接数据库,注意下面一行带有密码参数
      conn.Open Provider & DBPath&”Jet OLEDBBig Smileatabase Password=”&assword
      Set CreateSecuredMdbRecordset = Server.CreateObject("ADODB.Recordset")
      ‘ 打开数据表,参数二为Connection对象
      CreateSecuredMdbRecordset.Open "数据表名", conn, 2, 2

      End Function


      3)DBF文件不是一个标准的数据库文件,只相当于标准数据库文件中的一个数据表,所以为了使用DBF文件,采用把所有的DBF文件放在一个目录下,这样把目录名看成标准数据中的数据库表,每一个DBF文件相当于标准数据库的数据表。下面函数中Directory是DBF所在的目录名,

      Function CreateDbfRecordset( 目录名, DBF文件名或Select语句 )

      Dim conn,Driver,SourceType,DBPath

      ‘ 建立Connection 对象
      Set conn = Server.CreateObject("ADODB.Connection")
      Driver = "Driver={Microsoft Visual FoxPro Driver};"
      SourceType = "SourceType=DBF;"
      DBPath = "SourceDB=" & Server.MapPath( "目录名" )

      ‘ 调用Open 方法打开数据库
      conn.Open Driver & SourceType & DBPath

      Set CreateDbfRecordset = Server.CreateObject("ADODB.Recordset")
      ‘ 打开DBF文件,参数二为Connection对象
      CreateDbfRecordset.Open DBF文件名或Select语句, conn, 2, 2

      End Function

      4)由Foxpro生成的DBC数据库与MDB数据库相似,都是一个数据库包含几个数据表的形式,所以对DBC数据库的存取方法与MDB数据库相似。

      Function CreateDbcRecordset( DBC数据库文件名, 数据表名或Select语句 )

      Dim conn,Driver,SourceType,DBPath

      ‘ 建立Connection 对象
      Set conn = Server.CreateObject("ADODB.Connection")
      Driver = "Driver={Microsoft Visual FoxPro Driver};"
      SourceType = "SourceType=DBC;"
     DBPath = "SourceDB=" & Server.MapPath( "DBC数据库文件名" )
      ‘ 连接数据库
      conn.Open Driver & SourceType & DBPath
      Set CreateDbcRecordset = Server.CreateObject("ADODB.Recordset")
      ‘ 打开数据表,参数二为Connection对象
      CreateDbcRecordset.Open "数据表名或Select语句", conn, 2, 2

      End Function

      5)将Excel97或Excel2000生成的XLS文件(book)看成一个数据库,其中的每一个工作表(sheet)看成数据库表。

      Function CreateExcelRecordset( XLS文件名,Sheet名 )

      Dim conn.Driver,DBPath

      ‘ 建立Connection对象
      Set conn = Server.CreateObject("ADODB.Connection")
      Driver = "Driver={Microsoft Excel Driver (*.xls)};"
      DBPath = "DBQ=" & Server.MapPath( "XLS文件名" )

      ‘ 调用Open 方法打开数据库
      conn.Open Driver & DBPath
      Set CreateExcelRecordset = Server.CreateObject("ADODB.Recordset")
      ‘ 打开Sheet,参数二为Connection对象,因为Excel ODBC驱动程序无法直接用‘sheet名来打开sheet,所以请注意

    以下的select语句
      CreateExcelRecordset.Open "Select * From ["&sheet&”$]”, conn, 2, 2

      End Function

      6)SQL Server属于Server级的数据库,使用时要求比较严格,必须要求输入用户名及密码才能使用。

      Function CreateSQLServerRecordset(计算机名称,用户ID, 用户密码,数据库名称 数据表或查看表或Select指令 )

      Dim Params, conn

      Set CreatSQLServerConnection = Nothing

      Set conn = Server.CreateObject("ADODB.Connection")

      Params = "Provider=SQLOLEDB.1"

      Params = Params & ";Data Source=" & Computer

      Params = Params & ";User ID=" & UserID

      Params = Params & ";Password=" & Password

      Params = Params & ".Initial Catalog="&数据库名称

      Conn open Paras

      Set CreateSQLServerRecordset = Server.CreateObject("ADODB.Recordset")

      CreateSQLServerRecordset.Open source, conn, 2, 2

      End Function

      利用上面的函数就可以打开常用类型的数据库,然后利用ADO的Recordset对象的增加记录、删除记录、修改记录等功能就可以对数据库进行操作。但是要说明的是,在实际开发中我们发现,如果使用DBF、DBC、Excel数据库,执行效率没有MDB数据库效率高,最好尽可能用MDB类型数据库。
      如果用用DBF、DBC、Excel数据库,下面几点要注意:Excel数据库只能读取、增加记录、修改记录,但不能删除记录;DBF、DBC<可以读取记录、增加记录、删除记录、修改记录,但是在增加记录时,任何一个字段值都不能为空,由此可看出局限性很大,所以尽可能地用MDB或SQL数据库。

      四、实例(存取Excel数据表)

      为了更进一步说明这些函数的用法,本文给出一个存取Excel数据表的例子,其它函数的存取方法与此类似。假设有一个如图2的名为1.xls的Excel文件, 含有三个工作表一班、二班、三班。下面得用上面的函数存取工作表“一班”的数据。

      
      图2 http://computer.mblogger.cn/images/computer.mblogger.cn/wucountry/3235/o_10079488_11430.jpg

      编写ASP文件(文件名为1.asp)存取此Excel中文件。


      利用IE和PWS(Personal Web Server)后浏览结果如图3:

    http://computer.mblogger.cn/images/computer.mblogger.cn/wucountry/3235/o_10079488_11431.jpg  

      图3

      参考文献:

      [1]DataBase and the World Wide Web Marianne Winslett, University of Illinois

      [2]http://www.aspobjects.com






    学习使用存储过程(Stored Procedure),是ASP程序员的必须课之一。所有的大型数据库都支持存储过程,比如Oracle、MS SQL等,(但MS Access不支持,不过,在Access里可以使用参数化的查询)。
    使用存储过程有许多好处,它可以封装复杂的数据逻辑,充分发挥大型数据库本身的优势。我们知道,ASP并不适合做复杂的数据运算,而通过OLD DB访问数据库,由于数据需要在ASP和数据库之间传递,相当消耗系统资源。事实上,如果数据库仅仅起着数据存储的作用,那么它的功能是远远没有得到利用的。
    关于如何创建存储过程,请参考MS SQL的相关文档。
    本文介绍存储过程如何在ASP中运用。
    简单的一个SQL语句:
    select ID,Name,Picture,Time,Duty from employ 
    我们可以创建一个存储过程:


    CREATE PROCEDURE sp_employ
    AS
    select ID,Name,Picture,Time,Duty from employ 
    Go
     


    而SQL语句:
    select ID,Name,Picture,Time,Duty from employ where ID=10230
    对应的存储过程是:(用Alter替换我们已有的存储过程)

    ALTER PROCEDURE sp_employ
    @inID  int
    AS
    select ID,Name,Picture,Time,Duty from employ  where ID=@inID

    Go
     


    下面对比一下SQL和存储过程在ASP中的情况。首先看看直接执行SQL的情况:

    <%
    dim Conn, strSQL, rs
    set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open  "DSN=webData;uid=user;pwd=password" 
    strSQL = " select ID,Name,Picture,Time,Duty from employ "
    Set rs = Conn.Execute(strSQL) 
    %> 


    再看看如何执行Stored Procedure:

    <%
    dim Conn, strSQL, rs
    set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open  "DSN=webData;uid=user;pwd=password" ’make connection
    strSQL = "sp_employ"
    Set rs = Conn.Execute(strSQL) 
    %> 


    而执行带参数的Stored Procedure也是相当类似的:

    <%
    dim Conn, strSQL, rs, myInt
    myInt = 1 
    set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open  "DSN=webData;uid=user;pwd=password"
    strSQL = "sp_myStoredProcedure " & myInt
    Set rs = Conn.Execute(strSQL) 
    %> 


    你可能觉得在ASP中使用存储过程原来是这样的简单。对!就是这么简单。



    ◆[转帖]ASP精华问题及解答

    1.如何 最小化、最大化、关闭窗口
    答:<objectid=hh1classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
    <paramname="command"value="minimize"></object>
    <objectid=hh2classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
    <paramname="command"value="maximize"></object>
    <objectid=hh3classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
    <paramname="command"value="close"></object>

    <inputtype=buttonvalue=最小化onclick=hh1.click()>
    <inputtype=buttonvalue=最大化onclick=hh2.click()>
    <inputtype=buttonvalue=关闭onclick=hh3.click()>

    2.如何静止页面缓存
    答:htm网页
    <metahttp-equiv="pragma"content="no-cache">
    <metahttp-equiv="cache-control"content="no-cache,must-revalidate">
    <metahttp-equiv="expires"content="wed,26feb199708:21:57gmt">
    或者<metahttp-equiv="expires"content="0">
    asp网页
    response.expires=-1
    response.expiresabsolute=now()-1
    response.cachecontrol="no-cache"
    php网页
    header("expires:mon,26jul199705:00:00gmt");
    header("cache-control:no-cache,must-revalidate");
    header("pragma:no-cache");

    3.如何检查一段字符串是否全由数字组成
    <scriptlanguage="javascript"><!--
    functionchecknum(str){returnstr.match(/\d/)==null}
    alert(checknum("1232142141"))
    alert(checknum("123214214a1"))
    //--></script>

    4.如何获取机器信息
    答本机ip<%=request.servervariables("remote_addr")%>
    服务器名<%=request.servervariables("server_name")%>
    服务器ip<%=request.servervariables("local_addr")%>
    服务器端口<%=request.servervariables("server_port")%>
    服务器时间<%=now%>
    iis版本<%=request.servervariables"server_software")%>
    脚本超时时间<%=server.scripttimeout%>
    本文件路径<%=server.mappath(request.servervariables("script_name"))%>
    服务器cpu数量<%=request.servervariables("number_of_processors")%>
    服务器解译引擎<%=scriptengine&"/" & scriptenginemajorversion &"." & scriptengineminorversion & "." & scriptenginebuildversion%>
    服务器操作系统<%=request.servervariables("os")%>

    5.如何让日期相减
    日期减去天数等于第二个日期
    <scriptlanguage=javascript>
    functioncc(dd,dadd)
    {
    //可以加上错误处理
    vard=newdate(dd.replace("-","/"))
    d.setdate(d.getdate()+dadd)
    alert(d.getfullyear()+"年"+(d.getmonth()+1)+"月"+d.getdate()+"日")
    }
    cc("2002-2-28",2)
    </script>

    6.怎样通过asp的手段来检查来访者是否用了代理
    <%ifrequest.servervariables("http_x_forwarded_for")<>""then
    response.write"<fontcolor=#ff0000>您通过了代理服务器,"&_
    "真实的ip为"&request.servervariables("http_x_forwarded_for")
    endif
    %>

    7.获得窗口的大小
    document.body.clientWidth,document.body.clientHeight
    document.body.offsetWidth,document.body.offsetHeight

    8.判断一个表是否存在:
    if exists (select * from dbo.sysobjects where id = object_id('表名') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table 表名
    GO
    从publish 表中取出第 n 条到第 m 条的记录:
    SELECT TOP m-n+1 *
    FROM publish
    WHERE (id NOT IN
         (SELECT TOP n-1 id
         FROM publish))

    id 为publish 表的关键字


    9.如何实现连续滚动

    <div id="marquees"><br/><br/>

    数据里面读出来的<br/>
    </div>

    <script language="JavaScript">

    marqueesHeight=200;
    stopscroll=false;

    with(marquees){
    style.width=0;
    style.height=marqueesHeight;
    style.overflowX="visible";
    style.overflowY="hidden";
    noWrap=true;
    onmouseover=new Function("stopscroll=true");
    onmouseout=new Function("stopscroll=false");
    }
    document.write('<div id="templayer" style="position:absolute;z-index:1;visibility:hidden"></div>');

    preTop=0; currentTop=0;

    function init(){
    templayer.innerHTML="";
    while(templayer.offsetHeight<marqueesHeight){
    templayer.innerHTML+=marquees.innerHTML;
    }
    marquees.innerHTML=templayer.innerHTML+templayer.innerHTML;
    setInterval("scrollUp()",10);
    }
    document.body.onload=init;

    function scrollUp(){
    if(stopscroll==true) return;
    preTop=marquees.scrollTop;
    marquees.scrollTop+=1;
    if(preTop==marquees.scrollTop){
    marquees.scrollTop=templayer.offsetHeight-marqueesHeight;
    marquees.scrollTop+=1;
    }
    }
    </script>

    10.只针对图片:

    <form name=form1 onsubmit="return mm()">
    <input type=file name=meizz><br/>
    <input type=submit value=submit></form>

    <SCRIPT LANGUAGE="JavaScript"><!--
    function mm()
    {
    var s = document.form1.meizz.value;
    if(s=="")return false;
    var img = new Image();
    img.src = s;
    alert("高 = "+ img.height + "
    宽 = "+ img.width);
    alert("fileSize = "+ img.fileSize +" 字节");
    return(img.fileSize <= 40000);
    }
    //--></SCRIPT>


    1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键
    <table border oncontextmenu=return(false)><td>no</table> 可用于Table

    2. <body onselectstart="return false"> 取消选取、防止复制

    3. onpaste="return false" 不准粘贴

    4. oncopy="return false;" oncut="return false;" 防止复制

    5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址栏前换成自己的图标

    6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夹中显示出你的图标

    7. <input style="ime-modeBig Smileisabled"> 关闭输入法

    8. 永远都会带着框架
    <script language="javascript"><!--
    if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页
    // --></script>

    9. 防止被人frame
    <SCRIPT LANGUAGE=javascript><!--
    if (top.location != self.location)top.location=self.location;
    // --></SCRIPT>

    10. <noscript><iframe src=*.html></iframe></noscript> 网页将不能被另存为

    11. <input type=button value=查看网页源代码
    onclick="window.location = 'view-source:'+ 'http://www.csdn.net/'";>

    12. 怎样通过asp的手段来检查来访者是否用了代理
    <% if Request.ServerVariables("HTTP_X_FORWARDED_FOR")<>"" then
    response.write "<font color=#FF0000>您通过了代理服务器,"& _
    "真实的IP为"&Request.ServerVariables("HTTP_X_FORWARDED_FOR")
    end if
    %>

    13. 取得控件的绝对位置
    //javascript
    <script language="javascript">
    function getIE(e){
    var t=e.offsetTop;
    var l=e.offsetLeft;
    while(e=e.offsetParent){
    t+=e.offsetTop;
    l+=e.offsetLeft;
    }
    alert("top="+t+"
    left="+l);
    }
    </script>

    //VBScript
    <script language="VBScript"><!--
    function getIE()
    dim t,l,a,b
    set a=document.all.img1
    t=document.all.img1.offsetTop
    l=document.all.img1.offsetLeft
    while a.tagName<>"BODY"
    set a = a.offsetParent
    t=t+a.offsetTop
    l=l+a.offsetLeft
    wend
    msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置"
    end function
    --></script>

    14. 光标是停在文本框文字的最后
    <script language="javascript">
    function cc()
    {
    var e = event.srcElement;
    var r =e.createTextRange();
    r.moveStart('character',e.value.length);
    r.collapse(true);
    r.select();
    }
    </script>
    <input type=text name=text1 value="123" onfocus="cc()">

    15. 判断上一页的来源
    asp:
    request.servervariables("HTTP_REFERER")

    javascript:
    document.referrer

    16. 最小化、最大化、关闭窗口
    <object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
    <param name="Command" value="Minimize"></object>
    <object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
    <param name="Command" value="Maximize"></object>
    <OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
    <PARAM NAME="Command" value="Close"></OBJECT>

    <input type=button value=最小化 onclick=hh1.Click()>
    <input type=button value=最大化 onclick=hh2.Click()>
    <input type=button value=关闭 onclick=hh3.Click()>
    本例适用于IE

    17. 数据库的链接
    <%
    '定义数据库连接的一些常量
    Const adOpenForwardOnly = 0 '游标只向前浏览记录,不支持分页、Recordset、BookMark
    Const adOpenKeyset = 1 '键集游标,其他用户对记录说做的修改将反映到记录集中,但其他用户增加或删除记录不会反映到记录集中。支持分页、Recordset、BookMark
    Const adOpenDynamic = 2 '动态游标功能最强,但耗资源也最多。用户对记录说做的修改,增加或删除记录都将反映到记录集中。支持全功能浏览(ACCESS不支持)。
    Const adOpenStatic = 3 '静态游标,只是数据的一个快照,用户对记录说做的修改,增加或删除记录都不会反映到记录集中。支持向前或向后移动

    Const adLockReadOnly = 1 '锁定类型,默认的,只读,不能作任何修改
    Const adLockPessimistic = 2 '当编辑时立即锁定记录,最安全的方式
    Const adLockOptimistic = 3 '只有在调用Update方法时才锁定记录集,而在此前的其他操作仍可对当前记录进行更改、插入和删除等
    Const adLockBatchOptimistic = 4 '当编辑时记录不会被锁定,而更改、插入和删除是在批处理方式下完成的

    Const adCmdText = &H0001
    Const adCmdTable = &H0002
    %>

    18. 网页不会被缓存
    HTM网页
    <META HTTP-EQUIV="pragma" CONTENT="no-cache">
    <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
    <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
    或者<META HTTP-EQUIV="expires" CONTENT="0">
    ASP网页
    Response.Expires = -1
    Response.ExpiresAbsolute = Now() - 1
    Response.cachecontrol = "no-cache"
    PHP网页
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Cache-Control: no-cache, must-revalidate");
    header("Pragma: no-cache");

    19. 检查一段字符串是否全由数字组成
    <script language="javascript"><!--
    function checkNum(str){return str.match(/\D/)==null}
    alert(checkNum("1232142141"))
    alert(checkNum("123214214a1"))
    // --></script>

    20. 获得一个窗口的大小
    document.body.clientWidth,document.body.clientHeight

    21. 怎么判断是否是字符
    if (/[^\x00-\xff]/g.test(s)) alert("含有汉字");
    else alert("全是字符");

    22.TEXTAREA自适应文字行数的多少
    <textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight">
    </textarea>

    23. 日期减去天数等于第二个日期
    <script language=javascript>
    function cc(dd,dadd)
    {
    //可以加上错误处理
    var a = new Date(dd)
    a = a.valueOf()
    a = a - dadd * 24 * 60 * 60 * 1000
    a = new Date(a)
    alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")
    }
    cc("12/23/2002",2)
    </script>

    //有点多,希望大家自己整理一下,找到自己想要的!
    //申明一下:从别处转载的,很多没有试过,请自行判断正确与否


    1.防止用户直接访问页面(防止自制表单提交,直接通过链接访问)
    function checkPrePage()
    url=request.ServerVariables("HTTP_REFERER")
    url=trim(replace(url,"http://";,""))
    url=trim(left(url,len(request.ServerVariables("SERVER_NAME"))))
    if url<>trim(request.ServerVariables("server_name")) then
    response.Write("请通过正当的方法访问本网站")
    response.End()
    end if
    end function



    2.
    通过一下的两个函数可以实现图片,文字的同时提交处理。
    Function BinaryToString(str)
    strto = ""
    for i=1 to lenb(str)
    if AscB(MidB(str, i, 1)) > 127 then
    strto = strto & chr(Ascb(MidB(str, i, 1))*256+Ascb(MidB(str, i+1, 1)))
    i = i + 1
    else
    strto = strto & Chr(AscB(MidB(str, i, 1)))
    end if
    next
    BinaryToString=strto
    End Function

    function gainformdata(n)
    dim formsize,formdata,divider,datastart,dataend
    redim mydata(n-1)
    formsize = Request.TotalBytes
    formdata = Request.BinaryRead(formsize)
    for i=1 to n
    bncrlf = chrB(13) & chrB(10)
    divider = leftB(formdata,clng(instrB(formdata,bncrlf))-1)
    datastart = instrB(formdata,bncrlf & bncrlf)+4
    dataend = instrB(datastart+1,formdata,divider) - datastart-2
    mydata(i-1) = midB(formdata,datastart,dataend)
    formdata=rightB(formdata,clng(formsize-instrB(datastart+1,formdata,divider))+1)
    formsize=lenB(formdata)
    next
    gainformdata=mydata
    end function

    Demo:
    a.htm:
    <form name="form1" method="post" action="b.asp" enctype="multipart/form-data">
    <textarea name="txt"></textarea>
    <input type="file" name="file">
    <input type="submit" name="Submit" value="提交">
    </form>

    b.asp:
    '链接数据库
    data=gainfromdata(2)
    rs("txt")=binarytostring(data(0))
    rs("img").appendchunk=data(1)



    3.
    弹出提示信息 , 确定 与 取消 怎么做的
    onclick="{if(confirm('确定删除选定的纪录吗?')){this.document.inbox.submit();return true;}return false;}"



    4.
    组合查询的优化,谢谢
    sql = "select * from book where bname like '%" & txtbname.Text & "%' and bauthor like '%" & txtauthor.Text & "%' and bpublish like '%" & txtpublish.Text & "%' and bdescription like '%" & txtdescription.Text & "%' order by bookid desc"

    组合查询,有是四个组合条件,这样写是不是效率比较低,我该怎么优化一下呢?
    谢谢。

    分析,在SQL中,用LIKE是比较费时间的,所以最好是少用。

    同时 ,四个TEXT框,输入条件是,一定会有没有输入的条件的时候,就会出现 LIKE "%"的情况,其实这种情况下就等于这个条件没有。

    所以,把生成SQL语句的代码多写些,
    Dim WhereStr as string
    if txtbname.Text<>"" then
    WhereStr="bname like '%" & txtbname.Text & "%'"
    ELSE IF ....
    .....
    ENDIF
    这样是一个概率的问题,如果四个全输入的话,是一样的,但如果只输入一个的问,速度会比你的快些!

    sql = "select * from book where "
    If txtbname.Text <> "" Then
    sql = sql & "bname like '%" & txtbname.Text & "%'"
    ElseIf txtauthor.Text <> "" Then
    sql = sql & "bauthor like '%" & txtauthor.Text & "%'"
    ElseIf txtpublish.Text <> "" Then
    sql = sql & "bpublish like '%" & txtpublish.Text & "%'"
    ElseIf txtdescription.Text <> "" Then
    sql = sql & "bdescription like '%" & txtdescription.Text & "%' "
    End If



    5.
    如何禁止刷新
    <SCRIPT LANGUAGE="JavaScript">
    document.onkeydown = function() {
    if(event.keyCode==116) {
    event.keyCode=0;
    event.returnValue = false;
    }
    }
    document.oncontextmenu = function() {event.returnValue = false;}
    </SCRIPT>
    页面已经禁止刷新



    6.sql server 用Tongue Tiedql = "update reg set dealtime=getdate() where id= " & request.querystring("id")
    因为
    SQL SERVER里没有 now() 这个函数,而是用 getdate() 取代了
    所以你的会报错.
    ACCESS没有这个函数Smile
    只有date()和now()



    7.
    连结其他数据库的方法(*.dbf,*.txt,excel,foxpro等) ----收藏
    2002-10-30 18:41:05 浏览次数:145

    '连结dbf文件
    <%
    ' 建立Connection 对象
    Set conn = Server.CreateObject("ADODB.Connection")
    Driver = "Driver={Microsoft Visual FoxPro Driver};"
    SourceType = "SourceType=DBF;"
    DBPath = "SourceDB=" & Server.MapPath( "Dbf" )

    ' 调用Open 方法连接数据库
    conn.Open Driver & SourceType & DBPath

    Set rs = Server.CreateObject("ADODB.Recordset")
    ' 打开数据源,参数二为Connection对象
    rs.Open "Select * From sample", conn, 2, 2
    %>
    '连结foxpro文件
    <%
    ' 建立Connection 对象
    Set conn = Server.CreateObject("ADODB.Connection")
    Driver = "Driver={Microsoft Visual FoxPro Driver};"
    SourceType = "SourceType=DBC;"
    DBPath = "SourceDB=" & Server.MapPath( "Dbf/Sample.dbc" )

    ' 调用Open 方法连接数据库
    conn.Open Driver & SourceType & DBPath

    Set rs = Server.CreateObject("ADODB.Recordset")
    ' 打开数据源,参数二为Connection对象
    rs.Open "Select * From sample", conn, 2, 2
    %>

    '连结excel文件
    <%
    ' 建立Connection对象
    Set conn = Server.CreateObject("ADODB.Connection")
    Driver = "Driver={Microsoft Excel Driver (*.xls)};"
    DBPath = "DBQ=" & Server.MapPath( "Sample.xls" )

    ' 调用Open 方法连接数据库
    conn.Open Driver & DBPath

    Set rs = Server.CreateObject("ADODB.Recordset")
    ' 打开数据源,参数二为Connection对象
    rs.Open "Select * From [成绩单$]", conn, 2, 2
    %>

    '连结txt文件
    <%
    ' 建立Connection 对象
    Set conn = Server.CreateObject("ADODB.Connection")
    Driver = "Driver={Microsoft Text Driver (*.txt; *.csv)};"
    DBPath = "DBQ=" & Server.MapPath( "Text" )

    ' 调用Open 方法连接数据库
    conn.Open Driver & DBPath

    Set rs = Server.CreateObject("ADODB.Recordset")
    ' 打开数据源,参数二为Connection对象
    rs.Open "Select * From sample.txt", conn, 2, 2
    %>


    rs.open sql,conn,1,1 的后两个 1,1的涵义

    Recordset对象方法
    Open方法
    recordset.Open Source,ActiveConnection,CursorType,LockType,Options Source
    Recordset对象可以通过Source属性来连接Command对象。
    Source参数可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure。假如省略这个参数,系统则采用Recordset对象的Source属性。

    ActiveConnection
    Recordset对象可以通过ActiveConnection属性来连接Connection对象。
    这里的ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息(ConnectionString)的字符串参数。

    CursorType
    Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据,
    包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic,分述如下:
    --------------------------------------------------------------
    常数                            常数值                   说明
    -------------------------------------------------------------
    adOpenForwardOnly    0             缺省值,启动一个只能向前移动的游标(Forward Only)。
    adOpenKeyset             1             启动一个Keyset类型的游标。
    adOpenDynamic           2               启动一个Dynamic类型的游标。
    adOpenStatic               3             启动一个Static类型的游标。
    -------------------------------------------------------------
    以上几个游标类型将直接影响到Recordset对象所有的属性和方法,以下列表说明他们之间的区别。
    -------------------------------------------------------------
    Recordset属性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic
    -------------------------------------------------------------
    AbsolutePage 不支持                         不支持                可读写                可读写
    AbsolutePosition 不支持                      不支持                可读写             可读写
    ActiveConnection 可读写                      可读写                可读写             可读写
    BOF                      只读                         只读                   只读                只读
    Bookmark             不支持                      不支持                可读写             可读写
    CacheSize             可读写                      可读写                可读写             可读写
    CursorLocation    可读写                      可读写                可读写               可读写
    CursorType          可读写                      可读写                可读写                可读写
    EditMode             只读                         只读                  只读                   只读
    EOF                      只读                         只读                   只读                   只读
    Filter                   可读写                      可读写                可读写                可读写
    LockType          可读写                         可读写             可读写                   可读写
    MarshalOptions 可读写                         可读写             可读写                   可读写
    MaxRecords         可读写                      可读写             可读写                   可读写
    PageCount          不支持                      不支持                只读                   只读
    PageSize             可读写                      可读写                可读写                可读写
    RecordCount          不支持                   不支持                只读                   只读
    Source                   可读写                   可读写                可读写                可读写
    State                   只读                         只读                   只读                   只读
    Status                   只读                         只读                   只读                   只读
    AddNew                支持                      支持                         支持                支持
    CancelBatch             支持                   支持                   支持                      支持
    CancelUpdate          支持                   支持                   支持                      支持
    Clone                      不支持                不支持
    Close                         支持                   支持                   支持                   支持
    Delete                      支持                      支持                   支持                   支持
    GetRows                支持                      支持                   支持                        支持
    Move                   不支持                      支持                   支持                      支持
    MoveFirst             支持                         支持                      支持                   支持
    MoveLast          不支持                      支持                         支持                   支持
    MoveNext          支持                         支持                      支持                   支持
    MovePrevious       不支持                   支持                   支持                      支持
    NextRecordset          支持                支持                         支持                   支持
    Open                      支持                   支 持                      支持                      支持
    Requery                支持                      支持                      支持                      支持
    Resync                不支持                      不支持                支持                      支持
    Supports                支持                      支持                      支持                   支持
    Update                支持                         支持                   支持                      支持
    UpdateBatch          支持                      支持                   支持                      支持
    --------------------------------------------------------------
    其中NextRecordset方法并不适用于Microsoft Access数据库。

    LockType
    Recordset对象Open方法的LockType参数表示要采用的Lock类型,如果忽略这个参数,那么系统会以Recordset对象的LockType属性为预设值。
    LockType参数包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述如下:
    -------------------------------------------------------------
    常数 常数值 说明
    --------------------------------------------------------------
    adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法
    adLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。
    adLockOptimistic 3 当数据源正在更新时,系统并不会锁住其他用户的动作,其他用户可以对数据进行增、删、改的操作。
    adLockBatchOptimistic 4 当数据源正在更新时,其他用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行增、删、改的操作。

    rs.open sql,conn,1,1 的后两个 1,1 各代表什么? 
    RS.OPEN SQL,CONN,A,B
    A: ADOPENFORWARDONLY(=0) 只读,且当前数据记录只能向下移动
    ADOPENSTATIC(=3) 只读,当前数据记录可自由移动
    ADOPENKEYSET(=1) 可读写,当前数据记录可自由移动
    ADOPENDYNAMIC(=2) 可读写,当前数据记录可自由移动,可看到新增记录
    B: ADLOCKREADONLY(=1) 默认值,用来打开只读记录
    ADLOCKPESSIMISTIC(=2) 悲观锁定
    ADLOCKOPTIMISTIC(=3) 乐观锁定
    ADLOCKBATCHOPTIMISTIC(=4) 批次乐观锁定 

     

     

  • 相关阅读:
    上传图片2(接上一篇)
    上传图片2
    上传图片
    SQL Server基础之存储过程
    C#导入Excel、Excel导入、导入.xls 、导入.xlsx、Excel2003版本、Excel2007版本
    C#使用 System.Net.Mail发送邮件功能
    C#发送邮件三种方法,Localhost,SMTP,SSL-SMTP
    angular模板
    从“繁”到“简”进行数组去重
    CSS强制英文、中文换行与不换行
  • 原文地址:https://www.cnblogs.com/goody9807/p/573662.html
Copyright © 2011-2022 走看看