Search Results for '프로그래밍/Asp'


198 posts related to '프로그래밍/Asp'

  1. 2009/05/16 이미지 링크가 깨졌을때 이미지 대체 스크립트
  2. 2009/05/16 ASP 불법 게시물 자동 등록 막기 2
  3. 2009/04/27 textarea 에 asp 코딩 편하게~ 1
  4. 2009/04/27 ASP로 테스트 해본 RSS Reader
  5. 2009/04/27 ASP용 로그 기록 클래스
  6. 2009/04/27 사진 업로드시 워터 마크 자동 입력 프로그램입니다.
  7. 2009/04/27 WireFrame.ASP 소개
  8. 2009/04/27 GeoIP 국가별 IP체크
  9. 2009/04/27 페이지 수행시간 체크 심플컴퍼넌트(백만분의1초 정확성)
  10. 2009/04/27 Classic ASP용 XMLRPC Class
  11. 2009/04/27 Classic ASP용 Database Object
  12. 2009/04/27 외부 이미지 저장 소스
  13. 2009/04/21 FSO example
  14. 2009/04/21 read/write configuration class (xml version)
  15. 2009/04/21 dbhelper class
  16. 2009/04/21 view source &asp coloring
  17. 2009/04/21 Class implementation for using webservices in ASP
  18. 2009/04/21 ASP JSON Utility
  19. 2009/04/21 먼저 아래와 같이 c#을 작성하여 test.cs로 저장합니다.
  20. 2009/04/12 [ASP소스] MD5 암호화소스
  21. 2008/02/21 ASP 함수 모음
  22. 2008/02/21 SQL Server에서 사용할 수 있는 서버측 페이징기법
  23. 2008/02/21 아바타를 꾸미는 소스!!
  24. 2008/02/21 ASP페이지를 정적인 HTML파일로 만들기
  25. 2008/02/21 ASP + MySQL 연동
  26. 2008/02/21 FileSystemObject를 이용한 폴더(디렉토리) 생성하기
  27. 2008/02/21 HOWTO: 세션 쿠키를 사용하지 않고 값을 보존하는 방법
  28. 2008/02/21 저장된 html 파일을 이용한 메일 발송하기
  29. 2008/02/21 ASP에서 Redim() 함수를 이용한 동적배열 사용
  30. 2008/02/21 Html내의 Table을 엑셀로 저장하기
// 게시판 리스트 페이지(List.asp)

먼저 특정 쿠키를 만든다, 이 쿠키값은 처리 페이지에서 세션값과 비교하여 같을때만 게시물을 등록 시킨다.


즉 쿠키값이 없이 곧바로 쓰기 페이지에서 게시물을 등록하는 경우에는 게시물이 등록될 수 없다.

checker1 에 현재의 세션아이디 우측 4자리를 저장 한다.


<%
response.expires=0
response.cookies("checker1") = Right(Session.sessionid, 4) '//게시물 자동 등록을 막기위한 쿠키선언
%>



//쓰기 페이지 (Write.asp)


현재의 세션아이디 오른쪽 4자리를 checker2 로 넘긴다


<form name="write_form" action="write_ok.asp?TBL=<%=TBL%>" method="POST">
<input TYPE="hidden" NAME="checker2" VALUE="<%=Right(Session.sessionid, 4)%">



//처리 페이지 (Write_ok.asp)


리스트페이지에서 만들어진 쿠키값과 쓰기페이지에서 넘어온 세션값(우측4자리)를 비교하여, 일치하지 않으면 강퇴, 일치하면 저장한다.


<%

checker2 = Request("checker2")
If request.cookies("checker1") <> checker2 Then '쿠키값과 세션값이 같지 않으면

 Response.Write "<script language='javascript'> window.alert('유효하지 않는 쓰기요청 입니다!'); history.back();</script>"
else

.

.

처리

.

.

end if


%>

2009/05/16 06:23 2009/05/16 06:23
못말리는 삽질본능 !!!

textarea 에 VS수준의 인텔리센스 기능을 탑재시켜주는
야심찬 계획의 프로토타입 입니다

<%
set db = server.createobject("adodb.connection")
db.open application("connectionstring")
set rs = db.execute("select getdate() as current_time")
....
정도 구문은 무난하군요
2009/04/27 19:49 2009/04/27 19:49
춘잡니다.

질문에 대한 해결책으로 만들다 보니 간략한  RSS리더가 되버렸네요.

RSS의 출력 XML형식은 표준이니 RSS리더 공부하시거나 원격지 서버의 XML Data를

핸들링 하는 법이 포함되어 있습니다.

지극히 간단한 코드이며 Javascript로 변환도 가능하지만 Javascript로 변환하게되면 IE전용으로 변쉰합니다.

DOM 선언 부분이 FF, IE, Opera 각가 다른 방법을 사용합니다.

일단 ASP로 리더를 한번 구현 해보시고 싶으시다면 참고해보시기 바랍니다.

소스에 있는 내용이 꼭 정답은 아닙니다.

XML DOM을 핸들링 하는 방법은 여러가지가 있기 때문이죠.

ChildNode, document.getElementTagName 와 같이 혼용할 수도 있습니다.

그럼~

PS. .net로 가게되면 거의 표준으로 코딩해야 합니다. ^^
2009/04/27 19:44 2009/04/27 19:44
ASP용 로그 기록 클래스

많은 개발자들이 개발을 하면서 중간 중간 소스에 Response.Write 변수 를 추가 합니다.

이유는 디버깅 용이죠! ^^

하지만, 개발 완료 후 삭제도 해야 하고 혹여나 깜빡하고서 누락하는 경우가 있는데요.

누락한 것 중 지저분 해지기만 하고 문제가 되진 않지만 어떤 사람들은 dB 커넥션 문자열을 찍어서

노출이 되는 경우도 있기도 합니다. ㅎㅎㅎ

공개 소스 중에는 Log4J라는 모듈이 있습니다만, 이건 JSP, Ruby, .Net 용으로만 있고 ASP용은 없지요.

그래서 아쉬운 대로 만들어 봤습니다.

제가 생각했을 때 이 클래스를 사용하므로서 얻을 수 있는 이득을 나열해 보죠.


1. 운영 중에도 에러나 기타 정보를 기록하여 디버깅 및 유지보수에 용의합니다.
2. 실수로 중요 정보가 외부에 노출되는 것을 방지합니다. (예: Response.Write에 의해)
3. 확장 함수를 이용하여 받아들인 파라미터 등을 기록하는 것이 가능합니다.
4. 로그 레벨을 이용 하여 기록 기준을 정의 할 수 있으므로 성능이 나빠지는 것에 대응 할 수 있습니다.
5. 파일에 기록이 되므로 언제든 역 추적이 가능합니다. ( 1번과 비슷 한 내용이네요 ^^ )

다음은 사용 예입니다.

<!--#include virtual="ClsLogger.asp"//-->
<%On Error Resume Next%>
<%
'// Logger
Dim oLog : Set oLog = New ClsLogger

'// Request Log
TraceRequestParameter oLog

'//      FATAL : 치명적 에러
oLog.Fetal "치명적 에러!!! 관리자 빨리 보삼. : " & Err.Description

'//      ERROR : 수행 가능한 정도의 에러
oLog.Error "또 에러냐!!! : " & Err.Description

'//      WARN : 문제를 일으킬 가능성의 정보
oLog.Warn "이건 귀찮아서 처릴 안했단 말이오!!! : "

'//      INFO : 정보를 나타낼 때 사용
oLog.Info "게시판 목록 시작"

'//      DEBUG : 상세 정보를 나타낼 때 사용
oLog.Debug "지금은 개발 중..."

If ( Err.Number = 0 ) Then
   oLog.Debug "완료"
Else
   oLog.Error Err.Description
End If


'------------------------------------------------------------------------------------
'// Request 객체의 파라미터 값을 로그에 기록한다.
'// 이 함수는 ClsLogger에 포함 시킬지 말지 고민중 ... ㅠㅠ
'------------------------------------------------------------------------------------
Sub TraceRequestParameter(ByRef pLog)

   On Error Resume Next

   Dim pContentType : pContentType = LTrim(Request.ServerVariables("CONTENT_TYPE"))

   If ( InStr(pContentType, "multipart/form-data") > 0 ) Then
      Exit Sub
   End If

   If ( Not IsObject(pLog) ) Then
      Exit Sub
   End If

   Dim z
   Dim pKeyName
   pLog.Debug "============= FORM PARAMETER ============="
   For z = 1 To Request.Form.Count
      pKeyName = Request.Form.Key(z)
      pLog.Debug "Dim " & pKeyName & " : " & pKeyName & " = RequestForm(""" &
pKeyName & """)"
   Next

   For z = 1 To Request.Form.Count
      pLog.Debug Request.Form.Key(z) & " : " & Request.Form(z)
   Next

   pLog.Debug "========== QUERYSTRING PARAMETER ========="
   For z = 1 To Request.QueryString.Count
      pKeyName = Request.QueryString.Key(z)
      pLog.Debug "Dim " & pKeyName & " : " & pKeyName & " = RequestQuery(""" &
pKeyName & """)"
   Next

   For z = 1 To Request.QueryString.Count
      pLog.Debug Request.QueryString.Key(z) & " : " & Request.QueryString(z)
   Next  
   pLog.Debug "=========================================="

   Err.Clear

   On Error GoTo 0

End Sub
%>

저의 경우 주로 .Error와 .Debug를 사용합니다.

일단 속는 셈 치고 한번 사용해보셔요. ^^

많은 분들이 자기가 원하던 거라고 하시더군요. 다행 다행.

아 그리고 로그뷰어는 "mtail" 이라는 프로그램을 이용합니다. 네이년에서 mtail로 검색을 하시면 쉽게 구 할 수 있어요.

간단하게 소개하면
   기록되는 로그를 실시간으로 모니터링 할 수 있고,
   필터링도 가능합니다. 이 필터링을 이용하면 Error만 볼수도 있고 Debug만 볼수도 있습니다.

유용한 프로그램이에요 ^^
 
그럼 사용해보시고 부족한 부분은 리플 달아주세요~
2009/04/27 19:43 2009/04/27 19:43
사진을 업로드 하면 ASP상에서 해당 이미지에 워터 마크를 입혀 주는 프로그램입니다.
서버에 설치되어서 돌아가는 응용프로그램인 관계로 서버 호스팅 받는 분들만 가능하네요.

아래는 원본 설명입니다.
====================================================
원본글 주소 :
http://dodam.egloos.com/1819734


워터마크 생성 프로그램


워터 마크를 생성해 넣는것이 다 유료라서..
그냥 하나 간단하게 만들어 버렸다.

기능 설명
1. 첨부파일을 서버에 설치한다.
2. 설치된 프로그램을 실행한다. WaterMak.exe
3. 워터 마크용 이미지를 불러온다. (투명처리될 부분은 0, 255, 0 칼라로 맞추어 놓는다. => 연두색)
- 투명처리될 부분은 ASP상에 업로드한 이미지가 보이며, 그이외의 부분은 워터마크의 이미지가 보여지게 된다.
4. dodamSocket.DLL파일을 서버에 등록한다. (구성서비스 이용해서 등록할것.)
4. ASP상에서 파일을 업로드 한다.
- 워터마크가 생성될 이미지를 만든다. (나누미 이미지 플러스 등 활용)
<%
set SendMSG = server.createobject("dodamSocket.SendMsg")
SendMSG.GetConnection = "10299" '// 워터마크 프로그램이 해당 포트로 접속대기중이다.
For i = 0 To 1000
If SendMSG.skState = "T" Then
SendMSG.Str = "MI¥c:\web\test.jpg£"
SendMSG.Str = "MI¥c:\web\test2.jpg£"
Exit For
End if
Next
Set SendMSG = Nothing
%>

이런식으로 웹페이지 상에서 호출을 해 준다.
set SendMSG = server.createobject("dodamSocket.SendMsg") => DLL객체를 생성한다.
SendMSG.GetConnection = "10299" => 서버에 설치해서 띄워 놓은 워터마크 생성 프로그램에 접속한다.
If SendMSG.skState = "T" Then => 소켓 연결이 되었다면...
SendMSG.Str = "MI¥c:\web\test.jpg£" => 워터마크를 넣을 업로드된 이미지의 경로를 넘겨 준다.
MI => MakeImage 명령어
¥ => 구분자
c:\web\test.jpg => 워터 마크를 넣을 원본 이미지 경로
£ => 전송 문자열의 끝임을 알려준다.

위의방식으로 호출을 하게 되면, 원본 이미지는 삭제가 되며
파일명은 동일하며, 확장자는 jpg인 파일이 동일 경로상에 생성이 된다.
ex)
test.jpg업로드시 => test.jpg (워터마크 없는 원본 이미지) 삭제 => test.jpg생성 저장(워터 마크 있는 이미지)
test.gif 업로드시 => test.gif (워터마크 없는 원본 이미지) 삭제 => test.jpg 생성 저장 (워터 마크 있는 이미지)

혹시 사용상의 문제점이 있으면 덧글 달아 주세요.....

2009/04/27 19:37 2009/04/27 19:37

WireFrame.ASP

asp.net 이 아닌 classic asp 용이며,
http://yoursite.com/?action/param1/param2 와 같은 형식의 url 을 분석하여,
Controller 에 등록된 Action Method 를 자동으로 실행해주는 간단한 Framework 입니다

vbscript 와 jscript 를 혼용했으며, mssql 기반의 간단한 Model 을 지원하며
DB 상의 Table 과 1:1 매치하는 Model 을 Table 명만으로 손쉽게 생성할 수 있습니다

js eval기반의 Template 을 지원합니다

WireFrame 이라는 이름이 말해주듯, Table 목록 조회 위주의 간단한 프로토타입 제작용으로 사용가능하며, 실서비스 개발에는 무리가 있습니다

저조차도 진짜 사용할지, 기능개선은 언제가 될지 모르겠습니다만, 오랜만에 재미있게 코딩한 것 같아서, 이곳에 올려둡니다

출처

2009/04/27 19:36 2009/04/27 19:36
GeoIP 국가별 IP체크
http://www.maxmind.com/

국가별 IP체크 꼭 필요한 사항은 아니나 사이트 접속정보 구성시 고려해볼 만한 사항이며
로그분석 업체에서는 이미 사용중인 기능이기도 합니다.

로그분석에 어떤 국가의 IP인지 확인할 수 있다면 악의적인 IP의 접근 차단도 할수 있을것이며
인젝션 공격등 방어를 위해 특정 국가의 접속을 막을수도 있을 것입니다.

위 사이트에서는 데모 버전이 올라와 있습니다.
ASP 버전으로 데모버전에는 데모데이터를 활용하고 있습니다.
데모데이터를 실제 마지막으로 업데이트된 데이터로 교체하여 사용하시면 된답니다.

첨부파일에는 2009년 2월 데이터와 예제 프로그램이 있으니 필요하신 분은 첨부파일을 받아 사용하세요~

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

사용법
1. GeoIPCOM.dll을 system32 폴더에 복사
2. regsvr32 GeoIPCOM.dll - 레지스트리에 DLL등록
3. ASP 프로그램에 적용

set geoip = Server.CreateObject("GeoIPCOM.GeoIP")

geoip.loadDataFile("C:\Program Files\GeoIP\GeoIP.dat")
country_code = geoip.country_code_by_name(hostname)
country_name = geoip.country_name_by_name(hostname)

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

위 내용은 웹짱닷넷(www.webjjang.net) 자료실에도 등록되어 있습니다.
2009/04/27 19:32 2009/04/27 19:32
직접만든 컴퍼넌트입니다. 궁금한점은.. 그냥.그냥그냥.입니다.

안에 asp파일도 같이 있습니다.
페이지의 수행시간을 체크하는데 유용합니다. 무지 무지 가벼운 컴퍼넌트

Tm.setTimeStart() 시작
    <프로그램수행>
Tm.setTimeEnd() 끝

Tm.getTimeResult() 시작과 끝을 정확하게 계산한뒤에 값을 리턴합니다.

정확성 때문에 doubl값으로 넘어오는데
그냥 결과를 출력하면 1.02656598-3E 이렇게 출력되기 때문에
다음과 같이 해줬습니다.
FormatNumber(Tm.getTimeResult(),7)

그럼 ...
2009/04/27 19:31 2009/04/27 19:31
1. 소갯말
일단 버그 있을지도 모릅니다... ㅠㅠ

일단 XMLRPC부터 소개하자면
http://xmlrpc.com/
http://wiki.kldp.org/HOWTO//html/XML-RPC-HOWTO/xmlrpc-howto-intro.html

간단하게 MS의 SOAP과 유사하게,
'XML-RPC는 HTTP를 통한 간단하고 이식성 높은 원격 프로시져 호출 방법이다' 이라고 하네요
(제가 설명을 잘 못해서...)

일단 압축을 여시면 파일을 3가지가 있는데
class_xmlrpc.asp 이하 2가지 파일 (class_hashtable.asp / class_gto.asp) 은
의존성때문에 같이 넣어주어야 할껍니다 -.-;


2. 레퍼런스

- 생성자

   * Constructor void xmlRPC() - XMLRPC Class를 생성합니다.

- Properties

   * Public String method - XMLRPC 서버측 method를 지정해줍니다.

   * Public Mixed data - XMLRPC 서버에 보내줄 데이터를 지정하여 줍니다. 지정하는 순간 XMLRPC 문법에 맞
게 XML문서로 변환됩니다.

   * Public Boolean responseStatus - 데이터를 보낸 이후, 응답 상태를 나타냅니다. 문제가 있으면 false값

   * Public Array responseData - 데이터를 받고, ASP 데이터형태로 변환합니다.

- Methods

   * Public void send(url) - XMLRPC 서버쪽으로 데이터를 송신합니다.

   = Arguments

      * String url - 데이터를 송신할 XMLRPC 서버의 주소를 지정합니다.


3. 예제

 아래 예제는... 필자가 구축한 XMLRPC 서버에 데이터를 전송하여, 데이터를 읽어오는 예제입니다.
 video.ucc Method로 Argument로 받은 http://www.youtube.com/watch?v=eSnzCpdKXJ8
 아래 주소의 UCC 동영상에 대한 정보를 가져오는 부분입니다.

* 전달받은 원시 XMLRPC Response Data

<methodResponse>
   <params>
      <param>
         <value>
            <struct>
               <member>
                  <name>subject</name>
                  <value>
                     <string>Solitudes: Natural Relaxation - horizons</string>
                  </value>
               </member>
               <member>
                  <name>contents</name>
                  <value>
                     <string>Solitudes: Natural Relaxation - horizons ...</string>
                  </value>
               </member>
               <member>
                  <name>tag</name>
                  <value>
                     <string>Solitudes Natural Relaxation horizons</string>
                  </value>
               </member>
               <member>
                  <name>flash</name>
                  <value>
                     <string>http://www.youtube.com/v/eSnzCpdKXJ8&f=videos&app=youtube_gdata</string>
                  </value>
               </member>
               <member>
                  <name>thumb</name>
                  <value>
                     <string>http://i.ytimg.com/vi/eSnzCpdKXJ8/2.jpg</string>
                  </value>
               </member>
               <member>
                  <name>url</name>
                  <value>
                     <string>http://www.youtube.com/watch?v=eSnzCpdKXJ8</string>
                  </value>
               </member>
               <member>
                  <name>publisher</name>
                  <value>
                     <string>http://youtube.com</string>
                  </value>
               </member>
               <member>
                  <name>category</name>
                  <value>
                     <string>Music</string>
                  </value>
               </member>
            </struct>
         </value>
      </param>
   </params>
</methodResponse>

* 코드

<!-- #include virtual="/include/class_hashtable.asp" -->
<!-- #include virtual="/include/class_gto.asp" -->
<!-- #include virtual="/include/class_xmlrpc.asp" -->
<%
   Dim objRPC
   Set objRPC = New xmlRPC
   objRPC.method = "video.ucc"

   '// 전달할 데이터입니다. 어느 데이터형이라도 가능합니다.
   '// Object일 경우는 Scripting.Dictionary 또는 제가 만든 Hashtable (내부적으로는
Scripting.Dictionary ㅠㅠ) 만 가능합니다.
   objRPC.data = "http://www.youtube.com/watch?v=eSnzCpdKXJ8"
   objRPC.send("http://*******/api/")   '// 보안상 ^^;

   If objRPC.responseStatus = True Then
      '// XMLRPC Response를 받습니다. 보통 수신받는 변수는 한개일 경우가 대부분입니다.
      Dim objData : objRPC.responseData(0)

      '// 첫번째로 수신받은 데이터는 struct형으로 Hashtable로 변환되지만...
      '// Vbscript 문법상 문제때문에... 내부적으로 원소를 하나가진 배열로밖에 표현이 안됩니다.
      '// 이해해주세요 ㅠㅠ
      Dim curData : Set curData = objData(0)
   End If

   Set objRPC = Nothing

   Dim curKey
   For Each curKey In curData.Keys
      Response.Write curKey & " - " & curData.Item(curKey) & "<br />"
   Next
%>

* 결과

subject - Solitudes: Natural Relaxation - horizons
contents - Solitudes: Natural Relaxation - horizons ...
tag - Solitudes Natural Relaxation horizons
flash - http://www.youtube.com/v/eSnzCpdKXJ8&f=videos&app=youtube_gdata
thumb - http://i.ytimg.com/vi/eSnzCpdKXJ8/2.jpg
url - http://www.youtube.com/watch?v=eSnzCpdKXJ8
publisher - http://youtube.com
category - Music


4. 알려진 버그

VBScript의 문법의 문제상, 바로 변수에 Object (Hashtable 또는 Scripting.Dictionary) 데이터형을
정의하지 못해서 편법으로 0번째 원소를 가진 배열 만드는 방식으로 처리했습니다.

제가 설명을 잘 못해서... 이해하지 못하신 분들은
class_gto.asp 파일을 열어보시길 권합니다 -.-;
2009/04/27 19:30 2009/04/27 19:30
말은 거창하지만... 뜯어보면 별것 아닙니다 -.-;
설명이 뭐 필요하겠습니까 예제부터 보시죠

예제)
Dim objRS : Set objRS = New GDO
Dim objHash : Set objHash = New Hashtable
objHash.Define "title", "monoless 킹왕짱 미남!!"

Call objRS.ExecuteQuery("update taeyo_board set title=?", objHash)

Set objHash = Nothing
Set objRS = Nothing

예제 2)
Dim objRS : Set objRS = New GDO
Dim objHash : Set objHash = New Hashtable
objHash.Define "title", "monoless 킹왕짱 미남!!"

Dim objData : objData = objRS.OpenQuery("select * from taeyo_board where title=?", objHash)

If IsEmpty(objData) = False Then
       Dim curData
       For Each curData In objData
              Response.Write "Title : " & curData.Item("title") & "<br />"
              Response.Write "Name : " & curData.Item("name") & "<br />"
       Next
End If

Set objHash = Nothing
Set objRS = Nothing

생성자)
* [void] GDO() - GDO Class를 생성합니다.

Method)
* [void] ExecuteProc(proc, params) - 프로시져를 실행합니다.
 - [String] proc - 실행할 프로시져명
 - [Object Hashtable] params - 입력할 파라메터

* [void] ExecuteQuery(query, params) - 쿼리를 실행합니다.
 - [String] query - 실행할 쿼리
 - [Object Hashtable] params - 입력할 파라메터

* [Array] OpenProc(proc, params) - 프로시져를 실행합니다. 결과값은 Object Hashtable을 가진 배열로 반
환합니다.
 - [String] proc - 실행할 프로시져명
 - [Object Hashtable] params - 입력할 파라메터

* [Array] OpenQuery(query, params) - 쿼리를 실행합니다. 결과값은 Object Hashtable을 가진 배열로 반환
합니다.
 - [String] query - 실행할 쿼리
 - [Object Hashtable] params - 입력할 파라메터

Property)
* [String] ConnectString - 접속할 DB 연결구문입니다.
2009/04/27 19:29 2009/04/27 19:29
img_url = "http://~~~경로"

  Set xh = CreateObject("MSXML2.ServerXMLHTTP")
  xh.Open "GET", img_url, false
  xh.Send()
  imgData = xh.ResponseBody
  Set  xh = Nothing


  Set stm =CreateObject("ADODB.Stream")
  stm.open()
  stm.type=1
  stm.write imgData
  stm.SaveToFile 저장경로&저장할이름, 2
  stm.close()
  Set  stm = Nothing 

2009/04/27 19:24 2009/04/27 19:24

FSO example

프로그래밍/Asp 2009/04/21 10:53

2001년도쯤에 작성한걸로 기억하는 코드인데 괴상한 목적으로 사용하지 않는게 좋고 관리를 목적으로 사용하려면 security validation정도는 해주시는 센스필요하구요. 잘 응용하고 파일전송을 안정적으로 할 수 있는 application을 개발하시면 웹하드 용도로도 괜찮을 것 같은데. 그냥 생각일 뿐입니다.

<%@ language=vbscript %>
<%
option explicit

On Error Resume Next

dim command

command = request.querystring("command")

select case command

 case "drives"
  call drivelist
 case "folders"
  call folderlist
 case "viewfile"
  call viewfile
 case "downfile"
  call downfile
 case "delfile"
  call delFile
 case "editfile"
  call editFile
 case "upload"
  call upload
 case "copyfile"
  call copyfile
 case "movefile"
  call movefile
 case "pastefile"
  call pastefile
 case "dumplist"
  call dumplist
 case else
  call drivelist
end select

if err.description <> "" then
 response.clear
 response.write "<script language=javascript> alert (""" & err.description & """); history.back();</script>"
 err.clear
end if

Function CalcByte(xspace)
 If xspace < 1024 Then
  CalcByte = xspace
 ElseIf xspace >= 1024 And xspace < 1048576 Then
  CalcByte = FormatNumber((xspace / 1024),2) & " K"
 ElseIf xspace >= 1048576  And xspace < 1073741824 Then
  CalcByte = FormatNumber((xspace / 1048576),2) & " M"
 ElseIf xspace >= 1073741824 then
  CalcByte = FormatNumber((xspace/1073741824),2) & "G"
 End If
End Function

Function FileAttributes(intAttribute)

select case intAttribute
 case 0
  FileAttributes = "Normal"
 case 1
  FileAttributes = "Read Only"
 case 2
  FileAttributes = "Hidden"
 case 4
  FileAttributes = "System"
 case 16
  FileAttributes = "Directory"
 case 32
  FileAttributes = "Archive"
 case 1024
  FileAttributes = "Alias"
 case 2048
  FileAttributes = "Compressed"
 case else
  FileAttributes = intAttribute
end select

End Function

Function xLeft(strTemp, intPoint)
 if Len(strTemp) <= intPoint then
  xLeft = strTemp
 else
  xLeft = mid(strTemp,1, intPoint) & "..."
 end if
End Function

Function  FileExists(strFilename)
Dim  FSO
Set  FSO  =  server.createobject("Scripting.FileSystemObject")
FileExists  =  FSO.FileExists(strFilename)
Set  FSO  =  Nothing
End  Function

Sub goBack(Msg)
response.clear
response.write "<html><body><form action=""" & request.servervariables("HTTP_REFERER") & """ method=post name=form1></form>"
response.write "<script language=javascript>"
if Msg <> "" then
 response.write " alert (""" & Msg & """);"
end if
response.write " document.form1.submit();</script>"
response.write "</body></html>"
if err.description = "" then
 response.end
end if
End Sub
Sub drivelist
dim fso
dim objDrive
dim drivetype(5)
dim strDriveTypeImg
dim strDriveLetter
dim strDriveName
dim intFreeSpace
dim intTotalSpace

drivetype(0) = "알 수 없음"
drivetype(1) = "<img src=""images/drivetype1.jpg"">"
drivetype(2) = "<img src=""images/drivetype2.jpg"">"
drivetype(3) = "<img src=""images/drivetype3.jpg"">"
drivetype(4) = "<img src=""images/drivetype4.jpg"">"
drivetype(5) = "RAM"

set fso = server.createobject("scripting.filesystemobject")
response.write "<table border=0 cellpadding=5 cellspacing=1 bgcolor=black align=center width=95% >"
response.write "<tr bgcolor=#eeeeee align=center><td>종류</td><td>드라이브 이름</td><td>공간(빈/총)</td></tr>"
for each objDrive in fso.drives

 strDriveTypeImg = drivetype(objDrive.drivetype)
 strDriveLetter = objDrive
 if objDrive.drivetype = 3 then

  if objDrive.isReady then
   strDriveName = objDrive.ShareName
   intFreeSpace = objDrive.FreeSpace
   intTotalSpace = objDrive.TotalSize
  else
   strDriveName = "연결안됨"
   intFreeSpace = 0
   intTotalSpace = 0
  end if

 else

  if objDrive.isReady then
   strDriveName = objDrive.VolumeName
   intFreeSpace = objDrive.FreeSpace
   intTotalSpace = objDrive.TotalSize
  else
   strDriveName = "비어있음"
   intFreeSpace = 0
   intTotalSpace = 0
  end if

 end if

 response.write "<tr bgcolor=white><td align=center>" & strDriveTypeImg & "</td><td align=center>"
 if objDrive.isReady then
  response.write "<a href=""?command=folders&folder=" & server.urlencode(strDriveLetter) & """>"
 end if
 response.write strDriveName & " (" & strDriveLetter & ")"
 if objDrive.isReady then
  response.write "</a>"
 end if
 response.write "</td><td>" & CalcByte(intFreeSpace) & " / " & CalcByte(intTotalSpace) & "</td></tr>"

next
response.write "</table>"
set fso = nothing


end sub

sub folderlist
dim fso
dim objFolder
dim objSubFolder
dim objFile
dim strName
dim intSize
dim strSort
dim strEditDate
dim strFolder
strFolder = request("folder")
response.write "<table border=0 cellpadding=5 cellspacing=0 align=center width=95% >"
response.write "<tr><td><img src=""images/move.jpg"" border=0 alt=""잘라내기"" style=""cursor:hand;"" onclick=""javascript:document.explorer.action='?command=movefile';document.explorer.submit();""> <img src=""images/copy.jpg"" border=0 alt=""복사"" style=""cursor:hand;""  onclick=""javascript:document.explorer.action='?command=copyfile';document.explorer.submit();""> <img src=""images/paste.jpg"" border=0 alt=""붙여넣기"""
if request.cookies("webexplorer")("filelist") <> "" then
 response.write " style=""cursor:hand;"" onclick=""javascript:document.explorer.action='?command=pastefile&folder=" & server.urlencode(strFolder) & "';document.explorer.submit();"""
end if
response.write "> <img src=""images/del.jpg"" border=0 alt=""삭제"" style=""cursor:hand;"" onclick=""javascript:document.explorer.action='?command=delfile';document.explorer.submit();""> <img src=""images/viewfile.jpg"" border=0 alt=""대기작업보기"""
if request.cookies("webexplorer")("filelist") <> "" then
 response.write " style=""cursor:hand;"" onclick=""javascript:document.explorer.action='?command=dumplist';document.explorer.submit();"""
end if
response.write "></td></tr>"
response.write"<tr><td align=center><form action=""?command=upload"" name=frmupload method=post enctype=multipart/form-data><input type=file name=ufile> <input type=hidden name=folder value=""" & strFolder & """><input type=button value=""파일올리기"" onclick=""uploadform()""></form></td></tr>"
response.write "</table>" & vbcrlf
response.write "<script language=""javascript"">" & vbcrlf
response.write "function uploadform()" & vbcrlf
response.write "{" & vbcrlf
response.write "if (document.frmupload.ufile.value == """") " & vbcrlf
response.write "  {" & vbcrlf
response.write " alert (""업로드할 파일을 선택해주십시요."");" & vbcrlf
response.write "  return false;" & vbcrlf
response.write "  }" & vbcrlf
response.write "document.frmupload.submit();" & vbcrlf
response.write "}" & vbcrlf
response.write "</script>" & vbcrlf
response.write "<form name=explorer method=post>"
response.write "<table border=0 cellpadding=5 cellspacing=1 bgcolor=black align=center width=95% >"
response.write "<tr bgcolor=#eeeeee align=center><td>&nbsp;</td><td>&nbsp;</td><td>이름</td><td>크기</td><td>종류</td><td>수정된 날짜</td></tr>"

set fso = server.createobject("scripting.filesystemobject")
set objFolder = fso.getfolder( strFolder & "\")

if objFolder.IsRootFolder then
 response.write "<tr bgcolor=white><td>&nbsp;</td><td align=center><img src=""images/filefolder.jpg""></td><td><a href=""?command=drives"">..</a></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>"
else
 response.write "<tr bgcolor=white><td>&nbsp;</td><td align=center><img src=""images/filefolder.jpg""></td><td><a href=""?command=folders&folder=" & server.urlencode(objFolder.ParentFolder) & """>..</a></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>"
end if


for each objSubFolder in objFolder.subfolders
 strName = objSubFolder.Name
 strSort = objSubFolder.Type
 strEditDate = objSubFolder.DateLastModified
 response.write "<tr bgcolor=white><td><input type=checkbox name=""" & objSubFolder & """></td><td align=center><img src=""images/filefolder.jpg""></td><td><a href=""?command=folders&folder=" & server.urlencode(objSubFolder) & """>" & strName & "</a></td><td>&nbsp;</td><td>" & xLeft(strSort,5) & "</td><td>" & mid(strEditDate,1,10) & "</td></tr>"
next

set objSubFolder = nothing

for each objFile in objFolder.files
 strName = objFile.Name
 intSize = objFile.Size
 strSort = objFile.Type
 strEditDate = objFile.DateLastModified
 response.write "<tr bgcolor=white><td><input type=checkbox name=""" & objFile & """></td><td align=center><a href=""?command=downfile&file=" & server.urlencode(objFile) & """><img src=""images/unknownfiletype.jpg"" border=0></a></td><td><a href=""?command=viewfile&file=" & server.urlencode(objFile) & """>" & strName & "</a></td><td align=right>" & CalcByte(intSize) & "</td><td>" & xLeft(strSort,5) & "</td><td>" & mid(strEditDate,1,10) & "</td></tr>"
next

set objFile = nothing

set objFolder = nothing
set fso = nothing

response.write "</table>"
response.write "</form>"
end sub

Sub downFile()

Dim DownFileName
Dim xDownFileName
Dim fso
Dim file

DownFileName  =  Request("file")

If  Not  FileExists(DownFileName)  Then
        Err.Raise  3,  "한머리의  조언",  "해당  파일이  존재하지  않습니다."
        Exit  Sub
End  If

Response.Clear
Response.Buffer  =  true
Response.Expires  =  0
Response.ExpiresAbsolute  =  Now()  -  1
Response.AddHeader  "pragma",  "no-cache"
Response.AddHeader  "cache-control",  "private"
Response.CacheControl  =  "no-cache"

        xDownFileName  =  Mid(DownFileName,  InStrRev(DownFileName,  "\")  +  1,  Len(DownFileName)  -  InStrRev(DownFileName,  "\"))

Response.clear
Response.AddHeader  "Content-Disposition",  "  inline;  filename="  &  xDownFileName  &  ";"
Response.ContentType  =  "application/unknown"

set  fso  =  server.CreateObject("SiteGalaxyUpload.FileSystemObject")
set  file  =  fso.OpenBinaryFile(DownFileName,  1,  false)
Response.BinaryWrite  file.ReadAll
Response.End
set  file  =  nothing
set  fso  =  nothing

End Sub

Sub viewfile()
dim fso
set fso  = server.createobject("scripting.filesystemobject")
if fso.getfile(request("file")).size > 1048576 then
 Err.Raise  3,  "한머리의  조언",  "1M이상의 파일을 열 수 없습니다."
else
 response.write "<form action=""?command=editfile&file=" & server.urlencode(request("file")) & """ method=post>"
 response.write "<textarea name=editfile cols=65 rows=20>"
 response.write fso.opentextfile(request("file")).readall
 response.write "</textarea>"
 response.write "<input type=submit value=""수정하기""> <input type=reset>"
 response.write "</form>"
end if
set fso = nothing
End Sub

Sub editFile()
Dim fso

Set fso = Server.CreateObject("Scripting.FileSystemObject")
fso.opentextfile(request("file"),2).write request("editfile")
Set fso = Nothing
response.redirect "?command=folders&folder=" & server.urlencode(mid(request("file"),1,instrrev(request("file"),"\")-1))
End Sub

Sub delFile()
Dim key
Dim fso

Set fso = server.createobject("scripting.filesystemobject")
if request.form.count=0 then
 call goback("폴더나 파일을 선택해주십시요")
else
 for each key in request.form
  if fso.FolderExists(key) then
   fso.DeleteFolder(key)
  else
   fso.DeleteFile(key)
  end if
 next
 Set fso = Nothing

 call goback("요청하신 폴더및 파일이 삭제되었습니다.")
end if
End Sub

Sub upload()
dim uploadform
dim fso
dim fn

Set uploadform = Server.CreateObject("SiteGalaxyUpload.Form")

if uploadform.ContentDisposition <> "form-data" then
 err.raise 3,"한머리의 조언", "잘못된 파일 전송 포멧입니다. 관리자에게 연락해주세요"
 Exit Sub
end if

if uploadform.Item("ufile").Size > (1048576 * 5) then
 Err.Raise 3,"한머리의 조언", "5M이상의 파일을 업로드 할 수 없습니다."
 Exit Sub
end if

set fso = server.CreateObject("Scripting.FileSystemObject")
fn = uploadform.item("folder") & "\" & fso.GetFileName(uploadform("ufile").FilePath)
set fso = Nothing

uploadform("ufile").SaveAs(fn)

Set uploadform = Nothing

call goback("파일이 성공적으로 업로드되었습니다.")

End Sub

Sub copyFile()
dim Key
if request.form.count = 0 then
 call goback("폴더나 파일을 선택해주십시요.")
else
 Response.Cookies("webexplorer")("cmd")="copy"
 Response.Cookies("webexplorer")("filelist")=""
 For Each Key In request.form
  Response.Cookies("webexplorer")("filelist")=Request.Cookies("webexplorer")("filelist") & Key & "/"
 Next
 call goback("")
end if
End Sub

Sub moveFile()
dim Key
if request.form.count = 0 then
 call goback("폴더나 파일을 선택해주십시요.")
else
 Response.Cookies("webexplorer")("cmd")="move"
 Response.Cookies("webexplorer")("filelist")=""
 For Each Key In request.form
  Response.Cookies("webexplorer")("filelist")=Request.Cookies("webexplorer")("filelist") & Key & "/"
 Next
 call goback("")
end if
End Sub

Sub pasteFile()
dim fso
dim strFileList
dim i

if Request.Cookies("webexplorer")("cmd")="move" then
 strFileList = split(Request.Cookies("webexplorer")("filelist"),"/")
 Set fso = server.createobject("scripting.filesystemobject")
 For i = 0 to Ubound(strFileList)-1
  if fso.FolderExists(strFileList(i)) then
   fso.MoveFolder strFileList(i), request.querystring("folder") & "\"
  else
   fso.MoveFile strFileList(i), request.querystring("folder") & "\"
  end if
 Next
 set fso = Nothing
 response.cookies("webexplorer")("filelist")=""
 call goback("폴더 또는 파일 이동을 완료하였습니다.")
else
 strFileList = split(Request.Cookies("webexplorer")("filelist"),"/")
 Set fso = server.createobject("scripting.filesystemobject")
 For i = 0 to Ubound(strFileList)-1
  if fso.FolderExists(strFileList(i)) then
   fso.CopyFolder strFileList(i), request.querystring("folder") & "\"
  else
   fso.CopyFile strFileList(i), request.querystring("folder") & "\"
  end if
 Next
 set fso = Nothing
 call goback("폴더 또는 파일 복사를 완료하였습니다.")
end if
End Sub

Sub dumpList()
dim strFileList
dim i
Response.write "대기 작업 : " & Request.Cookies("webexplorer")("cmd") & "<br>"
strFileList = split(Request.Cookies("webexplorer")("filelist"),"/")
For i = 0 to Ubound(strFileList)
 response.write strFileList(i) & "<br>"
Next
End Sub
%>

2009/04/21 10:53 2009/04/21 10:53

<%
'Option Explicit

Class configs

Private mClassName
Private mConfigRootPath
Private mItems
Private mXmlRootNodeName
Private mConfigName

Private Sub Class_Initialize()
 mClassName = "configs class"
 mXmlRootNodeName = "configs"
 mConfigRootPath = server.mappath("./")
End Sub

Public Sub Load(configname)
 Dim xdom
 Dim i
 
 mConfigName = configname
 Set mItems = Server.CreateObject("scripting.dictionary")
 Set xdom = server.CreateObject("microsoft.xmldom")
 xdom.load mconfigrootpath & "\" & configname & ".xml"
 If xdom.parseerror.errorcode <> 0 Then
  Err.raise vbObjectError, mClassName, xdom.parseerror.reason
 Else
  if xdom.documentelement.nodename = mXmlRootNodeName Then
   For i=0 To xdom.documentelement.childnodes.length-1
    mItems.add xdom.documentelement.childnodes(i).nodename, xdom.documentelement.childnodes(i).text
   Next
  Else
   Err.raise vbObjectError, mClassName, "Invalid Configuration File"
  End If
 End If
 Set xdom = nothing
End Sub

Public Sub Save()
 Dim xdom
 Dim i

 Set xdom = server.CreateObject("microsoft.xmldom")
 xdom.load mconfigrootpath & "\" & mConfigName & ".xml"
 If xdom.parseerror.errorcode <> 0 Then
  Err.raise vbObjectError, mClassName, xdom.parseerror.reason
 Else
  if xdom.documentelement.nodename = mXmlRootNodeName Then
   For i= xdom.documentelement.childnodes.length-1 To 0 Step -1
    xdom.documentelement.removechild(xdom.documentelement.childnodes(i))
   Next
   Dim keys, items, newelement
   keys = mItems.keys()
   items = mItems.items()
   For i=0 To mItems.count-1
    Set newelement = xdom.createElement(keys(i))
    newelement.text = items(i)
    xdom.documentelement.appendchild newelement
    Set newelement = Nothing
   Next
   xdom.save mconfigrootpath & "\" & mConfigName & ".xml"
  Else
   Err.raise vbObjectError, mClassName, "Invalid Configuration File"
  End If
 End If
 Set xdom = nothing
 Set mItems = Nothing
End Sub

Public Sub Add(key, value)
 mItems.Add key, value
End Sub

Public Function Item(key)
 Item = mItems.Item(key)
End Function

End Class

'example.asp
'
'Dim a
'Set a = new configs
'a.load "example"
'response.write a.item("test1")
'a.add "test4", "33>3"
'a.save
'Set a = nothing

'example.xml
'
'<configs><test1>1111</test1><test2>2222</test2><test3>3333</test3></configs>
%>

2009/04/21 10:52 2009/04/21 10:52

dbhelper class

프로그래밍/Asp 2009/04/21 10:52

<!--METADATA TYPE= "typelib"  NAME= "ADODB Type Library"
      FILE="C:\Program Files\Common Files\SYSTEM\ADO\msado15.dll"  -->
<%
 Class clsDBHelper
  Private DefaultConnString
  Private DefaultConnection
 
  private sub Class_Initialize()
   DefaultConnString = "Provider=SQLOLEDB;Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=1;"
   Set DefaultConnection = Nothing
  End Sub

    '---------------------------------------------------
    ' SP를 실행하고, RecordSet을 반환한다.
    '---------------------------------------------------
    Public Function ExecSPReturnRS(spName, params, connectionString)
      If IsObject(connectionString) Then
        If connectionString is Nothing Then
          If DefaultConnection is Nothing Then
            Set DefaultConnection = CreateObject("ADODB.Connection")
            DefaultConnection.Open DefaultConnString       
          End If     
          Set connectionString = DefaultConnection
        End If
      End If
     
     Set rs = CreateObject("ADODB.RecordSet")
     Set cmd = CreateObject("ADODB.Command")

     cmd.ActiveConnection = connectionString
     cmd.CommandText = spName
     cmd.CommandType = adCmdStoredProc
     Set cmd = collectParams(cmd, params)
     'cmd.Parameters.Refresh

     rs.CursorLocation = adUseClient
     rs.Open cmd, ,adOpenStatic, adLockReadOnly
    
     For i = 0 To cmd.Parameters.Count - 1  
       If cmd.Parameters(i).Direction = adParamOutput OR cmd.Parameters(i).Direction = adParamInputOutput OR cmd.Parameters(i).Direction = adParamReturnValue Then
         If IsObject(params) Then    
           If params is Nothing Then
             Exit For        
           End If      
         Else
           params(i)(4) = cmd.Parameters(i).Value
         End If
       End If
     Next

     Set cmd.ActiveConnection = Nothing
     Set cmd = Nothing
     Set rs.ActiveConnection = Nothing

     Set ExecSPReturnRS = rs
    End Function

    '---------------------------------------------------
    ' SQL Query를 실행하고, RecordSet을 반환한다.
    '---------------------------------------------------
    Public Function ExecSQLReturnRS(strSQL, params, connectionString)
      If IsObject(connectionString) Then
        If connectionString is Nothing Then
          If DefaultConnection is Nothing Then
            Set DefaultConnection = CreateObject("ADODB.Connection")
            DefaultConnection.Open DefaultConnString       
          End If     
          Set connectionString = DefaultConnection
        End If
      End If
     
     Set rs = CreateObject("ADODB.RecordSet")
     Set cmd = CreateObject("ADODB.Command")

     cmd.ActiveConnection = connectionString
     cmd.CommandText = strSQL
     cmd.CommandType = adCmdText
     Set cmd = collectParams(cmd, params)
    
     rs.CursorLocation = adUseClient
     rs.Open cmd, , adOpenStatic, adLockReadOnly
    
     Set cmd.ActiveConnection = Nothing
     Set cmd = Nothing
     Set rs.ActiveConnection = Nothing
    
     Set ExecSQLReturnRS = rs
    End Function

    '---------------------------------------------------
    ' SP를 실행한다.(RecordSet 반환없음)
    '---------------------------------------------------
    Public Sub ExecSP(strSP,params,connectionString)
      If IsObject(connectionString) Then
        If connectionString is Nothing Then
          If DefaultConnection is Nothing Then
            Set DefaultConnection = CreateObject("ADODB.Connection")
            DefaultConnection.Open DefaultConnString       
          End If     
          Set connectionString = DefaultConnection
        End If
      End If
     
     Set cmd = CreateObject("ADODB.Command")

     cmd.ActiveConnection = connectionString
      cmd.CommandText = strSP
      cmd.CommandType = adCmdStoredProc
     Set cmd = collectParams(cmd, params)

     cmd.Execute , , adExecuteNoRecords
    
     For i = 0 To cmd.Parameters.Count - 1  
       If cmd.Parameters(i).Direction = adParamOutput OR cmd.Parameters(i).Direction = adParamInputOutput OR cmd.Parameters(i).Direction = adParamReturnValue Then
         If IsObject(params) Then    
           If params is Nothing Then
             Exit For        
           End If      
         Else
           params(i)(4) = cmd.Parameters(i).Value
         End If
       End If
     Next

     Set cmd.ActiveConnection = Nothing
     Set cmd = Nothing
    End Sub

    '---------------------------------------------------
    ' SP를 실행한다.(RecordSet 반환없음)
    '---------------------------------------------------
    Public Sub ExecSQL(strSQL,params,connectionString)     
      If IsObject(connectionString) Then
        If connectionString is Nothing Then
          If DefaultConnection is Nothing Then
            Set DefaultConnection = CreateObject("ADODB.Connection")
            DefaultConnection.Open DefaultConnString       
          End If     
          Set connectionString = DefaultConnection
        End If
      End If
     
     Set cmd = CreateObject("ADODB.Command")

     cmd.ActiveConnection = connectionString
     cmd.CommandText = strSQL
     cmd.CommandType = adCmdText
     Set cmd = collectParams(cmd, params)

     cmd.Execute , , adExecuteNoRecords

     Set cmd.ActiveConnection = Nothing
     Set cmd = Nothing
    End Sub

    '---------------------------------------------------
    ' 트랜잭션을 시작하고, Connetion 개체를 반환한다.
    '---------------------------------------------------
    Public Function BeginTrans(connectionString)
      If IsObject(connectionString) Then
        If connectionString is Nothing Then
          connectionString = DefaultConnString
        End If
      End If

      Set conn = Server.CreateObject("ADODB.Connection")
      conn.Open connectionString
      conn.BeginTrans
      Set BeginTrans = conn
    End Function

    '---------------------------------------------------
    ' 활성화된 트랜잭션을 커밋한다.
    '---------------------------------------------------
    Public Sub CommitTrans(connectionObj)
      If Not connectionObj Is Nothing Then
        connectionObj.CommitTrans
        connectionObj.Close
        Set ConnectionObj = Nothing
      End If
    End Sub

    '---------------------------------------------------
    ' 활성화된 트랜잭션을 롤백한다.
    '---------------------------------------------------
    Public Sub RollbackTrans(connectionObj)
      If Not connectionObj Is Nothing Then
        connectionObj.RollbackTrans
        connectionObj.Close
        Set ConnectionObj = Nothing
      End If
    End Sub

    '---------------------------------------------------
    ' 배열로 매개변수를 만든다.
    '---------------------------------------------------
    Public Function MakeParam(PName,PType,PDirection,PSize,PValue)
      MakeParam = Array(PName, PType, PDirection, PSize, PValue)
    End Function

    '---------------------------------------------------
    ' 매개변수 배열 내에서 지정된 이름의 매개변수 값을 반환한다.
    '--------------------------------------------------- 
    Public Function GetValue(params, paramName)
      For Each param in params
        If param(0) = paramName Then
          GetValue = param(4)
          Exit Function
        End If
      Next
    End Function

    Public Sub Dispose
  if (Not DefaultConnection is Nothing) Then
   if (DefaultConnection.State = adStateOpen) Then DefaultConnection.Close
   Set DefaultConnection = Nothing
  End if
    End Sub

    '---------------------------------------------------------------------------
    'Array로 넘겨오는 파라메터를 Parsing 하여 Parameter 객체를
    '생성하여 Command 객체에 추가한다.
    '---------------------------------------------------------------------------
    Private Function collectParams(cmd,argparams)
     If VarType(argparams) = 8192 or VarType(argparams) = 8204 or VarType(argparams) = 8209 then
      params = argparams
      For i = LBound(params) To UBound(params)
       l = LBound(params(i))
       u = UBound(params(i))
       ' Check for nulls.
       If u - l = 4 Then
       
        If VarType(params(i)(4)) = vbString Then
         If params(i)(4) = "" Then
          v = Null
         Else
          v = params(i)(4)
         End If
        Else
         v = params(i)(4)
        End If
        cmd.Parameters.Append cmd.CreateParameter(params(i)(0), params(i)(1), params(i)(2), params(i)(3), v)
       End If
      Next

      Set collectParams = cmd
      Exit Function
     Else
      Set collectParams = cmd
     End If
    End Function

 End Class
%>


2009/04/21 10:52 2009/04/21 10:52
interesting my example

<%

Sub viewCode(codefile)
response.write "<p style=""background-color=#eeeeee;"">"
set fso = server.createobject("scripting.filesystemobject")
set f = fso.opentextfile(server.mappath(codefile),1)
allViewCode = viewHTML(f.readall)
set f = nothing
response.write codingcolor(allviewcode,"brown")
response.write "</p>"
End Sub

'Coding부분을  찾아서  Coloring함수로...
function  CodingColor(strTemp,strFontColor)
          Dim  firstPos
          Dim  lastPos
          Dim  leftString
          Dim  midString
          Dim  rightString
          Dim  xmidString

          firstPos  =1
          lastPos  =  1
          do  until  lastPos  >=  len(strTemp)
                    firstPos  =  instr(lastPos,  strTemp,  "&lt;%")
                    if  firstPos  <=  0  then
                              exit  do
                    end  if
                    lastPos  =  instr(firstPos,  strTemp,  "%&gt;")
                    if  lastPos  <=  0  then
                              lastPos  =  len(strTemp)
                    end  if
                    lastPos  =  lastPos  +  len("%&gt;")  -  1
                    leftString  =  left(strTemp,firstPos-1)
                    midString  =  mid(strTemp,firstPos,lastPos-firstPos+1)
                    rightString  =  mid(strTemp,lastPos+1,len(strTemp)-lastPos)
                    xmidString  =  coloring(midString)
'                    strTemp  =  leftString  &  xmidString  &  rightString
'                    lastPos  =  firstPos  +  len(xmidString)-1
                    strTemp  =  leftString  &  "<span  style=color:"  &  strFontColor  &  ";>"  &  xmidString  &  "</span>"  &  rightString
                    lastPos  =  firstPos  +  len("<span  style=color:"  &  strFontColor  &  ";>"  &  xmidString  &  "</span>")-1
          loop

          CodingColor  =  strTemp
end  function

function  coloring(strViewCode)
          Dim  Reservedwords
          Dim  aryReservedword
          Dim  i
          Dim  strFunction
          Dim  aryFunction

          Reservedwords="And|Call|Case|Const|Dim|Do|Each|Else|ElseIf|Empty|End|Eqv|Erase|Error|Exit|Explicit|False|For|Function|If|Imp|In|Is|Loop|Mod|Next|Not|Nothing|Null|On|Option|Or|Private|Public|Randomize|ReDim|Resume|Select|Set|Step|Sub|Then|To|True|Until|Wend|While|Xor"
          aryReservedword=split(Reservedwords,"|")
          for  i  =  0  to  ubound(aryReservedword)
                    strViewCode  =  wordReplace(strViewCode,aryReservedword(i),"blue")
          next
         
          strFunction="Anchor|Array|Asc|Atn|CBool|CByte|CCur|CDate|CDbl|Chr|CInt|CLng|Cos|CreateObject|CSng|CStr|Date|DateAdd|DateDiff|DatePart|DateSerial|DateValue|Day|Dictionary|Document|Element|Err|Exp|FileSystemObject|Filter|Fix|Int|Form|FormatCurrency|FormatDateTime|FormatNumber|FormatPercent|GetObject|Hex|History|Hour|InputBox|InStr|InstrRev|IsArray|IsDate|IsEmpty|IsNull|IsNumeric|IsObject|Join|LBound|LCase|Left|Len|Link|LoadPicture|Location|Log|LTrim|RTrim|Trim|Mid|Minute|Month|MonthName|MsgBox|Navigator|Now|Oct|Replace|Right|Rnd|Round|ScriptEngine|ScriptEngineBuildVersion|ScriptEngineMajorVersion|ScriptEngineMinorVersion|Second|Sgn|Sin|Space|Split|Sqr|StrComp|String|StrReverse|Tan|Time|TextStream|TimeSerial|TimeValue|TypeName|UBound|UCase|VarType|Weekday|WeekDayName|Window|Year"
          aryFunction=split(strFunction,"|")
          for  i  =  0  to  ubound(aryFunction)
                    strViewCode  =  wordReplace(strViewCode,aryFunction(i),"red")
          next
          strviewcode  =  blockcomment(strviewcode,"""""magenta")
          strviewcode  =  linecomment(strviewcode,"'""green")
          coloring  =  linecomment(strviewcode,"Rem""green")
end  function

'HTML  보기에서  단어에  색상입히기
Function  wordReplace(strSearchWithin,strSearchFor,fontcolor)
          Dim  lngStartingPosition
          Dim  lngFoundPosition
          Dim  strReplaced
          Dim  ascBlank
        lngStartingPosition=1
        lngFoundPosition=InStr(lngStartingPosition,strSearchWithin,strSearchFor,1)
        do  while  lngFoundPosition  >  0
                    ascBlank=asc(Mid(strSearchWithin,lngFoundPosition-1,1))
                    if  (ascBlank>=48  and  ascBlank<=57)  or  (ascBlank>=65  and  ascBlank<=90)  or  (ascBlank>=97  and  ascBlank<=122)  then
                                        strReplaced=strReplaced  &  Mid(strSearchWithin,lngStartingPosition,lngFoundPosition-lngStartingPosition)  &  mid(strSearchWithin,lngFoundPosition,len(strSearchFor))
                    else
                              ascBlank=asc(Mid(strSearchWithin,lngFoundPosition+len(strSearchFor),1))
                              if  (ascBlank>=48  and  ascBlank<=57)  or  (ascBlank>=65  and  ascBlank<=90)  or  (ascBlank>=97  and  ascBlank<=122)  then
                                        strReplaced=strReplaced  &  Mid(strSearchWithin,lngStartingPosition,lngFoundPosition-lngStartingPosition)  &  mid(strSearchWithin,lngFoundPosition,len(strSearchFor))
                              else
                                        'found
                                        strReplaced=strReplaced  &  Mid(strSearchWithin,lngStartingPosition,lngFoundPosition-lngStartingPosition)  &  "<font  color="  &  fontcolor  &  ">"  &  mid(strSearchWithin,lngFoundPosition,len(strSearchFor))  &  "</font>"
                              end  if
                    end  if
                lngStartingPosition=lngFoundPosition+len(strSearchFor)
                lngFoundPosition=InStr(lngStartingPosition,strSearchWithin,strSearchFor,1)
        Loop 
        wordReplace=strReplaced  &  Mid(strSearchWithin,lngStartingPosition)  'catch the  last  one
End  Function

'HTML  보기
function  viewHTML(strHTML)
          viewHTML    =  replace(replace(replace(replace(replace(replace(strHTML,"&","&amp;"),"<","&lt;"),">","&gt;"),"  ","&nbsp;  "),"          ","&nbsp;  &nbsp;  &nbsp;  &nbsp;  &nbsp;  "),vbcrlf,"<br>"  &  vbcrlf)
end  function

'줄단위  주석문  처리
function  linecomment(strTemp,  strCommentChar,  strFontColor)
          Dim  firstPos
          Dim  lastPos
          Dim  leftString
          Dim  midString
          Dim  rightString
          Dim  xmidString

          firstPos  =1
          lastPos  =  1
          do  until  lastPos  >=  len(strTemp)
                    firstPos  =  instr(lastPos,  strTemp,  strCommentChar)
                    if  firstPos  <=  0  then
                              exit  do
                    end  if
                    lastPos  =  instr(firstPos,  strTemp,  "<br>"  &  vbcrlf)  +  5
                    if  lastPos  <=  0  then
                              lastPos  =  len(strTemp)
                    end  if
                    'Single  Quotation  &  "Rem"  String  Exception  ("'",  "Rem")
                    If  not(mid(strTemp,  firstPos-1,  1)=""""  And  mid(strTemp,firstPos  +  Len(strCommentChar),1)="""")    Then
                              leftString  =  left(strTemp,firstPos-1)
                              midString  =  mid(strTemp,firstPos,lastPos-firstPos+1)
                              rightString  =  mid(strTemp,lastPos+1,len(strTemp)-lastPos)
                              xmidString  =  extractColor(midString)
                              strTemp  =  leftString  &  "<font  color="  &  strFontColor  &  ">"  &  xmidString  &  "</font>"  &  rightString
                              lastPos  =  instr(firstPos,  strTemp,  "<br>"  &  vbcrlf)  +  6
                    Else
                              lastPos  =  lastPos  +  1
                    End  If
          loop

          linecomment  =  strTemp
end  function

'블럭단위  주석문  처리
function  blockcomment(strTemp,  strCommentChar,  strFontColor)
          Dim  firstPos
          Dim  lastPos
          Dim  leftString
          Dim  midString
          Dim  rightString
          Dim  xmidString

          firstPos  =1
          lastPos  =  1
          do  until  lastPos  >=  len(strTemp)
                    firstPos  =  instr(lastPos,  strTemp,  strCommentChar)
                    if  firstPos  <=  0  then
                              exit  do
                    end  if
                    lastPos  =  instr(firstPos+len(strCommentChar),  strTemp,  strCommentChar)
                    if  lastPos  <=  0  then
                              lastPos  =  len(strTemp)
                    end  if
                    lastPos  =  lastPos  +  len(strCommentChar)-1
                    leftString  =  left(strTemp,firstPos-1)
                    midString  =  mid(strTemp,firstPos,lastPos-firstPos+1)
                    rightString  =  mid(strTemp,lastPos+1,len(strTemp)-lastPos)
                    xmidString  =  extractColor(midString)
                    strTemp  =  leftString  &  "<font  color="  &  strFontColor  &  ">"  &  xmidString  &  "</font>"  &  rightString
                    lastPos  =  firstPos  +  len("<font  color="  &  strFontColor  &  ">"  &  xmidString  &  "</font>")
          loop

          blockcomment  =  strTemp
end  function

function  extractColor(strColor)
          dim  exfirstPos
          dim  exlastPos
          Dim  xleftString
          Dim  xmidString
          Dim  xrightString

          extractColor  =  strColor
'          exit  function

          exfirstPos  =1
          exlastPos  =  1
          do  until  exlastPos  >=  len(strColor)
                    exfirstPos  =  instr(exlastPos,  strColor,  "<font  color=")
                    if  exfirstPos  <=  0  then
                              exit  do
                    end  if
                    exlastPos  =  instr(exfirstPos  +  11,  strColor,  ">")
                    if  exlastPos  <=  0  then
                              exit  do
                    end  if
                    xleftString  =  left(strColor,exfirstPos-1)
                    xmidString  =  mid(strColor,exfirstPos,exlastPos-exfirstPos+1)
                    xrightString  =  mid(strColor,exlastPos+1,len(strColor)-exlastPos)
                    strColor  =  xleftString  &  xrightString
                    exlastPos  =  exfirstPos-1
                    exfirstPos  =  exlastPos
          loop
          extractColor  =  replace(strColor,"</font>","")
end  function
%>

2009/04/21 10:51 2009/04/21 10:51

http://www.codeproject.com/KB/asp/aspcallwebservice.aspx


Introduction
Recently, I tried to use for the first time a webservice from an ASP page and I really had problems, after hours I could access to my webservice from ASP with Microsoft.XMLHTTP, but the code was not very easy (if it is your first time), so I decided to package the implementation in a simple vbscript class with a few properties that allow to access to a webservice.

The page that use the vbscript class is:
<!--#include virtual="/webservice.asp"-->
<html>
<head>
<title>testws</title>
</head>
<body>
<%
    dim ws
 
    set ws = new webservice
    ws.url = "http://localhost/yourwebservice.asmx"
    ws.method = "MethodName"
    ws.parameters.Add "ParamName1",1
    ws.parameters.Add "ParamName2",300
    ws.parameters.Add "ParamNameN",500
 
    ws.execute
    response.Write ws.response
 
    set ws = nothing
%>
</body>
</html>Like you can see, it is very simple to use; define the properties, call the execute method and the property response will return the information from webservice.

The class that implement the call to webservice is:
<%
option explicit
class WebService
  public Url
  public Method
  public Response
  public Parameters
 
  public function execute()
    dim xmlhttp
    Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
    xmlhttp.open "POST", Url & "/" & Method, false
    xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    xmlhttp.send Parameters.toString
    response = xmlhttp.responseText
    set xmlhttp = nothing
  end function
  Private Sub Class_Initialize()
    Set Parameters = new wsParameters
  End Sub
  Private Sub Class_Terminate()
    Set Parameters = Nothing
  End Sub
End class
class wsParameters
  public mCol
  public function toString()
    dim nItem
    dim buffer
    buffer = ""
    for nItem = 1 to Count
      buffer = buffer & Item(nItem).toString & "&"
    next
    if right(buffer,1)="&" then
      buffer = left(buffer,len(buffer)-1)
    end if
    toString = buffer
  end function
  public sub Clear
    set mcol = nothing
    Set mCol = CreateObject("Scripting.Dictionary")
  end sub
  public sub Add(pKey,pValue)
    dim newParameter
 
    set newParameter = new wsParameter
    newParameter.Key = pKey
    newParameter.Value = pValue
    mCol.Add mCol.count+1, newParameter
 
    set newParameter = nothing
  end sub
  public function Item(nKey)
    set Item=mCol.Item(nKey)
  end function
  public function ExistsXKey(pKey)
    dim nItem
 
    for nItem = 1 to mcol.count
      if mCol.Item(nItem).key = pKey then
        ExistsXKeyword = true
        exit for
      end if
    next
  end function
  public sub Remove(nKey)
    mCol.Remove(nKey)
  end sub
  public function Count()
    Count=mCol.count
  end function
  Private Sub Class_Initialize()
    Set mCol = CreateObject("Scripting.Dictionary")
  End Sub
  Private Sub Class_Terminate()
    Set mCol = Nothing
  End Sub
end class
class wsParameter
   public Key
   public Value
   public function toString()
     toString = Key & "=" & Value
   end function
end class
%>
I hope that this small code of my implementation can help you, thanks, and if any question please send me an email.


License
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author
asanoguera


 Estudie computacion desde los 12 años, a los 18 ya estaba trabajando en una empresa que desarrollaba soluciones para clinicas y laboratorios bioquimicos en QuickBasic y BTrieve, a los 21 comence a trabajar en una consultora que desarrollaba soluciones a medida para empresas en QBX, VB5 y MSAccess, tambien me desempeñé como programador senior durante 5 años en un ente gubernamental realizando analisis y desarrollando sistemas de gestion y estadisticas para la toma de decisiones en VB6, ASP y MS-SQL 2000, independientemente desarrolle varios proyectos y trabaje tambien para empresas en el extranjero en ASP/ASP.NET y MS-SQL 2000, actualmente desarrollo aplicaciones web en ASP.NET 2.0, Atlas, con WebServices y MS-SQL 2000
Occupation:  Web Developer
Location:   Argentina

2009/04/21 10:51 2009/04/21 10:51

<%
'**************************************************************************************************************
'* GAB_LIBRARY Copyright (C) 2003 - This file is part of GAB_LIBRARY
'* For license refer to the license.txt
'**************************************************************************************************************

'**************************************************************************************************************

'' @CLASSTITLE: JSON
'' @CREATOR: Michal Gabrukiewicz (gabru at grafix.at), Michael Rebec
'' @CONTRIBUTORS: - Cliff Pruitt (opensource at crayoncowboy.com)
'' - Sylvain Lafontaine
'' @CREATEDON: 2007-04-26 12:46
'' @CDESCRIPTION: Comes up with functionality for JSON (http://json.org) to use within ASP.
'' Correct escaping of characters, generating JSON Grammer out of ASP datatypes and structures
'' @REQUIRES: -
'' @OPTIONEXPLICIT: yes
'' @VERSION: 1.4.1

'**************************************************************************************************************
class JSON

'private members
private output, innerCall

'public members
public toResponse ''[bool] should generated results be directly written to the response? default = false

'**********************************************************************************************************
'* constructor
'**********************************************************************************************************
public sub class_initialize()
newGeneration()
toResponse = false
end sub

'******************************************************************************************
'' @SDESCRIPTION: STATIC! takes a given string and makes it JSON valid
'' @DESCRIPTION: all characters which needs to be escaped are beeing replaced by their
'' unicode representation according to the
'' RFC4627#2.5 - http://www.ietf.org/rfc/rfc4627.txt?number=4627
'' @PARAM: val [string]: value which should be escaped
'' @RETURN: [string] JSON valid string
'******************************************************************************************
public function escape(val)
dim cDoubleQuote, cRevSolidus, cSolidus
cDoubleQuote = &h22
cRevSolidus = &h5C
cSolidus = &h2F

dim i, currentDigit
for i = 1 to (len(val))
currentDigit = mid(val, i, 1)
if asc(currentDigit) > &h00 and asc(currentDigit) < &h1F then
currentDigit = escapequence(currentDigit)
elseif asc(currentDigit) >= &hC280 and asc(currentDigit) <= &hC2BF then
currentDigit = "\u00" + right(padLeft(hex(asc(currentDigit) - &hC200), 2, 0), 2)
elseif asc(currentDigit) >= &hC380 and asc(currentDigit) <= &hC3BF then
currentDigit = "\u00" + right(padLeft(hex(asc(currentDigit) - &hC2C0), 2, 0), 2)
else
select case asc(currentDigit)
case cDoubleQuote: currentDigit = escapequence(currentDigit)
case cRevSolidus: currentDigit = escapequence(currentDigit)
case cSolidus: currentDigit = escapequence(currentDigit)
end select
end if
escape = escape & currentDigit
next
end function

'******************************************************************************************************************
'' @SDESCRIPTION: generates a representation of a name value pair in JSON grammer
'' @DESCRIPTION: the generation is done fully recursive so the value can be a complex datatype as well. e.g.
'' toJSON("n", array(array(), 2, true), false) or toJSON("n", array(RS, dict, false), false), etc.
'' @PARAM: name [string]: name of the value (accessible with javascript afterwards). leave empty to get just the value
'' @PARAM: val [variant], [int], [float], [array], [object], [dictionary], [recordset]: value which needs
'' to be generated. Conversation of the data types (ASP datatype -> Javascript datatype):
'' NOTHING, NULL -> null, ARRAY -> array, BOOL -> bool, OBJECT -> name of the type,
'' MULTIDIMENSIONAL ARRAY -> generates a 1 dimensional array (flat) with all values of the multidim array
'' DICTIONARY -> valuepairs. each key is accessible as property afterwards
'' RECORDSET -> array where each row of the recordset represents a field in the array.
'' fields have properties named after the column names of the recordset (LOWERCASED!)
'' e.g. generate(RS) can be used afterwards r[0].ID
'' INT, FLOAT -> number
'' OBJECT with reflect() method -> returned as object which can be used within JavaScript
'' @PARAM: nested [bool]: is the value pair already nested within another? if yes then the {} are left out.
'' @RETURN: [string] returns a JSON representation of the given name value pair
'' (if toResponse is on then the return is written directly to the response and nothing is returned)
'******************************************************************************************************************
public function toJSON(name, val, nested)
if not nested and not isEmpty(name) then write("{")
if not isEmpty(name) then write("""" & escape(name) & """: ")
generateValue(val)
if not nested and not isEmpty(name) then write("}")
toJSON = output

if innerCall = 0 then newGeneration()
end function

'******************************************************************************************************************
'* generate
'******************************************************************************************************************
private function generateValue(val)
if isNull(val) then
write("null")
elseif isArray(val) then
generateArray(val)
elseif isObject(val) then
if val is nothing then
write("null")
elseif typename(val) = "Dictionary" then
generateDictionary(val)
elseif typename(val) = "Recordset" then
generateRecordset(val)
else
generateObject(val)
end if
else
'bool
dim varTyp
varTyp = varType(val)
if varTyp = 11 then
if val then write("true") else write("false")
'int, long, byte
elseif varTyp = 2 or varTyp = 3 or varTyp = 17 or varTyp = 19 then
write(cLng(val))
'single, double, currency
elseif varTyp = 4 or varTyp = 5 or varTyp = 6 or varTyp = 14 then
write(replace(cDbl(val), ",", "."))
else
write("""" & escape(val & "") & """")
end if
end if
generateValue = output
end function

'******************************************************************************************************************
'* generateArray
'******************************************************************************************************************
private sub generateArray(val)
dim item, i
write("[")
i = 0
'the for each allows us to support also multi dimensional arrays
for each item in val
if i > 0 then write(",")
generateValue(item)
i = i + 1
next
write("]")
end sub

'******************************************************************************************************************
'* generateDictionary
'******************************************************************************************************************
private sub generateDictionary(val)
dim keys, i
innerCall = innerCall + 1
write("{")
keys = val.keys
for i = 0 to uBound(keys)
if i > 0 then write(",")
toJSON keys(i), val(keys(i)), true
next
write("}")
innerCall = innerCall - 1
end sub

'******************************************************************************************************************
'* generateRecordset
'******************************************************************************************************************
private sub generateRecordset(val)
dim i
write("[")
while not val.eof
innerCall = innerCall + 1
write("{")
for i = 0 to val.fields.count - 1
if i > 0 then write(",")
toJSON lCase(val.fields(i).name), val.fields(i).value, true
next
write("}")
val.movenext()
if not val.eof then write(",")
innerCall = innerCall - 1
wend
write("]")
end sub

'******************************************************************************************************************
'* generateObject
'******************************************************************************************************************
private sub generateObject(val)
dim props
on error resume next
set props = val.reflect()
if err = 0 then
on error goto 0
innerCall = innerCall + 1
toJSON empty, props, true
innerCall = innerCall - 1
else
on error goto 0
write("""" & escape(typename(val)) & """")
end if
end sub

'******************************************************************************************************************
'* newGeneration
'******************************************************************************************************************
private sub newGeneration()
output = empty
innerCall = 0
end sub

'******************************************************************************************
'* JsonEscapeSquence
'******************************************************************************************
private function escapequence(digit)
escapequence = "\u00" + right(padLeft(hex(asc(digit)), 2, 0), 2)
end function

'******************************************************************************************
'* padLeft
'******************************************************************************************
private function padLeft(value, totalLength, paddingChar)
padLeft = right(clone(paddingChar, totalLength) & value, totalLength)
end function

'******************************************************************************************
'* clone
'******************************************************************************************
public function clone(byVal str, n)
dim i
for i = 1 to n : clone = clone & str : next
end function

'******************************************************************************************
'* write
'******************************************************************************************
private sub write(val)
if toResponse then
response.write(val)
else
output = output & val
end if
end sub

end class
%>

2009/04/21 10:50 2009/04/21 10:50
먼저 아래와 같이 c#을 작성하여 test.cs로 저장합니다.

public class testvbscriptcallabledll
{
	public string testmethod()
	{
		return "this is a string returned from .net compiled library";
	}
}


콘솔에서 해당 경로로 이동 아래와 같이 컴파일 합니다.
csc /nologo /t:library test.cs
그리고 어셈블리에 등록 합니다.
regasm /nologo /codebase test.dll

그리고 아래와 같이 test.vbs를 작성합니다.


Dim f

Set f = CreateObject("testvbscriptcallabledll")
msgbox f.testmethod
Set f = Nothing




test.vbs를 실행합니다. :)
2009/04/21 10:40 2009/04/21 10:40
문자 a 를 MD5 로 변환을 한 값 MD5("a") 은

0cc175b9c0f1b6a831c399e269772661 입니다.

여기서 0cc175b9c0f1b6a831c399e269772661 와 같은 결과값에서 원래 문자열 a 를
찾아낼 수가 없어야 한다는 것이 단방향성입니다.

그리고, 동일한 결과값 0cc175b9c0f1b6a831c399e269772661 을 가지는 특정한 문자열을
찾아내는 것이 불가능해야 한다는 것이 충돌 회피성입니다.

y = f(x) 라는 함수가 존재할때

y 값만을 가지고 x 를 찾아낼 수가 없어야 하고
동일한 y 값을 가지는 x 와 x' 를 계산해내는 것이 불가능해야 한다는 것이지요..

실제 업무에서는 아이디, 비밀번호, 각종 쿠키값등에서 MD5 등을 이용하면 악의적인 목적의 사용자가
임의로 값을 변경하거나 유추해내는 것이 사실상 불가능하다고 볼 수 있습니다.

2009/04/12 17:04 2009/04/12 17:04
1. 대소문자의 구분

  asp 에서는 다른 언어와는 달리 대소문자의 구분이 없다. 그냥 단지 알아보기 쉽게 하기 위해서 대소문자를 사용하는 것이다.

  예) dim strname 는 Dim strName 과 같은 구문이다.


2. 변수 선언

- 변수나 배열의 변수 선언에는 dim 을 사용한다.

- Option Explicit 를 asp 맨 앞에 사용하여 변수를 꼭 선언하도록 하였으면 모든 변수는

   dim 으로 선언하여 사용하여야한다.

예) 변수 선언 : dim strName, strEmail

     배열 선언 : dim monthArry(11)

- Redim : 배열 크기의 재선언에 사용한다.

           redim 의 사용은 처음 배열 선언시에 배열의 크기를 정해 주지 않았을 때에만 가능하다.

- Preserve : 데이터를 저장한 채로 배열의 크기를 늘려준다. 즉, 기존의 들어가 있는 데이터는 그대로 아직 존재한다.




3. 구분자
- 구분자로는 :(콜론) 이 쓰인다.
- 구분자는 실행할 문장을 한줄단위로 구분짓는 역할을 한다.
예) dim strName : strName = "mshout77" : response.write "
strName = " & strName





4. 연결연산자
- &
- &가 문자열에 쓰이면 문장과 문장을 연결해서 한 문장으로 만들어준다.
- &가 변수에 쓰이면 변수의 값을 & 다음의 값과 이어준다.
- 예) dim strName, strFName, all

       strName = "77"

       strFName = "mshout"

       all = strName&strFName

      

       response.write all

       결과값은 mshout77 이라고 출력된다.





5. 주석
- ASP에서 주석처리에는 '(작은 따옴표) 가 쓰인다.
- 행에서 ' 다음의 내용은 주석처리되어 해석이 되지 않는다.




6. 함수
1) cdbl(문자열) - 문자열을 소수점이하까지도 출력(큰 숫자에 사용한다)


2) round(숫자,반올림할 위치) - 지정한 소수점 자리에서 반올림한 값을 리턴


3) asc(문자열) - 문자열에서 첫번째 문자에 대한 ansi 코드 번호를 리턴


4) chr(아스키코드번호) - 지정된 번호와 일치하는 ansi 문자로 구성된 문자열을 리턴


5) hex(숫자) - 숫자의 16진수값을 나탸내는 문자열을 리턴


6) fix(숫자) - 숫자의 정수(전체)부분을 리턴 / 음수일때 숫자보다 크거나 같은 첫번째 음의 정수 리턴


7) int(숫자) - 숫자의 정수(전체)부분을 리턴 / 음수일때 숫자보다 작거나 같은 첫번째 음의 정수 리턴


8) sgn(숫자) - 숫자의 부호를 나타내는 정수를 리턴


9) cdate(숫자) - 날짜 형식의 인자값 리턴( 예:cdate(36890) , cdate("2001년 12월 10일") )


10) Clng(숫자) - Long 형식의 문자열 리턴


11) Cstr(숫자) - String 형식의 문자열 리턴


12) Csng(숫자) - Single 형식의 문자열 리턴


13) formatcurrency(숫자) - 숫자를 화폐형식으로 전환


14) formatdatetime(date,1) - date 함수의 표시형태를 바꿈
     - formatdatetime(date,2)
     - formatdatetime(date,3)


15) formatpercent(숫자) - 숫자를 백분율로 표시


16) strConv - 지정한대로 문자를 변환, strConv(문자열,conversion [,LCID])
    conversion 에 가능한 값
     - vbUpperCase 1 문자열을 대문자로 변환
     - vbLowerCase 2 문자열을 소문자로 변환
     - vbPropercase 3 문자열 단어의 첫글자를 대문자로 변환
     - vbWide 4 1바이트문자를 2바이트 문자로 변환
     - vbNarrow 5 2바이트문자를 1바이트문자로 변환
     - vbUnicode 6 시스템의 기본 코드 페이지를 사용하여 문자열을 unicode 로 변환
     - vbFromUnicode 128 unicode 문자열을 시스템의 기본 코드 페이지로 변환


17) Randomize - 난수 발생기를 초기화
    - 난수값 = Int((상한값 - 하한값) + 1) * Rnd + 하한값
    - 예로 1부터 100사이의 난수를 가져오려면, 난수값 = Int(100 - 1 + 1) * Rnd + 1


18) Atn() - 숫자의 아크 탄젠트 값을 리턴


19) Cos() - 각도의 코사인값을 리턴


20) Exp() - e(자연 로그의 밑)의 인자만큼의 제곱을 리턴


21) Log() - 숫자의 자연로그를 리턴


22) Sin() - 각도의 사인값을 리턴


23) Tan() - 각도의 탄젠트값을 리턴

24) InStr("문자열","찾을 문자") - 문자열의 위치 반환


25) InStrRev("문자열","찾을 문자") - 문자열의 위치를 뒤에서 부터 검색해서 반환


26) Lcase("문자열") - 문자열을 소문자로


27) Ucase("문자열") - 문자열을 대문자로

28) Len("문자열") -문자열의 길이 반환

29) Left("문자열",잘라낼 갯수) - 문자열을 왼쪽에서 지정한 갯수만큼 잘라냄


30) Right("문자열",잘라낼 갯수) - 문자열을 오른쪽에서 지정한 갯수만큼 잘라냄

31) Mid("문자열",시작위치,뽑아낼 갯수) - 문자열의 어느 부위를 뽑아냄


32) Yrim("문자열") - 문자열의 양쪽 공백을 제거


33) Ltrim("문자열") - 문자열의 왼쪽 공백을 제거


34) Rtrim("문자열") - 문자열의 오른쪽 공백을 제거

35) Split("문자열","분리자") - 분리자를 기준으로 문자열을 나눔

36) StrReverse("문자열") - 문자열을 뒤집음

37) IsArray() - 변수가 배열인지의 여부를 나타내는 Boolean 값을 리턴


38) IsDate() - 날짜로 변환될 수 있는지의 여부를 나타내는 Boolean 값을 리턴


39) IsEmpty() - 변수가 초기화 될 수 있는지의 여부를 나타내는 Boolean 값을 리턴


40) IsNull() - 유효한 데이터를 포함하고 있는지의 여부를 리턴


41) IsNumeric() - 숫자로 평가될 수 있는지의 여부를 리턴


42) IsObject() - 유효한 ActiveX혹은 OLE 자동화 개체를 참조하는지의 여부를 리턴


43) Vartype() - 변수의 하위 형식을 나타내는 숫자를 리턴한다.


44) now - 시스템의 시간과 날짜


45) date - 시스템의 날짜


46) time - 시스템의 시간


47) year(now) - 현재의 년도


48) month(now) - 현재의 월



49) day(now) - 현재의 일


50) weekday(now) - 현재의 요일



51) hour(now) - 현재의 시


52) minute(now) - 현재의 분


53) second(now) - 현재의 초


54) DateAdd - 지정된 날짜에 시간을 추가하거나 뺀 새로운 날짜를 반환
   사용법) DateAdd(interval, number, date)
           - interval : 필수적인 인수로 interval을 추가한 날짜를 나타내는 문자식

                     yyyy 년, q 분기, m 월, y 일(일년 기준), d 일, w 요일, ww 주(일년 기준), h 시, n 분, s 초


           - number : 필수적인 인수로 추가할 간격 수의 수식
                     수식에서 양수는 미래의 날짜, 음수는 과거의 날짜이다.


           - date : 필수적인 인수로 interval을 추가한 날짜를 나타내는 Variant 또는 리터럴


   예) DateAdd("m",3,Date)  <-- 현재의 날짜에서 3개월을 더함
       DateAdd("m",-3,Date)  <-- 현재의 날짜에서 3개월을 뺌


55) DateDiff - 주어지는 두 날짜의 간격을 반환
   사용법) DateDiff(interval, date1, date2 [,firstdayofweek[, firstweekofyear]])
           - interval : 필수적인 인수로 날짜1과 날짜2 사이의 차이를 계산하는 데 사용할 interval의 문자식

                     yyyy 년, q 분기, m 월, y 일(일년 기준), d 일, w 요일, ww 주(일년 기준), h 시, n 분, s 초                


           - date1, date2 : 필수적인 인수로 날짜식에서 계산에 사용할 두 날짜


           - firstdayofweek : 선택적인 인수로 요일을 지정하는 상수로 지정하지 않으면 일요일로 간주

                            vbUseSystem 0 NLS(National Language Support) API 설정 사용
                            vbSunday 1 일요일(기본값)
                            vbMonday 2 월요일
                            vbTuesday 3 화요일
                            vbWednesday 4 수요일
                            vbThursday 5 목요일
                            vbFriday 6 금요일
                            vbSaturday 7 토요일

           - firstweekofyear : 선택적인 인수로 연도를 기준으로 한 첫째 주를 지정하는 상수
                            지정하지 않으면 1월 1일을 포함하는 주를 첫째 주로 간주한다.
                            vbUseSystem 0 NLS(National Language Support) API 설정 사용
                            vbFirstJan1 1 1월 1일을 포함하는 주에서 시작(기본값)
                            vbFirstFourDays 2 새해의 처음 4일을 포함하는 주에서 시작
                            vbFirstFullWeek 3 새해의 처음 한 주일(7일)을 포함하는 주에서 시작
  

   예) DateDiff("h", "2001년 12월 30일", Date)
       DateDiff("n", "2001년 12월 30일 09:30:00", now)
       DateDiff("s", "2001년 12월 30일 09:30:00", now)

56) DatePart - 주어진 날짜의 지정된 부분을 반환한다.
   사용법) DatePart(interval, date[, firstdayofweek[, firstweekofyear]])
           - interval : 필수적인 인수로 반환할 시간 간격의 문자식이다.

                     yyyy 년, q 분기, m 월, y 일(일년 기준), d 일, w 요일, ww 주(일년 기준), h 시, n 분, s 초


           - date : 필수적인 인수로 계산할 날짜식



           - firstdayof week : 선택적인 인수로 요일을 지정하는 상수로서 지정하지 않으면 일요일로 간주

                            vbUseSystem 0 NLS(National Language Support) API 설정 사용
                            vbSunday 1 일요일(기본값)
                            vbMonday 2 월요일
                            vbTuesday 3 화요일
                            vbWednesday 4 수요일
                            vbThursday 5 목요일
                            vbFriday 6 금요일
                            vbSaturday 7 토요일


           - firstweekofyear : 선택적인 인수로 연도를 기준으로 한 첫째 주를 지정하는 상수
                            지정하지 않으면 1월 1일을 포함하는 주를 첫째 주로 간주한다.
                            vbUseSystem 0 NLS(National Language Support) API 설정 사용
                            vbFirstJan1 1 1월 1일을 포함하는 주에서 시작(기본값)
                            vbFirstFourDays 2 새해의 처음 4일을 포함하는 주에서 시작
                            vbFirstFullWeek 3 새해의 처음 한 주일(7일)을 포함하는 주에서 시작

   예) DatePart("q", now)

57) DateSerial - 지정된 년, 월, 일의 Date 하위 형식인 Variant를 반환한다.
               즉, 임의의 숫자를 입력받아 날짜 형식으로 반환하는 함수이다.
   사용법) DateSerial(year, month, day)
           year : 100에서 9999까지의 수 또는 수식
           month : 모든 수식
           day : 모든 수식
   예) DateSerial(2001, 12, 25)

58) DateValue - Date 하위 형식의 Variant를 반환한다.
   사용법) DateValue(date)

   예) DateValue("2000년 12월 25일")

출처 : Tong - cookjava님의 셈틀 통통

2008/02/21 16:30 2008/02/21 16:30

조금 어려운 면도 있지만 아주 유용한 자료입니다. 플랫폼이 NT 기반이면 다 적용가능한데..

걍 ASP팁란에 올리겠습니다.


출처는 아래 밝혔습니다.


SQL Server에서 사용할 수 있는 서버측 페이징기법

Andrew Rosca

웹 애플리케이션은 일반적으로 사용자에게 많은 양의 정보를 제공하기 위해 페이징 기법을 사용한다.
예를 들어 인터넷 검색엔진은 사용자의 쿼리 결과로 대용량의 결과값을 반환한다.
이 때 검색엔진이 한번에 결과값 전체를 반환하게 되면 결과값을 받는 클라이언트측 시스템에 과부하가 발생
할 수 있다.
하지만 페이징 기법을 사용하게 되면, 반환되는 결과값을 클라이언트측과 서버측 양쪽에서 관리할 수 있을 만
큼의 고정된 크기의 블록으로 구분하여 한 번에 이동시키는 정보의 양을 줄일 수 있다. 애플리케이션에서는
한 번 에 소수의 레코드만 사용자에게 보내게 되며, 결과값 중에서 사용자가 필요로 하는 정보만 반환하게 된
다.

페이징 기법을 사용하면 데이터를 사용자가 좀 더 이해하고 표현하기 쉽게 해 줄 뿐만 아니라, 대량의 정보를
조회하고 표현하기 위해서 시스템에 불필요한 과부하가 발생하여 결국 시스템의 성능에 악영향을 미치지 않
도록 통제하기 때문에 전체적인 시스템 성능을 향상시키게 된다.
정상적으로 시스템에 반환된 결과값 레코드가 페이징되었다면, 검색엔진을 사용하는 사용자는 대부분 맨 처
음 한 페이지 또는 일부 페이지만 조회하게 될 것이다.

불행하게도 많은 프로그래머들이 페이징 관련해서 성능측면에서 매우 중요한 고려사항에 대해서 잘 모르고
있다.
IIS와 SQL Server를 사용하는 환경에서는,
AbsolutePage, PageSize, PageCount와 같은,
표준 ADO RecordSet 페이징 기능을 사용하는 것이 가장 일반적인 페이징 기법이다.
소량(수십 또는 수백 레코드 정도)의 데이터에 대해서는 이러한 기능을 사용하면 정상적으로 동작하고, 시스
템의 성능측면에서도 부하를 발생시키지 않는다. 하지만 레코드 수가 증가하게 되면, 이러한 기능을 사용하
게 되면 효율성이 감소하게 되고 전체적인 애플리케이션의 성능에 악영향을 미치게 된다.

대량의 발주정보를 조회해야 하는 구매조달관련 애플리케이션, 수 천명의 회원이 동시에 접속하는 미팅 웹사
이트, 고객의 검색조건에 따라 수백 개의 상품의 정보를 표시해야 하는 대규모 전자상거래 웹사이트와 같이,
대용량 데이터를 처리해야 하는 애플리케이션의 경우에는 좀 더 개선된 서버측 페이징 기술이 필요하게 된
다. 이번 호의 기사에서는 수백만 개의 행정보를 포함하는 테이블에서도 사용할 수 있는 페이징 기법에 대해
서 소개하고자 한다.


ADO RecordSet 페이징 기법의 한계


대용량의 레코드를 페이징하기 위해서 ADO RecordSet의 페이징기법을 사용할 때 발생하는 문제의 원인은
ADO에서 데이터를 처리하는 방법 때문이다.
ADO 기술구조에서는 데이터베이스에서 정보를 조회하기 위해 서 조회의 대상이 되는 데이터에 대한 포인터
를 관리해야 할 필요가 있다.
데이터에 대한 포인터를 커서 라고 하며, 클라이언트측(예를 들어 ASP 페이지)에서는 각 레코드를 건별로 조
회하게 된다.

ADO RecordSet 개체는 서버측 커서(기본값)와 클라이언트측 커서 유형을 지원한다.
서버측 커서를 사용하게 되면 모든 데이터는 그대로 SQL Server에 두고, 해당 데이터가 필요한 시점에 순서
에 따라 각 레코드를 조회하게 된다.
클라이언트측 커서를 사용하게 되면 필요한 모든 데이터를 클라이인트로 전송한 다음, 클라이언트측 커서를
사용하여 클라이언트측 버퍼 메모리에 있는 데이터를 레코드별로 조회하게 된다.
검색엔진 예제에서처럼 쿼리의 결과값 중에서 일부분만을 표시하거나 사용해야 하는 경우라면 SQL 서버가
클라이언트에서 요청하는 페이지만 전송하고 전체 결과값 중 나머지 레코드는 데이터베이스 서버에 그대로
남겨두게 되는, 서버측 커서를 사용하는 것이 효율적이다.
서버측 커서를 사용하게 되면 클라이언트로 전송되는 레코드 수가 특정 페이지를 구성하는 20~30 레코드 정
도로 제한된다는 것이다.

PageCount 와 같은 일부 레코드셋 페이징 기능을 사용하기 위해서는 클라이언트측 커서를 사용해야 한다.
클라이언트 커서를 사용할 수 있도록 ADO를 설정하기 위해서는 RecordSet의 ClientLocation 속성을
adUseServer에서 adUseClient로 변경해 주면 된다.
[리스트 1]의 VB 코드는 RecordSet 개체에서 클라이언트측 커서와 서버측 커서를 사용하는 방법에 대한 예제
가 나타나 있다. ClientLocation 속성을 asUseClient 로 변경하게 되면, 사용자 쿼리의 결과로 반환되는 데이터
에서 필요로 하는 페이지 수를 판단하기 위해 결과값 전체가 클라이언트로 전송된다.

예를 들어 데이터베이스로부터 5000 레코드를 반환하는 쿼리를 실행했다고 가정하자.
애플리케이션에서 서버측 커서를 사용하게 되면 반환되는 레코드를 한 페이지당 20 레코드씩으로 페이징하
고, 사용자가 1 페이지만 보고 있는 경우라면 애플리케이션에서는 클라이언트로 맨 처음 페이지를 구성하는
20 레코드만을 전송하면 된다.
그 다음 사용자가 두번째 페이지로 이동하면 애플리케이션에서는 21~40번 레코드만 클라이언트로 전송하게
된다. 반면에 클라이언트측 커서를 사용하게 되면 ADO에서는 비록 사용자가 단지 첫 페이지에 해당하는 20
레코드만 필요한 경우라도 5000 레코드 전체를 클라이언트로 전송하게 된다.
이렇게 전체 레코드를 전송하게 되면 결과값이 사용자에게 나타나는 시간이 지연되게 되고, 반환되는 레코드
수가 매우 많은 경우에는 성능에 심각한 악영향을 미칠 수 있다.

다른 페이징 기법

ADO RecordSet 페이징 기법과 관련한 문제가 애플리케이션의 성능에 영향을 미치게 되었기 때문에 필자는
수천 레코드를 페이징해야 하는 웹 애플리케이션에서 사용할 수 있는 다른 페이징 기법을 찾아 보았다.

SQL 서버의 인덱스를 활용하여 전체 결과집합 중에서 상위의 레코드를 선택하는 방법을 소개하고자 한다.

다음은 Northwind 데이터베이스의 Orders 테이블에서 상위 10개의 레코드를 선택하는 쿼리이다.

SELECT TOP 10 * FROM Orders

위의 구문을 활용하면 전체 결과집합에서 10 개의 레코드 단위로 결과값이 반환되게 할 수 있다.
주어진 페이지에 해당하는 레코드만 선택하기 위해서는, 한 페이지에 몇 개의 레코드를 포함시킬 것인지 결정
하고, 실제 사용자가 몇 번째 페이지의 정보를 조회하기를 원하는지에 대한 페이지 카운트를 알고 있어야 한
다.
예를 들어 한 페이지에 10 개의 레코드가 포함되고, 사용자가 전체 결과값 집합 중에서 3 페이지를 조회하고
자 하는 경우라면 다음과 같은 쿼리를 사용하면 된다.

SELECT TOP 10 * FROM Orders WHERE OrderID NOT IN (SELECT TOP 20 OrderID FROM Orders)

위의 쿼리는 맨 처음 20 개의 레코드 이후에 존재하는 10개의 레코드, 즉 21~30번까지의 레코드를 반환한다.
위의 쿼리를 절차코드로 일반화하게 되면 다음과 같이 표현할 수 있다.

SELECT TOP page_size * FROM Orders WHERE OrderID NOT IN (SELECT TOP (page_size * (current_page -
1)) OrderID FROM Orders)

위의 쿼리는 대량의 레코드를 반환하는 경우라도 잘 동작하지만, 반환할 페이지의 숫자가 많아질수록 전체적
인 성능은 감소하게 된다.
문제의 원인은 IN 연산자에 포함되는 쿼리의 결과값이 많아지면서 비효율성이 증가하기 때문이다. 예를 들어
한 페이지당 10개의 레코드를 반환하는 결과집합 중에서 500번째 페이지를 조회하기 위해 쿼리를 실행하게 되
면, IN 연산자의 대상이 되는 서브쿼리에는 다음과 같은 문장이 포함되게 된다.

(SELECT TOP 4990 OrderID FROM Orders)

마지막 10개의 레코드를 조회하기 위해 서버에서는 4990 개의 OrderID와 각 OrderID를 비교해야만 한다.
불필요한 비교작업이 많이 발생하게 된다.
물론 SQL Server의 경우에는 이러한 경우 데이터를 좀 더 빠르고 효율적인 방법으로 검색하기 위해서 인덱스
를 사용하여 빠르게 쿼리를 처리하게 된다.
(OrderID가 기본키로 설정되어 있기 때문에, SQL Server는 기본적으로 인덱스를 사용하게 된다.)
조회하고자 하는 페이지 수가 증가함에 따라 성능면에서 느려지게 된다고 하더라도 이러한 조회성능의 감소
현상은 조회하고자 하는 페이지 수가 매우 큰 경우에만 인식할 수 있게 된다.
이러한 점증적인 성능의 감소현상은 대부분의 경우 사용자가 맨 처음부분의 일부 페이지만 조회하게 되고,
맨 처음부분의 일부 페이지를 조회 할 경우에는 매우 빠른 성능을 보장할 수 있기 때문에 크게 중요한 관심의
대상이 되지 않는다.
애플리케이션이션에서 적절하게 데이터를 정렬하고 필터링한다면 사용자는 찾고자 하는 정보를 거의 한 두
페이지 이내에서 찾게 된다. 만약 맨 처음 부분의 페이지에서 필요로 하는 데이터를 찾지 못한 경우에는 대부
분의 사용자는 예제에서처럼 500 페이지까지 원하는 데이터를 찾고자 계속 다음 페이지를 찾아보는 것이 아
니라 다른 정렬 및 필터링 조건으로 새로운 쿼리를 하게 된다.

앞에서 언급한 것과 같이 검색작업을 수행할 때, 테이블의 기본키가 어떤 컬럼에 설정되었는지가 매우 중요
한 역할을 하게 된다.
기본키에는 각 레코드를 유일하게 식별할 수 있는 컬럼이 포함되어야 하며, 쿼리를 실행할 때 기본키를 기준
으로 해당 레코드를 쿼리의 결과값으로 선택할 것인지 무시할 것인지를 판단하게 된다.
앞의 일반화된 쿼리에는 정렬 및 기본키에 관련한 WHEHE 절이나 ORDER BY 절 내용이 누락되어 있다. 목록 2
에는 이러한 요소를 포함시킨 일반화된 쿼리가 나타나 있다.

정렬은 일반적으로는 비효율적인 작업이며, 쿼리의 성능을 저하시키는 원인이 되기도 한다.
SQL 서버의 경우, 인덱스가 설정된 컬럼에 대해서는 매우 효율적으로 정렬 및 필터링 작업을 할 수 있고,
SQL 서버가 항상 기본키 컬럼에는 인덱스를 생성하기 때문에 쿼리를 좀 더 최적화하여 빠르게 실행한다.
기본키에 설정된 인덱스를 최대한 활용하기 위해서, [리스트 3]과 같이 테이블의 전체 컬럼을 선택하지 않고,
먼저 기본키의 조건으로 대상이 되는 레코드를 검색한 다음에 결과값에 포함되어 있는 기본키값으로 다시 해
당 레코드에 대한 전체 컬럼을 찾아오게 할 수도 있다.
테이블에 기본키 인덱스가 설정되어 있고, 인덱스가 설정된 필드에 대해서만 정렬 및 필터링 작업을 하게 되
면, 조회하고자 하는 레코드를 찾기 위해 인덱스 페이지만을 사용하게 된다. 이렇게 쿼리의 결과값에 필요한
전체 필드가 인덱스에 포함되어 있는 경우를 커버된 인덱스라고 한다.
동일한 쿼리를 실행시킨 경우라도 해당 쿼리가 커버된 인덱스를 사용하는 경우가 일반 테이블에 대해서 쿼리
하는 경우보다 더 빠르게 된다. 맨 마지막으로 선택된 결과값에 해당하는 나머지 정보를 조회하기 위한 작업
을 수행할 때에는(즉, SELECT * 부분), 기본키 인덱스를 사용하여 SQL Server가 해당 인덱스를 바로 찾을 수
있기 때문에 매우 효율적으로 쿼리를 수행하게 된다.

[리스트3]에 나타나 있는 쿼리는 결과집합 중에서 특정 페이지를 매우 효율적이고, 단순한 방법으로 조회하
게 된다. 물론, GROUP BY나 HAVING 절을 추가하여 사용할 수도 있다.
쿼리를 좀 더 단순화하기 위해서 [리스트 4]와 같이 SELECT_WITH_PAGING 라는 저장 프로시저를 생성하여,
기능을 캡슐화하였다.

SELECT_WITH_PAGING 저장프로시저에는 fields_to_return (string), primary_key (string), table_name (string),
page_number (integer, default 1), page_size (integer), get_record_count (true/false), filter_conditions (string),
sort_columns (string), group_by (string)와 같은 매개변수(데이터형)가 입력되게 된다.

예를 들어 한 페이지당 레코드 수를 10개로 지정하고 Northwind 데이터베이스의 Order 테이블으로부터 주문일
자로 정렬하여 CustomerID, ShipName을 조회한 다음, 결과값 중 세번째 페이지를 조회하기 위해서는 다음 문
장을 실행하면 된다.

EXEC SELECT_WITH_PAGING 'CustomerID, ShipName', 'OrderID', 'Northwind.dbo.Orders', 3, 10,
1, '', 'OrderDate'

위의 쿼리를 실행하게 되면 입력된 조건에 따라 필터링되어 반환되는 전체 레코드 수가 두번째 레코드셋으로
반환된다. 전체 레코드 수는 사용자에게 전체 페이지 수를 표시하려고 할 때 유용하게 사용되며, 대부분의 경
우 사용자는 단순하게 이전페이지 또는 다음페이지로 표시되는 것보다는 전체 페이지 수 중에서 현재 조회하
고 있는 페이지의 번호를 표시하는 방법을 더 선호한다.
조건에 해당하는 전체 레코드 수를 조회하기 위해서 필자는 여섯번째 매개변수를 1로 설정하였다.
만약 여섯번째 매개변수를 설정하지 않으면 데이터베이스로부터 페이지당 레코드로 제한된 10개의 레코드만
을 반환하게 되기 때문에 전체 레코드 수가 몇 개인지는 알 수 없게 된다.

table_name 매개변수에는 두 개 또는 그 이상의 테이블에 대한 조인을 설정하는 문장이 올 수도 있고, 필요에
따라 서브쿼리도 올 수 있다.
예를 들어, 다음 두 문장은 table_name 매개변수에 모두 사용될 수 있다.

'Northwind.dbo.Orders A JOIN Northwind.dbo.Customers B ON A.CustomerID = B.CustomerID' '(SELECT *
FROM Northwind.dbo.Orders WHERE OrderDate > ''8/1/1996'') AS tbl'

이번 호의 기사에서 소개한 페이징 기법은 레코드의 수가 매우 많은 경우에 서버측 페이징을 처리하기 위해
매우 단순하고, 효율적으로 사용할 수 있으며, 필자의 경우에는 수백만 행이 포함되어 있는 테이블에 대해서
도 사용한 경험이 있다. 예를 들어 2천 5백만 레코드가 있는 테이블에 대해서 맨 처음 일부 페이지를 조회하
는 쿼리를 실행할 때, ADO RecordSet 페이징 기법을 사용했을 때에는 거의 40초가 걸렸으나 이번 호에 소개
한 저장프로시저를 사용한 경우에는 1초로 수행시간을 단축할 수 있었다.
이처럼 이번 호에 소개한 페이징 기법은 조회의 대상이 되는 데이터양이 많아서 ADO RecordSet 페이징 기법
을 사용하게 되면 성능상 문제가 발생할 수 있는 상황에서 유용한 대안으로 사용할 수 있다.


[리스트 1] ClientLocation 속성을 변경하는 코드
Dim objConn As ADODB.Connection
Dim objRS As ADODB.Recordset
' 연결 생성
Set objConn = New ADODB.Connection
objConn.Open "Driver=SQL Server; Server=localhost; Database=Northwind"
Set objRS = New ADODB.Recordset
   ' 클라이언트측 커서를 사용하게 하는 옵션
objRS.CursorLocation = adUseClient
   ' 서버측 커서를 사용하게 하는 옵션
   objRS.CursorLocation = adUseServer
objRS.Open "SELECT * FROM Orders", objConn, adOpenStatic,
adLockOptimistic
   ' 이 문장은 페이징을 위해서 필요하지만, 서버측 커서를 사용하는 경우에는 에러의 원인이 된다.
   Debug.Print "Total records: " & objRS.RecordCount

[리스트 2] 정렬을 위한 조건절을 지정한 일반화된 페이징 쿼리
SELECT TOP page_size * FROM table WHERE primary_key NOT IN
(SELECT TOP page_size * (page_number - 1) primary_key FROM table
WHERE filter_conditions
ORDER BY sort_field)
AND filter_criteria
ORDER BY sort_field



[리스트 3] 기본키에 검색조건을 먼저 설정하는 일반화 쿼리
SELECT * FROM table WHERE primary key IN
(SELECT TOP page_size primary_key FROM table
WHERE primary_key NOT IN

(SELECT TOP page_size * (page_number - 1) primary_key FROM table
WHERE filter_conditions ORDER BY sort_field) AND filter_criteria
ORDER BY sort_field)
ORDER BY sort_field


[리스트 4] SELECT_WITH_PAGING 저장 프로시저
CREATE PROCEDURE SELECT_WITH_PAGING (
@strFields varchar(4000),
@strPK varchar(100),
@strTables varchar(4000),
@intPageNo int = 1,
@intPageSize int = NULL,
@blnGetRecordCount bit = 0,
@strFilter varchar(8000) = NULL,
@strSort varchar(8000) = NULL,
@strGroup varchar(8000) = NULL)
/* 매개변수에 따라 반환되는 결과값을 특정 페이지로 정의하거나 전체 행을 모두 반환할 수 있도록 설정한
다. */
AS
DECLARE @blnBringAllRecords bit
DECLARE @strPageNo varchar(50)
DECLARE @strPageSize varchar(50)
DECLARE @strSkippedRows varchar(50)
DECLARE @strFilterCriteria varchar(8000)
DECLARE @strSimpleFilter varchar(8000)
DECLARE @strSortCriteria varchar(8000)
DECLARE @strGroupCriteria varchar(8000)
DECLARE @intRecordcount int
DECLARE @intPagecount int
/* 페이징 조건 정규화 의미있는 페이징 조건이 입력되지 않은 경우, 페이징하지 않고 좀 더 효율적인 방법으
로 쿼리를 실행시키기 위해 blnBringAllRecords 플래그를 사용 */
IF @intPageNo < 1
SET @intPageNo = 1
SET @strPageNo = CONVERT(varchar(50), @intPageNo)
IF @intPageSize IS NULL OR @intPageSize < 1 ?- 페이징하지 않고 전체 행을 반환
SET @blnBringAllRecords = 1
ELSE
BEGIN
SET @blnBringAllRecords = 0
SET @strPageSize = CONVERT(varchar(50), @intPageSize)
SET @strPageNo = CONVERT(varchar(50), @intPageNo)
SET @strSkippedRows = CONVERT(varchar(50), @intPageSize * (@intPageNo - 1))
END
/* 정렬 및 필터링 조건 정규화 정렬 및 필터링 조건이 지정되지 않으면, 필터링이나 정렬작업이 수행되지 않
도록 하여 쿼리의 성능을 향상시킴.*/
IF @strFilter IS NOT NULL AND @strFilter != ''
BEGIN
SET @strFilterCriteria = ' WHERE ' + @strFilter + ' '
SET @strSimpleFilter = ' AND ' + @strFilter + ' '
END
ELSE
BEGIN
SET @strSimpleFilter = ''
SET @strFilterCriteria = ''
END
IF @strSort IS NOT NULL AND @strSort != ''
SET @strSortCriteria = ' ORDER BY ' + @strSort + ' '
ELSE
SET @strSortCriteria = ''
IF @strGroup IS NOT NULL AND @strGroup != ''
SET @strGroupCriteria = 'GROUP BY' + @strGroup + ' '
ELSE
SET @strGroupCriteria = ''
/* 실제 조회작업을 시작 */
IF @blnBringAllRecords = 1 -- 페이징 하지 않고 단순한 SELECT 문장만을 실행
BEGIN

EXEC (
'SELECT ' + @strFields + 'FROM' + @strTables + @strFilterCriteria +
@strGroupCriteria + @strSortCriteria
)
END -- 전체 레코드를 반환.
ELSE -- 지정된 페이지를 반환
BEGIN
IF @intPageNo = 1 -- 맨 처음 페이지를 찾기 때문에 서브쿼리가 없어서 가장 효율적으로 실

행된다.
EXEC (
'SELECT TOP' + @strPageSize + ' ' + @strFields + 'FROM' + @strTables +
@strFilterCriteria + @strGroupCriteria + @strSortCriteria
)
ELSE -- 특정 페이지를 선택하기 위해 서브쿼리 구조를 실행한다.
EXEC (
'SELECT' + @strFields + 'FROM' + @strTables + 'WHERE' + @strPK + 'IN' + '
(SELECT TOP' + @strPageSize + ' ' + @strPK + 'FROM' + @strTables +
' WHERE' + @strPK + 'NOT IN' + '
(SELECT TOP' + @strSkippedRows + ' ' + @strPK + 'FROM' + @strTables +
@strFilterCriteria + @strGroupCriteria + @strSortCriteria + ') ' +
@strSimpleFilter +
@strGroupCriteria +
@strSortCriteria + ') ' +
@strGroupCriteria +
@strSortCriteria
)
END -- 특정 페이지를 지정한 경우
/* 전체 레코드 수를 반환하도록 지정된 경우 */
IF @blnGetRecordCount = 1
IF @strGroupCriteria != ''
EXEC (
'SELECT COUNT(*) AS RECORDCOUNT FROM (SELECT COUNT(*) FROM' +
@strTables + @strFilterCriteria + @strGroupCriteria + ') AS tbl (id)
)
ELSE
EXEC (
'SELECT COUNT(*) AS RECORDCOUNT FROM' + @strTables + @strFilterCriteria

+ @strGroupCriteria)
GO

출처 : SQL2000 매거진

2008/02/21 16:02 2008/02/21 16:02
사용자 삽입 이미지
아바타를 꾸미는 소스 활용해보세요!!
2008/02/21 16:00 2008/02/21 16:00

데브피아에서 함희수(hhs93)님이 쓰신글입니다.

굉장히 유용한 팁입니다. 웹사이트가 느려지는 경우가 과도한 트래픽아니면, 잦은 디비연결 요구거든요.

그래서 대부분의 메인페이지는 디비연결을 최소화 하기 위해서 순수한 html로 띄워놓습니다. 변경되는

내용은 배치처리로 반영하구요. 밑에서 부터 원문입니다.


출처: http://www.devpia.com 



태요 사이트에서 올렸는데요..

여기에도 한번 올려봅니다.

다들 아시는 내용이 아닌지..???

삭제하라면 삭제 하겠습니다.


사이트 방문자가 많은 경우에
메인에 디비로 연결해서 하게 되면은 서버에 부하를 많이 주게 됩니다
그래서 일반적으로 배치를 돌려서 파싱된 htm파일로 만들어서
그냥 htm파일을 실행하게 합니다.
간단하게 하는 방법이니 참고 하세요.


Set objWinHttp = Server.CreateObject("WinHttp.WinHttpRequest.5.1") objWinHttp.Open "GET", "실행할 asp파일경로(예.http://www.aaa.com/index.asp)", false objWinHttp.Send() returnmsg = fnStreamBinaryToString(objWinHttp.ResponseBody, "euc-kr") set objWinHttp = nothing
dim CurrentDirectory CurrentDirectory=server.MapPath("/")&"\"'저장할 파일 경로 Userfilename=CurrentDirectory & "index.htm" dim objFso set objFso=server.CreateObject("Scripting.Filesystemobject") set objFiler=objFso.CreateTextFile (Userfilename, true) set objFiler=nothing
dim objFile set objFile=objFSO.OpenTextFile(Userfilename,8,true) objFile.WriteLine returnmsg objFile.close set objFso=nothing

Function fnStreamBinaryToString(Binary, CharSet) Const adTypeText = 2 Const adTypeBinary = 1
'//Create Stream object Dim BinaryStream 'As New Stream Set BinaryStream = CreateObject("ADODB.Stream") '//Specify stream type - we want To save text/string data. BinaryStream.Type = adTypeBinary '//Open the stream And write text/string data To the object BinaryStream.Open BinaryStream.Write Binary '//Change stream type To binary BinaryStream.Position = 0 BinaryStream.Type = adTypeText '//Specify charset For the source text (unicode) data. If Len(CharSet) > 0 Then BinaryStream.CharSet = CharSet Else BinaryStream.CharSet = "us-ascii" End If '//Open the stream And get binary data from the object fnStreamBinaryToString = BinaryStream.ReadText End Function
위와 같이 사용하시면 어떨지 모르겠네요..
지금까지 초보였습니다.
2008/02/21 15:58 2008/02/21 15:58
 

데브피아의 이광수님이 쓰신 글입니다.


출처: http://www.devpia.com

URL:http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=57&MAEULNO=22&no=1853&page=2


ASP하면 MS-SQL, PHP하면 mysql이 생각납니다. 이에 대해서는 여러가지 이유가 있겠지만, 궁합(?)이 가장 잘 맞기 때문이겠죠~

하지만, 실무현장에는 여러가지 이유로 이러한 궁합이 깨지곤 하는데요. PHP + Oracle, ASP + MySQL등이 이러한 경우입니다. 연동하는데 그다지 어려운 점은 없지만, 도움이 필요하신 분들을 위해 간략하게 작성해봅니다.


* IIS 설정 방법과 MySQL, MyODBC 설치방법은 생략합니다.


:: 다운로드

MySQL 4.1
http://dev.mysql.com/downloads/mysql/4.1.html

MySQL Connector/ODBC 3.51
http://dev.mysql.com/downloads/connector/odbc/3.51.html

MySQL Query Browser
http://dev.mysql.com/downloads/query-browser/1.1.html


:: 설치

MySQL과 MyODBC, Query Brower를 설치합니다.


:: database와 table 생성

MySQL Query Browser를 이용하여 아래와 같이 address와 contacts를 생성합니다.

  1) address 생성

create database address;

  2) assress 사용

use address;

  3) contacts 생성

create table contacts
(

   contactId int auto_increment not null,

   firstName varchar(50),

   lastName varchar(50),

   address1 varchar(100),

   address2 varchar(100),

   phone varchar(20),

   primary key(contactId),

   unique id(contactId)

);


:: dns_test.asp 작성

생성한 DB에 접근할 수 있는지 확인하기 위해 아래와 같이 작성합니다.

<%

   dim adoConn

   set adoConn = Server.CreateObject("ADODB.Connection")

   adoConn.Open "Driver={MySQL ODBC 3.51 driver}; Server=localhost; Database=address; Uid=root;Pwd=121212;"

   if adoConn.errors.count = 0 then

      response.write "Connected Successfully!"

   end if

   adoConn.close
   set adoConn = nothing

%>


브라우저를 통해 http://localhost/dns_test.asp 를 입력해 Connected Successfully 라는 글이 나타난다면 ASP에서 MySQL를 사용할 준비가 된 것입니다.


:: 꼭 알아두기

adoConn.Open "Driver={MySQL ODBC 3.51 driver}; Server=localhost; Database=address; Uid=root;Pwd=121212;"

이 내용이 가장 중요합니다. Driver를 MySQL ODBC 3.51 driver로 지정해주었다는 것을 기억하세요.


:: 참조

http://dev.mysql.com/doc/refman/5.0/en/odbc-connector.html

http://www.devarticles.com/c/a/ASP/Using-MyODBC-To-Access-Your-MySQL-Database-Via-ASP/

2008/02/21 15:58 2008/02/21 15:58
[FileSystemObject를 이용한 폴더(디렉토리) 생성하기]


작성자: 다자래(mfcchang@naver.com)


FileSystemObject를 이용해서 폴더(디렉토리)를 생성하는 짧은 예제입니다. 앞의 몇번의 예제에서도 등장하였지만
FileSystemObject(FSO)를 사용하기 위해서는 CreateObject를 메서드를 사용하여 FileSystemObject를 만들어야
합니다. 아래 박스 참조

Dim Fso '변수를 생성 

Set Fso = Server.CreateObject("Scripting.FileSystemObject") 'FileSystemObject 객체를 생성

.....Fso를 이용한 처리
....

Set Fso = nothing '객체제거


밑에 예제는 "C:\Temp"라는 폴더(디렉토리)의 존재 여부를 검사해서 존재하지 않으면 폴더를 생성하고, 존재하면
"폴더가 존재합니다"라는 메시지를 출력하는 것을 보여주고 있습니다..

<%

Dim Fso, strDir

strDir = "C:\Temp"

Set Fso = Server.CreateObject("Scripting.FileSystemObject") '파일객체 생성

If Not Fso.FolderExists(strDir) Then 'C:\Temp폴더가 존재하지 않으면
strDir = Fso.CreateFolder(strDir) 'C:\Temp폴더를 생성
Response.Write strDir & " 폴더 생성에 성공하였습니다."
Else
Response.Write strDir & " 폴더가 존재합니다."
End If

Set Fso = nothing

%>

2008/02/21 15:57 2008/02/21 15:57

HOWTO: 세션 쿠키를 사용하지 않고 값을 보존하는 방법

출처: Microsoft고객기술지원
URL: http://support.microsoft.com/kb/175167/ko

요약

HTML 양식을 사용하는 웹 사이트를 개발하는 경우 나중에 사용하기 위해 사용자가 입력한 정보를 추적해야 할 수
도 있습니다. 이 작업을 "값 보존"이라고 합니다.
Active Server Pages(ASP)는 이 작업을 편리하게 수행할 수 있는
세션 변수를 제공하지만 이 변수를 사용하려면 세션 ID가 필요합니다. 본 문서에서는 세션 쿠키를 사용하지 않고 양
식 값을 저장하는 방법을 설명합니다.

추가 정보

HTML로 개발할 때 값을 보존하기 위해 일반적으로 아래 세 가지 방법을 사용합니다.

값을 양식의 숨김 필드에 저장
값을 숨김 필드에 저장하면 값은 보이지 않지만 손상되지 않습니다. 사용자가 양식을 전송하면 양식 값이 읽혀진 다음
곧바로 HTML 양식의 숨김 필드에 다시 작성됩니다. 이 값은 그 양식이 전송될 때 다른 필드와 함께 전송됩니다.

아래의 세 페이지는 이 방법에 대한 예를 보여줍니다.

<%@ LANGUAGE="VBSCRIPT" %>
<!-- This is FORM1.HTM -->

<HTML>
<HEAD><TITLE>FORM1.HTM</TITLE></HEAD>
<BODY>
<Form Action=Form2.asp Method=Post>
<Input Type=Text Value="Page1 Value" Name="Value1"><P>

<Input Type=Submit Name=btnSubmit>
</Form>
</BODY>
</HTML>

<!-- This is FORM2.ASP -->
<%@ LANGUAGE="VBSCRIPT" %>
<%
Response.Cookies("Value1") = Request("Value1")
' If you wish to have the value persisted beyond the current visit,
' you must also assign an expiration date as follows:
Response.Cookies("Value1").Expires = "July 31, 1998"
%>
<HTML>
<HEAD><TITLE>FORM2.ASP</TITLE></HEAD>
<BODY>
<Form Action=Form3.asp Method=Post>
<Input Type=Text Value="Page2 Value" Name="Value2"><P>
<Input Type=Submit Name=btnSubmit>
</Form>
</BODY>
</HTML>

<!-- This is FORM3.ASP -->
<%@ LANGUAGE="VBSCRIPT" %>
<HTML>
<HEAD><TITLE>FORM3.ASP</TITLE></HEAD>
<BODY>
Value 1 = <%= Request("Value1") %><BR>
Value 2 = <%= Request("Value2") %><BR>
</BODY>
</HTML>


값을 URL에 추가

이 방법은 첫 번째 방법과 비슷하지만 값을 숨김 변수에 전달하지 않고 대신 URL의 끝에 추가하여 전송합니다. 이 방법의
단점은 브라우저마다 다를 수 있는 URL의 크기 제한에 있습니다. 또한, 개인 정보나 기타 정보가 다른 사용자에게 노출되
기 쉽습니다. 아래의 페이지는 이 방법에 대한 예를 보여줍니다.

<!-- This is FORM1.HTM -->
<%@ LANGUAGE="VBSCRIPT" %>
<HTML>
<HEAD><TITLE>FORM1.HTM</TITLE></HEAD>
<BODY>
<Form Action=Form2.asp Method=Post>
<Input Type=Text Value="Page1 Value" Name="Value1"><P>

<Input Type=Submit Name=btnSubmit>
</Form>
</BODY>
</HTML>

<!-- This is FORM2.ASP -->
<%@ LANGUAGE="VBSCRIPT" %>
<HTML>
<HEAD><TITLE>FORM2.ASP</TITLE></HEAD>
<BODY>

<Form Action="Form3.asp?value1=<%=
Server.URLEncode(Request("Value1"))
%>" Method=Post>
<Input Type=Text Value="Page2 Value" Name="Value2"><P>

<Input Type=Submit Name=btnSubmit>
</Form>
</BODY>
</HTML>

<!-- This is FORM3.ASP -->
<%@ LANGUAGE="VBSCRIPT" %>
<HTML>
<HEAD><TITLE>FORM3.ASP</TITLE></HEAD>
<BODY>
Value 1 = <%= Request("Value1") %><BR>
Value 2 = <%= Request("Value2") %><BR>
</BODY>
</HTML>


자신만의 쿠키에 기록

이 방법은 정보를 다시 클라이언트 컴퓨터에 기록해야 하기 때문에 잘 사용되지 않습니다. 이 방법이 일반적인 세션 기반
변수를 사용하는 방법보다 나은 점은 브라우저를 통해 나중에 다시 방문할 수 있도록 정보를 보존한다는 것뿐입니다. 이
때문에 웹 서버에 정보를 유지할 필요성이 줄어듭니다.


<!-- This is FORM1.HTM -->
<%@ LANGUAGE="VBSCRIPT" %>
<HTML>
<HEAD><TITLE>FORM1.HTM</TITLE></HEAD>
<BODY>
<Form Action=Form2.asp Method=Post>
<Input Type=Text Value="Page1 Value" Name="Value1"><P>
<Input Type=Submit Name=btnSubmit>
</Form>
</BODY>
</HTML>

<!-- This is FORM2.ASP -->
<%@ LANGUAGE="VBSCRIPT" %>
<% Response.Cookies("Value1") = Request("Value1") %>
<HTML>
<HEAD><TITLE>FORM2.ASP</TITLE></HEAD>
<BODY>
<Form Action=Form3.asp Method=Post>
<Input Type=Text Value="Page2 Value" Name="Value2"><P>
<Input Type=Submit Name=btnSubmit>
</Form>
</BODY>
</HTML>

<!-- This is FORM3.ASP -->
<%@ LANGUAGE="VBSCRIPT" %>
<HTML>
<HEAD><TITLE>FORM3.ASP</TITLE></HEAD>
<BODY>
Value 1 = <%= Request.Cookies("Value1") %><BR>
Value 2 = <%= Request("Value2") %><BR>
</BODY>
</HTML>


본 문서의 정보는 다음의 제품에 적용됩니다.
Microsoft Active Server Pages 1.0
Microsoft Visual Studio 97 서비스 팩 3
Microsoft Internet Information Server 4.0
Microsoft Internet Information Services 5.0
2008/02/21 15:57 2008/02/21 15:57

[저장된 html 파일을 이용한 메일 발송하기]

작성자: 다자래(mfcchang@naver.com)


ASP에서 CDONTS를 이용한 메일 발송하기 예제 두번째입니다. 처음에 소개된 예제는 html 이 변하지 않는다는
조건하에 html 태그를 mail이라는 문자열에 담아서 처리하는 방법이였습니다. 아래의 박스는 그 예를 보여주고 있
습니다.

mail = name & "<table width='658' border='0' cellspacing='0' cellpadding='0'>"
mail = mail & "<tr bgcolor='BDBABD'>"
mail = mail & "<td colspan='3' height='1'></td>"
mail = mail & "</tr>"
mail = mail & "<tr>"
mail = mail & "<td bgcolor='BDBABD' width='1'></td>"
mail = mail & "<td width='656'>"
mail = mail & "<table width='656' border='0' cellspacing='0' cellpadding='0'>"
..........................
..........................중간생략
..........................

name = "테스트" '받는고객 이름
Email = "test@testto.co.kr" '받는사람 메일주소
fromMail = "test@test.co.kr" '보낸사람 메일주소

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

content=Replace(Replace(mail,chr(13)&chr(10),""),"[고객이름]",name)

Set objMail = Server.CreateObject("CDONTS.NewMail")
objMail.From = fromMail
objMail.To = Email
objMail.subject = name &"님께 메일을 보냅니다"
objMail.Body = content

이번에 소개해 드리는 방법은 파일객체를 생성하여 저장되어 있던 html파일을 읽어들여서 처리하는 방법입니다.
html파일의 내용이 변하여도 메일발송에는 아무런 제약이 없습니다. 파일객체가 읽어들일 html파일의 경로만 정확
하다면 바뀐내용 그대로 메일발송이 이루어집니다. 아래 예제는 파일객체를 생성하여 html파일을 읽어들인후 처리
하는 예제입니다.

 

예제 )

<%

Set Fso = Server.CreateObject("Scripting.FileSystemObject") '파일객체 생성
Set objfile = Fso.OpenTextFile("C:\mail\testmail.html",1)

'읽어들인 html파일 열기
mail = Trim(objfile.ReadAll)

name = "고객님" '받는고객 이름
ToMail = "toTest@Test.co.kr" '받는사람 메일주소
fromMail = "fromTest@test.co.kr" '보낸사람 메일주소

content=Replace(Replace(mail,chr(13)&chr(10),""),"[고객이름]",name)

Set objMail = Server.CreateObject("CDONTS.NewMail")
objMail.From = fromMail
objMail.To = ToMail
objMail.subject = "[메일예제입니다.]" '메일제목
objMail.Body = content
objMail.BodyFormat = 0 ' HTML일떄 0, 일반 Text일때 1 으로 설정한다.
objMail.MailFormat = 0 ' HTML일떄 0, 일반 Text일때 1 으로 설정한다.
objMail.Send
Set objMail = nothing

%>




2008/02/21 15:57 2008/02/21 15:57

[ASP에서 Redim() 함수를 이용한 동적배열 사용]

 

작성자: 다자래(mfcchang@naver.com)

ASP에서 Redim()함수를 이용한 동적배열 처리의 짧은 예제입니다. Redim()함수는 배열의 크기를 조정할때 쓰며
기존의 배열에 저장된 값은 보존되지 않습니다. 기존 값을 보존하기 위해서는 Redim()함수와 Preserve라는 파라
미터가 함께 사용되어야 합니다. 아래 예제는 100개의 동적배열을 잡고 값을 할당합니다.


<HTML>
<HEAD>
<TITLE>New Document</TITLE>
</HEAD>
<BODY>

<%


Dim nArray()


nCount = 100 '동적배열의 크기'

For i = 0 to nCount
ReDim Preserve nArray(i) 'ReDim()함수와 Preserve 파라미터를 사용
nArray(i) = i '배열에 값을 할당
Next

'배열에 할당된 값을 확인합니다.
For i = 0 to Ubound(nArray)
Response.Write "(" & i & ")의 값: " & nArray(i) & "<br>"
Next


%>

</BODY>
</HTML>

2008/02/21 15:56 2008/02/21 15:56

Html내의 Table을 엑셀로 저장하기


아래와 같은 html내의 Table을 엑셀로 저장하는

아주 간단한 팁입니다.


번호

멤버별명

카페주소

1

다자래

http://cafe.naver.com/webdeveloper.cafe

2

오렌지

http://cafe.naver.com/webdeveloper.cafe


<%

 

function strLenChk(strTemp)
  if len(strTemp) < 2 then
     strAdd = "0"
  strTemp  = strAdd &strTemp
  end if
  strLenChk = strTemp
end function

 

toYear  =  year(now)
toMonth = strLenChk(month(now))
toDay   = strLenChk(day(now))

 

strToday = toYear & toMonth & toDay
strTitle = "XLS저장예제"
strfileExtension = ".XLS"

 

'다른건 중요하지 않습니다. 아래 두줄만 삽입해 주시고, 밑에 저장하고자 하는 데이타를 테이블 태그를 이용해서

'삽입하시면 됩니다. 

Response.ContentType = "application/vnd.ms-excel"

Response.AddHeader "Content-Disposition","attachment; filename="& strToday & strTitle & strfileExtension
%>

<!---- 여기서 부터  저장하고자 하는 데이타를 테이블 태그를 이용해서 삽입하시면 됩니다. ----->
<table border=1 cellspacing=0 cellpadding=0>
  <tr>
  <td width=115 valign=top style='width:86.4pt;border:solid windowtext 1.0pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoNormal>번호</p>
  </td>
  <td width=120 valign=top style='width:90.0pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoNormal>멤버별명</p>
  </td>
  <td width=346 valign=top style='width:259.6pt;border:solid windowtext 1.0pt;
  border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt:
  solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoNormal>카페주소</p>
  </td>
 </tr>
 <tr>
  <td width=115 valign=top style='width:86.4pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoNormal><span lang=EN-US>1</span></p>
  </td>
  <td width=120 valign=top style='width:90.0pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoNormal>다자래</p>
  </td>
  <td width=346 valign=top style='width:259.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoNormal><span lang=EN-US>http://cafe.naver.com/webdeveloper.cafe</span></p>
  </td>
 </tr>
 <tr>
  <td width=115 valign=top style='width:86.4pt;border:solid windowtext 1.0pt;
  border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
  padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoNormal><span lang=EN-US>2</span></p>
  </td>
  <td width=120 valign=top style='width:90.0pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoNormal>오렌지</p>
  </td>
  <td width=346 valign=top style='width:259.6pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 5.4pt 0cm 5.4pt'>
  <p class=MsoNormal><span lang=EN-US>http://cafe.naver.com/webdeveloper.cafe</span></p>
  </td>
 </tr>
</table>

2008/02/21 15:56 2008/02/21 15:56