2015年3月23日 星期一

asp判斷是否為英文或數字

方法一:
<%
'Response.Write(isValidate("ac4中123") & "<br>")
'Response.Write(isValidate("ac4123") & "<br>")


Function isValidate(str)
  Dim re
  Set re = new RegExp
  re.Pattern = "[^a-zA-Z0-9]"
  isValidate = re.Test(str)
End Function
%>




方法二:

function ContainsChtString(str)
  dim x,tmp
  tmp = false
  for x = 1 to len(str)
    if asc(mid(str,x,1)) > 32 and asc(mid(str,x,1)) < 127 then
      tmp = true
      exit for
    end if
  next
  ContainsChtString= tmp
end function


if ContainsChtString(Name) then
  error_mag = "字串包含特殊符號、數字和大小寫英文字"
end if


原先查到的資料是判斷
 asc(mid(str,x,1)) < 0 ,ascii碼小於零,即中文字,但後來發現,中文字中間夾英數字,就判斷不出來了。

所以改寫成 asc(mid(str,x,1)) > 32 and asc(mid(str,x,1)) < 127
判斷包含特殊符號、數字和大小寫英文字


================================

如果要判斷是否為數字
IsNumeric()

================================




2015年3月20日 星期五

mssql資料型態介紹: nvarchar, ntext


n        unicode
var     非固定長度,4000字以內的文字
ntext  unicode,4000字以上的文字


varchar
長度為 n 個字元之可變長度非 Unicode 字元資料。n 必須介於 1 至 8,000,儲存大小為實際輸入資料的長度,而非 n 個位元組。輸入的資料長度可以是 0 字元。

ntext
可變長度的 Unicode 資料,最大長度為 2^30 - 1 (1,073,741,823) 個字元。


適用時機:
varchar:
當你的字元長度少於8000個字元,且字元內容無須以 unicode 格式儲存時,可選擇varchar 註:一個中文字及一個英文字母皆算一個字元

ntext:
在 SQL Server 中,Unicode 資料是使用 nchar、nvarchar 和 ntext 資料型別來儲存。設成這些資料型別的資料行可儲存來自多個字元集的字元。若資料行項目所包含的 Unicode 字元個數並不一致 (最多為 4,000) ,請使用 nvarchar。若資料行每個項目的長度是固定的 (最多為 4,000 個 Unicode 字元),請使用 nchar。若資料行的任何項目長度超過 4,000 個 Unicode 字元,則使用 ntext。



這篇教學文章寫得很好(出處 http://www.dotblogs.com.tw/jeff-yeh/archive/2010/11/14/19440.aspx)

認識Char/NChar/VarChar/NVarChar/Text/NText


Char/NChar/VarChar/NVarChar/Text/NText,這幾個資料型別或許有些人很熟,有些人只熟其中幾個,尤其是程式設計師,不碰DB Design的,如果有碰到,也可能依"慣例"的去設定資料型別,所以不難看見,有些Table資料型別很單調,看的到的型別不多,只要是存文字的,都是NVarChar,或許在瞭解後,可以做出更好的規劃.
其實這個的識別方式很簡單.


  • 帶Var的 : 代表就是非固定長度的型別,所以Var在存不固定長度的資料時,會較省空間,
  • 帶N的 : 就是支援Unicode,但要注意,儲存的資料會大兩倍.

這樣就把Char全部講完,剩Text跟Char有什麼不同,Text的特性跟VarChar一樣,只是用來儲存大量的文字資料,但後來的VarChar也做了調整,也可以存大量的文字資料,所以Text在未來新版的DB會移除.


  • Char的長度為1~8000
  • VarChar的長度為1~8000,如果是VarChar(max)就是2^31-1 位元組,VarChar(max)只有SQL2005(含)以上才支援,SQL2000就沒有.
  • Text的長度為2^31-1,它的長度跟VarChar(max)是一樣的.


如果您有支援多國語言的網站,請考慮利用 Unicode nchar 或 nvarchar 資料類型,將字元轉換問題減到最少。如果您使用 char 或 varchar,我們建議您執行下列動作:

  • 當資料行資料項目的大小一致時,請使用 char。
  • 當資料行資料項目的大小變化相當大時,請使用 varchar。
  • 當資料行資料項目的大小變化相當大,且大小可能超出 8,000 位元組時,請使用 varchar(max)。



2015年3月15日 星期日

IUSR & IWAM


IUSR
Internet 來賓帳戶
匿名存取 Internet Information Services 的內建帳戶





IWAM

啟動 IIS 處理程序帳戶
從作業應用程式啟動的內建 Internet Information Services 帳戶






2015年3月12日 星期四

asp實作線上人數



Application 物件的應用

Application 物件可以用來保存總體變數,這些變數將保留到伺服器關機為止,由於這些變數在保存時不會去區分個別用戶端的連線編號(Session ID),因此無論是哪個用戶端都可以讀寫,利用這個特性我們可以很容易開發出計數器與聊天室的功能。

下面的例子,當參觀者連線到首頁時,就累計人數:

<%
Application.Lock
 Application("count")=Application("count")+1
 Application.Unlock
 %>
累計參觀人次:<% =Application("count") %>

在操作 Application 物件時要特別注意寫入衝突的問題,當參觀者同時上線時,由於大家所存取的 Application 變數是同一個,如果不把它鎖定就直接寫入,會造成計數不正確的現象。Application.Lock 就是用來鎖定物件,防止他人寫入。當物件被鎖定時,其他人就會暫停執行程式,等到鎖定解除後才會繼續執行。

如果要製作的計數器是線上人數,則不可以只累加而不減少,正確的作法應該是在參觀者上線時加 1,離線時減 1,特別要注意的是參觀者上線時,並不一定都會去連首頁,所以進行計數的程式不能寫在首頁中,首頁頂多只是用來秀出人數而已。

要達到這個功能必須使用 Session 物件所提供的兩個事件處理器:onStart 和 onEnd,前者在參觀者連線時會自動觸發執行,後者在離線時觸發執行。而要定義這兩個事件處理器,只能將程式寫在 global.asa 檔案中,這個檔案必須建立在網站主目錄的根目錄中,而且一個虛擬站台只能有一份 global.asa。程式語法如下:

<script language="VBScript" runat="SERVER">
 SUB Session_onStart
     Application.Lock
     Application("online")=Application("online")+1
     Application.Unlock
 END SUB

 SUB Session_onEnd
     Application.Lock
     Application("online")=Application("online")-1
     Application.Unlock
 END SUB
 </script>

global.asa 程式存檔後就會立即生效,現在我們就可以找個適當的網頁,來顯示線上人數:

現在有<% =Application("online") %>人上線

補充說明:Application 物件也有提供 onStart 和 onEnd 事件處理器,前者在 IIS 啟動時自動執行,後者在 IIS 關閉時執行。




來源:
http://www.spps.tp.edu.tw/documents/memo/asp_develop.htm

2015年3月9日 星期一

執行 ASP 網頁導致回應緩衝區超出其設定限制



回應物件 錯誤 'ASP 0251 : 80004005'

超出回應緩衝區限制

執行 ASP 網頁導致回應緩衝區超出其設定限制。


解法:
調整metabase 。參考這篇
開啟 C:\WINDOWS\system32\inetsrv\metabase.xml
AspBufferingLimit="4194304"                     \\下載限制
AspMaxRequestEntityAllowed="204800"   \\上傳限制


解法:
在第一行加入這一句

<% Response.Buffer = False %>




2015年3月8日 星期日

filesystemobject取得資料夾內的檔案名稱





fPath = Server.MapPath("file\")

Set fs=Server.CreateObject("Scripting.FileSystemObject")
'擷取使用者上傳檔名
Set folder = fs.GetFolder(fPath)
For each f in folder.files
fName = f.Name
Next

set fs=nothing

2015年3月5日 星期四

trigger 初體驗

trigger真是不錯的好東西




善心人士寫的入門指導文章 : http://deanma.blogspot.tw/2012/02/ms-sql-triggertable.html

的指導範例 :
--建立測試表格
CREATE TABLE [dbo].[WIPPrd](
    [ProdNo] [varchar](16) NOT NULL,
    [PnameD] [nvarchar](100) NULL,
    [PType] [varchar](4) NULL,
    [InDay] [datetime] NULL,
    [UsrNo] [varchar](10) NULL,
    [UsrCo] [varchar](5) NULL) ON [PRIMARY]
 
--建立記錄檔
CREATE TABLE [dbo].[WIPPrd_Log](
    [MState] [varchar] (10) NOT NULL,
    [ProdNo] [varchar](16) NOT NULL,
    [PnameD] [nvarchar](100) NULL,
    [PType] [varchar](4) NULL,
    [InDay] [datetime] NULL,
    [UsrNo] [varchar](10) NULL,
    [UsrCo] [varchar](5) NULL )    

--建立TRIGGER-在WIPPrd表格更新、新增、刪除後觸發
CREATE TRIGGER dbo.TR_WIPPrd_Modify on dbo.WIPPrd AFTER UPDATE,INSERT,DELETE
AS
BEGIN  
    --表格異動資料時會產生暫存的inserted和deleted兩個表格
    --兩個表格格式資訊皆與原表格相同
    --inserted紀錄insert資料、update後資料
    --deleted紀錄delete資料、update前資料
    
    --依據異動方式將異動資料新增到記錄檔
    --inserted和deleted皆有資料表示為-UPDATE
    IF EXISTS (select 1 from inserted) and EXISTS (select 1 from deleted)
    BEGIN      
        insert into WIPPrd_Log select 'DELETE',* from deleted
        insert into WIPPrd_Log select 'INSERT',* from inserted
    END
    --inserted有資料deleted無資料表示為-INSERT
    ELSE IF EXISTS (select 1 from inserted) and Not EXISTS (select 1 from deleted)
        insert into WIPPrd_Log select 'INSERT',* from inserted
    --inserted無資料deleted有資料表示為-DELETE
    ELSE IF NOT EXISTS (select 1 from inserted) and EXISTS (select 1 from deleted)
        insert into WIPPrd_Log select 'DELETE',* from deleted 
END


--測試
--清空資料 
delete from WIPPrd 
delete from WIPPrd_log
--新增資料
insert into WIPPrd values ('11','TEST_11','11',GETDATE(),'Dean','10001')
insert into WIPPrd values ('22','TEST_22','22',GETDATE(),'Dean','10001')
--更新資料
update WIPPrd set ProdNo='33',PnameD='TEST_33' where ProdNo='22'
--刪除資料
delete from WIPPrd
--查詢記錄檔
select * from WIPPrd_log



------------------------------------------------------------
INSERT     11    TEST_11    11    2012-02-26 14:17:47.750    Dean    10001
INSERT     22    TEST_22    22    2012-02-26 14:17:47.763    Dean    10001
DELETE    22    TEST_22    22    2012-02-26 14:17:47.763    Dean    10001
INSERT     33    TEST_33    22    2012-02-26 14:17:47.763    Dean    10001
DELETE    33    TEST_33    22    2012-02-26 14:17:47.763    Dean    10001
DELETE    11    TEST_11    11    2012-02-26 14:17:47.750    Dean    10001

將儲存功能寫在另一個asp裡面

將儲存功能寫在另一個asp裡面

案例一:
將儲存功能寫在另一個asp裡面,js定義兩個父子視窗關係

在父視窗(f100.asp)按下儲存按鈕,
利用button onclick開啟子視窗(b010.asp),執行儲存功能,
js關閉子視窗,且重整父視窗。


f100.asp

<form name="frmform" method="post" action="f100.asp?id=<%=P_id%>&no=<% =P_no%>">

   <input type=button value="儲存" onclick='run_submit();' class="formcss">

'...



</html>
 <script language="javascript">

  function run_submit(){
         var url="b010.asp"

 frmform.action=url;
 var xwin = Newopenurl("about:blank","xwin","");
 frmform.target = "xwin";
 if(xwin.opener==null) xwin.opener=window; //設定新視窗和舊視窗的關係
 frmform.submit();

   }
   </script>



b010.asp

'儲存功能
'...


<script language=javascript>
  //關閉子視窗,且重整父視窗。
  window.close();
  window.opener.location.reload();

</script>


**********************************

案例二:
將儲存功能寫在另一個asp裡面,(不開啟子視窗)


在網頁(watchgrant_f010.asp)按下儲存按鈕,
導入第二個網頁(watchgrant_q010.asp)執行儲存功能,
儲存功能執行完畢後,再利用js導回第一個網頁。

註 : 第一個網頁有兩個form,與此案例沒有什麼關係。



f010.asp

<!--撰寫2個form-->

<!--第一個form-->
<form name="form" method="post" action="f010.asp?id=<%=P_id%>&no=<%=p_no%>">

<!--第二個form-->
<!--第二個form,將儲存功能寫在另一個asp裡面,-->
<form name="form1" method="post" action="q010.asp?id=<%=P_id%>&no=<%=P_no%>" >

   <INPUT class=formcss_other  type=submit value="儲存" name=save>



q010.asp

'儲存功能
'...

<script language=javascript>
alert ("個人費用登記作業成功!!")
        window.location.href="/f010.asp?id=<%=P_id%>&no=<%=p_no%>"
</script>


完畢。