顯示具有 ASP筆記 標籤的文章。 顯示所有文章
顯示具有 ASP筆記 標籤的文章。 顯示所有文章

2007年2月14日 星期三

Web 列印控制

ASP开发必备:WEB打印代码大全这篇文章主要介绍了如何使用ASP控制Web的各种打印效果,它能够控制纵打、横打和页面边距等。
1、控制"纵打"、 "横打"和"页面的边距"。
(1)

  <script defer>
  function SetPrintSettings() {
  // -- advanced features
  factory.printing.SetMarginMeasure(2) // measure margins in inches
  factory.SetPageRange(false, 1, 3) // need pages from 1 to 3
  factory.printing.printer = "HP DeskJet 870C"
  factory.printing.copies = 2
  factory.printing.collate = true
  factory.printing.paperSize = "A4"
  factory.printing.paperSource = "Manual feed"

  // -- basic features
  factory.printing.header = "This is MeadCo"
  factory.printing.footer = "Advanced Printing by ScriptX"
  factory.printing.portrait = false
  factory.printing.leftMargin = 1.0
  factory.printing.topMargin = 1.0
  factory.printing.rightMargin = 1.0
  factory.printing.bottomMargin = 1.0
  }
  </script>

(2)

  <script language="javascript">
  function printsetup(){
  // 打印页面设置
  wb.execwb(8,1);
  }
  function printpreview(){
  // 打印页面预览
  wb.execwb(7,1);
  }
  function printit()
  {
  if (confirm('确定打印吗?')) {
  wb.execwb(6,6)
  }
  }
  </script>
  </head>
  <body>

<OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" height=0 id=wb name=wb width=0></OBJECT>
  <input type=button name=button_print value="打印" onclick="javascript:printit()">
  <input type=button name=button_setup value="打印页面设置" onclick="javascript:printsetup();">
  <input type=button name=button_show value="打印预览" onclick="javascript:printpreview();">
  <input type=button name=button_fh value="关闭" onclick="javascript:window.close();">

  ------------------------------------------------
  关于这个组件还有其他的用法,列举如下:
  WebBrowser.ExecWB(1,1) 打开
  Web.ExecWB(2,1) 关闭现在所有的IE窗口,并打开一个新窗口
  Web.ExecWB(4,1) 保存网页
  Web.ExecWB(6,1) 打印
  Web.ExecWB(7,1) 打印预览
  Web.ExecWB(8,1) 打印页面设置
  Web.ExecWB(10,1) 查看页面属性
  Web.ExecWB(15,1) 好像是撤销,有待确认
  Web.ExecWB(17,1) 全选
  Web.ExecWB(22,1) 刷新
  Web.ExecWB(45,1) 关闭窗体无提示

2、分页打印

<HTML>
<HEAD>
<STYLE>
P {page-break-after: always}
</STYLE>
</HEAD>
<BODY>
<%while not rs.eof%>
<P><%=rs(0)%></P>
<%rs.movenext%>
<%wend%>
</BODY>
</HTML>

3、ASP页面打印时如何去掉页面底部的路径和顶端的页码编号
(1)ie的文件-〉页面设置-〉讲里面的页眉和页脚里面的东西都去掉,打印就不出来了。
(2)

<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="YC">
<script language="VBScript">
  dim hkey_root,hkey_path,hkey_key
  hkey_root="HKEY_CURRENT_USER"
  hkey_path="\Software\Microsoft\Internet Explorer\PageSetup"
  '//设置网页打印的页眉页脚为空
  function pagesetup_null()
  on error resume next
  Set RegWsh = CreateObject("WScript.Shell")
  hkey_key="\header"  
  RegWsh.RegWrite hkey_root+hkey_path+hkey_key,""
  hkey_key="\footer"
  RegWsh.RegWrite hkey_root+hkey_path+hkey_key,""
  end function
  '//设置网页打印的页眉页脚为默认值
  function pagesetup_default()
  on error resume next
  Set RegWsh = CreateObject("WScript.Shell")
  hkey_key="\header"  
  RegWsh.RegWrite hkey_root+hkey_path+hkey_key,"&w&b页码,&p/&P"
  hkey_key="\footer"
  RegWsh.RegWrite hkey_root+hkey_path+hkey_key,"&u&b&d"
  end function
  </script>
</HEAD>
<BODY>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/><p align=center>
<input type="button" value="清空页码" onclick=pagesetup_null()> <input type="button" value="恢复页吗" onclick=pagesetup_default()><br/>
</p>
</BODY>
</HTML>

4、浮动帧打印

  <SCRIPT LANGUAGE=javascript>
  function button1_onclick() {
  var odoc=window.iframe1.document;
  var r=odoc.body.createTextRange();
  var stxt=r.htmlText;
  alert(stxt)
  var pwin=window.open("","print");
  pwin.document.write(stxt);
  pwin.print();
  }
  </script>

5、用FileSystem组件实现WEB应用中的本地特定打印

  <script Language=VBScript>
  function print_onclick //打印函数
  dim label
  label=document.printinfo.label.value //获得HTML页面的数据
  set objfs=CreateObject("Scripting.FileSystemObject") //创建FileSystem组件对象的实例
  set objprinter=objfs.CreateTextFile ("LPT1:",true) //建立与打印机的连接
  objprinter.Writeline("__________________________________") //输出打印的内容
  objprinter.Writeline("| |")
  objprinter.Writeline("| 您打印的数据是:"&label& " |”)
  objprinter.Writeline("| |")
  objprinter.Writeline("|_________________________________|")
  objprinter.close //断开与打印机的连接
  set objprinter=nothing
  set objfs=nothing // 关闭FileSystem组件对象
  end function
  </script>

  服务器端脚本:
  <%………
  set conn=server.CreateObject ("adodb.connection")
  conn.Open "DSN=name;UID=XXXX;PWD=XXXX;"
  set rs=server.CreateObject("adodb.recordset")
  rs.Open(“select ……”),conn,1,1
  ……….%> //与数据库进行交互

  HTML页面编码:
  <HTML>
  ………
  <FORM ID=printinfo NAME="printinfo" >
  <INPUT type="button" value="打印>>" id=print name=print > //调用打印函数
  <INPUT type=hidden id=text1 name=label value=<%=………%>> //保存服务器端传来的数据
  ………
  </HTML>

ASP程式碼把圖片上傳至資料庫

除了運用另外下載的元件以外,ASP本身也有能力把一張圖片上傳到一般資料庫去‧ 感興趣的網友不要錯過喔!


用純ASP代碼實現圖片上傳并存入數據庫中
用ASP編寫網站應用程序時間長了﹐難免會遇到各式各樣的問題﹐其中關于如何上傳文件到服務器恐怕是遇見最多的問題了﹐尤其是上傳圖片﹐比如你想要在自己的社區里面實現類似網易虛擬社區提供的“每日一星”的功能﹐就要提供給網友上傳照片的功能。上傳圖片文件到服務器可以使用各種免費的文件上傳組件﹐使用起來功能雖然很強大﹐但是由于很多情況下﹐我們只能使用免費的支持ASP的空間或者租用別人的虛擬空間﹐對于第一種情況﹐我們根本就沒有可能來使用文件上傳組件﹔至于第二種情況﹐我們也要付出不少的“銀子”才可以。除非你擁有自己的虛擬主機﹐你就可以隨便的在服務器上面安裝自己所需要的組件﹐這種情況對于大多數人來說是可望而不可及的。那我們就沒有辦法了嗎﹖呵呵﹐答案是肯定的〔當然是肯定的了﹐要不然我也沒法寫出這篇文章啊〕。下面就讓我們一起來使用純ASP代碼來實現圖片的上傳以及保存到數據庫的功能〔順便也實現顯示數據庫中的圖片到網頁上的功能〕。

首先我們先來熟悉一下將要使用的對象方法。我們用來獲取上一個頁面傳遞過來的數據一般是使用Request對象。同樣的﹐我們也可以使用Request對象來獲取上傳上來的文件數據﹐使用的方法是Request.BinaryRead()。而我們要從數據庫中讀出來圖片的數據顯示到網頁上面要用到的方法是﹕

Request.BinaryWrite()。在我們得到了圖片的數據﹐要保存到數據庫中的時候﹐不可以直接使用Insert語句對數據庫進行操作﹐而是要使用ADO的AppendChunk方法﹐同樣的﹐讀出數據庫中的圖片數據﹐要使用GetChunk方法。各個方法的具體語法如下﹕

* Request.BinaryRead語法﹕

variant = Request.BinaryRead(count)

參數

variant

返回值保存著從客戶端讀取到數據。

count

指明要從客戶端讀取的數據量大小﹐這個值小于或者等于使用方法Request.TotalBytes得到的數據量。

* Request.BinaryWrite語法﹕

Request.BinaryWrite data

參數

data

要寫入到客戶端瀏覽器中的數據包。

* Request.TotalBytes語法﹕

variant = Request.TotalBytes

參數

variant

返回從客戶端讀取到數據量的字節數。

* AppendChunk語法

將數據追加到大型文本﹑二進制數據 Field 或 Parameter 對象。

object.AppendChunk Data

參數

object Field 或 Parameter 對象

Data 變體型﹐包含追加到對象中的數據。

說明

使用 Field 或 Parameter 對象的 AppendChunk 方法可將長二進制或字符數據填寫到對象中。在系統內存有限的情況下﹐可以使用 AppendChunk 方法對長整型值進行部分而非全部的操作。

* GetChunk語法

返回大型文本或二進制數據 Field 對象的全部或部分內容 。

variable = field.GetChunk( Size )

返回值

返回變體型。

參數

Size 長整型表達式﹐等于所要檢索的字節或字符數。

說明

使用 Field 對象的 GetChunk 方法檢索其部分或全部長二進制或字符數據。在系統內存有限的情況下﹐可使用 GetChunk 方法處理部分而非全部的長整型值。

GetChunk 調用返回的數據將賦給“變量”。如果 Size 大于剩余的數據﹐則GetChunk 僅返回剩余的數據而無需用空白填充“變量”。如果字段為空﹐則GetChunk 方法返回 Null。

每個后續的 GetChunk 調用將檢索從前一次 GetChunk 調用停止處開始的數據。但是﹐如果從一個字段檢索數據然后在當前記錄中設置或讀取另一個字段的值﹐ADO 將認為已從第一個字段中檢索出數據。如果在第一個字段上再次調用 GetChunk 方法﹐ADO 將把調用解釋為新的 GetChunk 操作并從記錄的起始處開始讀取。如果其他 Recordset 對象不是首個 Recordset 對象的副本﹐則訪問其中的字段不會破壞 GetChunk 操作。

如果 Field 對象的 Attributes 屬性中的 adFldLong 位設置為 True﹐則可以對該字段使用 GetChunk 方法。

如果在 Field 對象上使用 Getchunk 方法時沒有當前記錄﹐將產生錯誤 3021

〔無當前記錄〕。

接下來﹐我們就要來設計我們的數據庫了﹐作為測試我們的數據庫結構如下〔Access97〕﹕

字段名稱    類型    描述

  id    自動編號   主鍵值

img OLE對象   用來保存圖片數據 


對于在MS SQL Server7中﹐對應的結構如下﹕

字段名稱    類型    描述

  id     int(Identity) 主鍵值

img   image     用來保存圖片數據 


現在開始正式編寫我們的純ASP代碼上傳部分了﹐首先﹐我們有一個提供給用戶的上傳界面﹐可以讓用戶選擇要上傳的圖片。代碼如下
upload.htm﹕

<html>

<body>

<center>

<form name="mainForm" enctype="multipart/form-data" action="process.asp" method=post>

<input type=file name=mefile><br>

<input type=submit name=ok value="OK">

</form>

</center>

</body>

</html>


注意代碼中黑色斜體的部分﹐一定要在Form中有這個屬性﹐否則﹐將無法得到上傳上來的數據。

接下來﹐我們要在process.asp中對從瀏覽器中獲取的數據進行必要的處理﹐因為我們在process.asp中獲取到的數據不僅僅包含了我們想要的上傳上來的圖片的數據﹐也包含了其他的無用的信息﹐我們需要剔除冗余數據﹐并將處理過的圖片數據保存到數據庫中﹐這里我們以Access97為例。具體代碼如下process.asp﹕

<%

response.buffer=true

formsize=request.totalbytes

formdata=request.binaryread(formsize)

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

mydata=midb(formdata,datastart,dataend)


set connGraph=server.CreateObject("ADODB.connection")

connGraph.ConnectionString="driver={Microsoft Access Driver (*.mdb)};DBQ=" &

server.MapPath("images.mdb") & ";uid=;PWD=;"

connGraph.Open


set rec=server.createobject("ADODB.recordset")

rec.Open "SELECT * FROM [images] where id is null",connGraph,1,3

rec.addnew

rec("img").appendchunk mydata

rec.update

rec.close

set rec=nothing

set connGraph=nothing

%>


好了﹐這下我們就把上傳來的圖片保存到了名為images.mdb的數據庫中了﹐剩下的工作就是要將數據庫中的圖片數據顯示到網頁上面了。一般在HTML中﹐顯示圖片都是使用<IMG>標簽﹐也就是<IMG SRC="圖片路徑">﹐但是我們的圖片是保存到了數據庫中﹐“圖片路徑”是什么呢﹖呵呵﹐其實這個SRC屬性除了指定路徑外﹐也可以這樣使用哦﹕

<IMG SRC="showimg.asp?id=xxx">

所以﹐我們所要做的就是在showimg.asp中從數據庫中讀出來符合條件的數據﹐并返回到SRC屬性中就可以了﹐具體代碼如下
showimg.asp﹕
<%

set connGraph=server.CreateObject("ADODB.connection")

connGraph.ConnectionString="driver={Microsoft Access Driver (*.mdb)};DBQ=" &

server.MapPath("images.mdb") & ";uid=;PWD=;"

connGraph.Open

set rec=server.createobject("ADODB.recordset")

strsql="select img from images where id=" & trim(request("id"))

rec.open strsql,connGraph,1,1

Response.ContentType = "image/*"

Response.BinaryWrite rec("img").getChunk(7500000)

rec.close

set rec=nothing

set connGraph=nothing

%>


注意在輸出到瀏覽器之前一定要指定Response.ContentType = "image/*"﹐以便正常顯示圖片。

最后要注意的地方是﹐我的process.asp中作的處理沒有考慮到第一頁(upload.htm)中還有其他數據﹐比如<INPUT type=tesxt name=userid>等等﹐如果有這些項目﹐你的process.asp就要注意處理掉不必要的數據。

怎么樣﹐其實上傳圖片并保存到數據庫很簡單吧﹐這樣再也不用為自己的空間無法使用各類的上傳組件發愁了吧。還等什么﹖趕快試一試吧。


〔以上所有程序均在WinNT4.0﹐IIS4﹐Access97/MS SQL Server7.0中運行通過〕

關於IFRAME 自適應高度的研究

代碼如下:


<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>New Page 1</title>
</head>
<body>
<IFRAME id="test" name="test" frameBorder=0 scrolling=no src="http://10.107.2.199:2500/cn/asp/reg.asp" width="100%" height=0></IFRAME>
</body>
</html>
<SCRIPT FOR=window EVENT=onload LANGUAGE="JScript">
document.all("test").height=test.document.body.scrollHeight;
</SCRIPT>


重要提示:src=中你必須填寫的網頁地址,一定要和本頁面在同一個站點上,否則,會抱錯,說“拒絕訪問!”

之前自己也碰到過這個問題,爲了得到答案去網上搜索,發現有不少人也遇到了這樣的問題,現在就把解決方法共用一下,超簡單哦

1、建立一個bottom.js的文件,然後輸入下面的代碼(只有兩行哦)

parent.document.all("框架ID名").style.height=document.body.scrollHeight;
parent.document.all("框架ID名").style.width=document.body.scrollWidth;


這裏的 框架ID名 就是Iframe的ID,比如:
<IFRAME id="框架ID名" name="left" frameBorder=0 scrolling=no src="XXX.asp" width="100%"></IFRAME>

2、給你網站裏所有的被包含文件裏面每個都加入

<script language = "JavaScript" src = "bottom.js"/></script>


3、OK,收工!

我在WINXP、IE6下面測試通過。很簡單吧!
----------------------------------------------
Iframe自適應高度

<script language="JavaScript">
//** iframe自動適應頁面 **//
//輸入你希望根據頁面高度自動調整高度的iframe的名稱的列表
//用逗號把每個iframe的ID分隔. 例如: ["myframe1", "myframe2"],可以只有一個表單,則不用逗號。
//定義iframe的ID
var iframeids=["content"]
//如果用戶的瀏覽器不支援iframe是否將iframe隱藏 yes 表示隱藏,no表示不隱藏
var iframehide="yes"
function dyniframesize()
{
var dyniframe=new Array()
for (i=0; i<iframeids.length; i++)
{
if (document.getElementById)
{
//自動調整iframe高度
dyniframe[dyniframe.length] = document.getElementById(iframeids[i]);
if (dyniframe[i] && !window.opera)
{
dyniframe[i].style.display="block"
if (dyniframe[i].contentDocument && dyniframe[i].contentDocument.body.offsetHeight) //如果用戶的瀏覽器是NetScape
dyniframe[i].height = dyniframe[i].contentDocument.body.offsetHeight;
else if (dyniframe[i].Document && dyniframe[i].Document.body.scrollHeight) //如果用戶的瀏覽器是IE
dyniframe[i].height = dyniframe[i].Document.body.scrollHeight;
}
}
//根據設定的參數來處理不支援iframe的瀏覽器的顯示問題
if ((document.all || document.getElementById) && iframehide=="no")
{
var tempobj=document.all? document.all[iframeids[i]] : document.getElementById(iframeids[i])
tempobj.style.display="block"
}
}
}
if (window.addEventListener)
window.addEventListener("load", dyniframesize, false)
else if (window.attachEvent)
window.attachEvent("onload", dyniframesize)
else
window.onload=dyniframesize
</script>

避免asp的SQL的執行效率低

今天在網路上看到這一篇文章, 很實用, 把它貼出來, 由於轉載的網站亦不知其原作者僅說為網路文章, 因為無法列出原作者, 若此文為您所創, 歡迎與我聯繫, 我會將您的大名給列上去的, 謝謝!

方法一、儘量使用複雜的SQL來代替簡單的一堆 SQL.
同樣的事務,一個複雜的SQL完成的效率高於一堆簡單SQL完成的效率。有多個查詢時,要善於使用JOIN。
oRs=oConn.Execute("SELECT * FROM Books")
while not oRs.Eof
strSQL = "SELECT * FROM Authors WHERE AuthorID="&oRs("AuthorID") oRs2=oConn.Execute(strSQL)
Response.write oRs("Title")&">>"&oRs2("Name")&"
&q uot;
oRs.MoveNext()
wend

要比下面的代碼慢:
strSQL="SELECT Books.Title,Authors.Name FROM Books JOIN Authors ON Authors.AuthorID=Books.AuthorID"
oRs=oConn.Execute(strSQL)
while not oRs.Eof
Response.write oRs("Title")&">>"&oRs("Name")&"
&qu ot;
oRs.MoveNext()
wend


方法二、儘量避免使用可更新 Recordset
oRs=oConn.Execute("SELECT * FROM Authors WHERE AuthorID=17",3,3)
oRs("Name")="DarkMan"
oRs.Update()

要比下面的代碼慢:
strSQL = "UPDATE Authors SET Name='DarkMan' WHERE AuthorID=17"
oConn.Execute strSQL


方法三、更新資料庫時,儘量採用批處 理更新
將所有的SQL組成一個大的批次處理SQL,並一次運行;這比一個一個地更新資料要有效率得多。這樣也更加滿足你進行事務處理 的需要:
strSQL=""
strSQL=strSQL&"SET XACT_ABORT ON;" & vbcrlf
strSQL=strSQL&"BEGIN TRANSACTION;" & vbcrlf
strSQL=strSQL&"INSERT INTO Orders(OrdID,CustID,OrdDat) VALUES('9999','1234',GETDATE());" & vbcrlf
strSQL=strSQL&"INSERT INTO OrderRows(OrdID,OrdRow,Item,Qty) VALUES('9999','01','G4385',5);" & vbcrlf
strSQL=strSQL&"INSERT INTO OrderRows(OrdID,OrdRow,Item,Qty) VALUES('9999','02','G4726',1);" & vbcrlf
strSQL=strSQL&"COMMIT TRANSACTION;" & vbcrlf
strSQL=strSQL&"SET XACT_ABORT OFF;" & vbcrlf
oConn.Execute(strSQL)

其中,SET XACT_ABORT OFF 語句告訴SQL Server,如果下面的事務處理過程中,如果遇到錯誤,就取消已經完成的事務。

方法四、資料庫索引
那些將在Where子句中出現的欄位,你應該首先考慮建立索引;那些需要排序的欄位,也應該在考慮之列 。
在MS Access中建立索引的方法:在Access裏面選擇需要索引的表,點擊“設計”,然後設置相應欄位的索引.
在MS SQL Server中建立索引的方法:在SQL Server管理器中,選擇相應的表,然後“設計表”,點擊右鍵,選擇“Properties”,選擇“indexes/keys”

方法五、避免使Text欄位太大
當字串的值大小不固定時,用varchar比用char的效果要好 些。我曾經看到一個例副程式,欄位被定義爲TEXT(255),但是他的取值經常只有20個字元。這個資料表有50k個記錄,從而使這個資料庫很大,大的資料庫必然較慢。

ASP 使用 unicode 來 coding 時

要加

<%@CodePage=65001%>
<%
session.codepage=65001
Response.Charset="utf-8"
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
......
</body>
</html>


2007年2月9日 星期五

ASP 的 Query String 以 unicode 傳送的方法

原本寫法是
<a href="a.asp?p=同事>

改成
<a href="a.asp?p=<%=escape("同事")%>>

要轉回原本的字
<%=unescape("%u1234%u4568")%>

2007年2月8日 星期四

URL Encode 與 Decode 的 Function

Public Function urlDecode(s As String) As String
If Len(s) = 0 Then Exit Function
Dim i As Integer
Dim tmp As String
Dim c As String
For i = 1 To Len(s)
c = Mid$(s, i, 1)
If c = "+" Then c = " "
If c = "%" Then
c = Chr$("&H" + Mid$(s, i + 1, 2))
i = i + 2
End If
tmp = tmp + c
Next i
urlDecode = tmp
End Function

Public Function urlEncode(s As String) As String
If Len(s) = 0 Then Exit Function

Dim tmp As String
Dim c As String
Dim i As Integer

For i = 1 To Len(s)
c = Mid(s, i, 1)
If (Asc(c) >= 65 And Asc(c) <= 90) _
Or (Asc(c) >= 97 And Asc(c) <= 122) _
Or (Asc(c) >= 48 And Asc(c) <= 58) _
Or Asc(c) = 38 _
Or (Asc(c) >= 45 And Asc(c) <= 47) _
Or Asc(c) = 58 Or Asc(c) = 61 _
Or Asc(c) = 63 Or Asc(c) = 126 Then
tmp = tmp + c
Else
tmp = tmp + "%" + Hex(Asc(c))
End If
Next i
urlEncode = tmp
End Function

檔名以 Timestamp 來命名的coding

Public Sub setFilename(filename__param)
myDate = DatePart("yyyy", Now()) & "_" & DatePart("m", Now()) & "_" & DatePart("d", Now())
myTime = Hour(Now()) & "_" & Minute(Now()) & "_" & Second(Now())
filename = myDate & "__" & myTime & ".csv"
End Sub