Search Results for '프로그래밍/Asp'
198 posts related to '프로그래밍/Asp'
- 2009/05/16 이미지 링크가 깨졌을때 이미지 대체 스크립트
- 2009/05/16 ASP 불법 게시물 자동 등록 막기 2
- 2009/04/27 textarea 에 asp 코딩 편하게~ 1
- 2009/04/27 ASP로 테스트 해본 RSS Reader
- 2009/04/27 ASP용 로그 기록 클래스
- 2009/04/27 사진 업로드시 워터 마크 자동 입력 프로그램입니다.
- 2009/04/27 WireFrame.ASP 소개
- 2009/04/27 GeoIP 국가별 IP체크
- 2009/04/27 페이지 수행시간 체크 심플컴퍼넌트(백만분의1초 정확성)
- 2009/04/27 Classic ASP용 XMLRPC Class
- 2009/04/27 Classic ASP용 Database Object
- 2009/04/27 외부 이미지 저장 소스
- 2009/04/21 FSO example
- 2009/04/21 read/write configuration class (xml version)
- 2009/04/21 dbhelper class
- 2009/04/21 view source &asp coloring
- 2009/04/21 Class implementation for using webservices in ASP
- 2009/04/21 ASP JSON Utility
- 2009/04/21 먼저 아래와 같이 c#을 작성하여 test.cs로 저장합니다.
- 2009/04/12 [ASP소스] MD5 암호화소스
- 2008/02/21 ASP 함수 모음
- 2008/02/21 SQL Server에서 사용할 수 있는 서버측 페이징기법
- 2008/02/21 아바타를 꾸미는 소스!!
- 2008/02/21 ASP페이지를 정적인 HTML파일로 만들기
- 2008/02/21 ASP + MySQL 연동
- 2008/02/21 FileSystemObject를 이용한 폴더(디렉토리) 생성하기
- 2008/02/21 HOWTO: 세션 쿠키를 사용하지 않고 값을 보존하는 방법
- 2008/02/21 저장된 html 파일을 이용한 메일 발송하기
- 2008/02/21 ASP에서 Redim() 함수를 이용한 동적배열 사용
- 2008/02/21 Html내의 Table을 엑셀로 저장하기
먼저 특정 쿠키를 만든다, 이 쿠키값은 처리 페이지에서 세션값과 비교하여 같을때만 게시물을 등록 시킨다.
즉 쿠키값이 없이 곧바로 쓰기 페이지에서 게시물을 등록하는 경우에는 게시물이 등록될 수 없다.
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
%>
textarea 에 VS수준의 인텔리센스 기능을 탑재시켜주는
야심찬 계획의 프로토타입 입니다
<%
set db = server.createobject("adodb.connection")
db.open application("connectionstring")
set rs = db.execute("select getdate() as current_time")
....
정도 구문은 무난하군요
질문에 대한 해결책으로 만들다 보니 간략한 RSS리더가 되버렸네요.
RSS의 출력 XML형식은 표준이니 RSS리더 공부하시거나 원격지 서버의 XML Data를
핸들링 하는 법이 포함되어 있습니다.
지극히 간단한 코드이며 Javascript로 변환도 가능하지만 Javascript로 변환하게되면 IE전용으로 변쉰합니다.
DOM 선언 부분이 FF, IE, Opera 각가 다른 방법을 사용합니다.
일단 ASP로 리더를 한번 구현 해보시고 싶으시다면 참고해보시기 바랍니다.
소스에 있는 내용이 꼭 정답은 아닙니다.
XML DOM을 핸들링 하는 방법은 여러가지가 있기 때문이죠.
ChildNode, document.getElementTagName 와 같이 혼용할 수도 있습니다.
그럼~
PS. .net로 가게되면 거의 표준으로 코딩해야 합니다. ^^
많은 개발자들이 개발을 하면서 중간 중간 소스에 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만 볼수도 있습니다.
유용한 프로그램이에요 ^^
그럼 사용해보시고 부족한 부분은 리플 달아주세요~
서버에 설치되어서 돌아가는 응용프로그램인 관계로 서버 호스팅 받는 분들만 가능하네요.
아래는 원본 설명입니다.
====================================================
원본글 주소 :
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 생성 저장 (워터 마크 있는 이미지)
혹시 사용상의 문제점이 있으면 덧글 달아 주세요.....
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 목록 조회 위주의 간단한 프로토타입 제작용으로 사용가능하며, 실서비스 개발에는 무리가 있습니다
저조차도 진짜 사용할지, 기능개선은 언제가 될지 모르겠습니다만, 오랜만에 재미있게 코딩한 것 같아서, 이곳에 올려둡니다
출처
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) 자료실에도 등록되어 있습니다.
안에 asp파일도 같이 있습니다.
페이지의 수행시간을 체크하는데 유용합니다. 무지 무지 가벼운 컴퍼넌트
Tm.setTimeStart() 시작
<프로그램수행>
Tm.setTimeEnd() 끝
Tm.getTimeResult() 시작과 끝을 정확하게 계산한뒤에 값을 리턴합니다.
정확성 때문에 doubl값으로 넘어오는데
그냥 결과를 출력하면 1.02656598-3E 이렇게 출력되기 때문에
다음과 같이 해줬습니다.
FormatNumber(Tm.getTimeResult(),7)
그럼 ...
일단 버그 있을지도 모릅니다... ㅠㅠ
일단 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 파일을 열어보시길 권합니다 -.-;
설명이 뭐 필요하겠습니까 예제부터 보시죠
예제)
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 연결구문입니다.
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
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> </td><td> </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> </td><td align=center><img src=""images/filefolder.jpg""></td><td><a href=""?command=drives"">..</a></td><td> </td><td> </td><td> </td></tr>"
else
response.write "<tr bgcolor=white><td> </td><td align=center><img src=""images/filefolder.jpg""></td><td><a href=""?command=folders&folder=" & server.urlencode(objFolder.ParentFolder) & """>..</a></td><td> </td><td> </td><td> </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> </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
%>
<%
'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>
%>
<!--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
%>
<%
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, "<%")
if firstPos <= 0 then
exit do
end if
lastPos = instr(firstPos, strTemp, "%>")
if lastPos <= 0 then
lastPos = len(strTemp)
end if
lastPos = lastPos + len("%>") - 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,"&","&"),"<","<"),">",">")," "," ")," "," "),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
%>
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
<%
'**************************************************************************************************************
'* 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
%>
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를 실행합니다. :)
0cc175b9c0f1b6a831c399e269772661 입니다.
여기서 0cc175b9c0f1b6a831c399e269772661 와 같은 결과값에서 원래 문자열 a 를
찾아낼 수가 없어야 한다는 것이 단방향성입니다.
그리고, 동일한 결과값 0cc175b9c0f1b6a831c399e269772661 을 가지는 특정한 문자열을
찾아내는 것이 불가능해야 한다는 것이 충돌 회피성입니다.
y = f(x) 라는 함수가 존재할때
y 값만을 가지고 x 를 찾아낼 수가 없어야 하고
동일한 y 값을 가지는 x 와 x' 를 계산해내는 것이 불가능해야 한다는 것이지요..
실제 업무에서는 아이디, 비밀번호, 각종 쿠키값등에서 MD5 등을 이용하면 악의적인 목적의 사용자가
임의로 값을 변경하거나 유추해내는 것이 사실상 불가능하다고 볼 수 있습니다.
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일")
조금 어려운 면도 있지만 아주 유용한 자료입니다. 플랫폼이 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 매거진
데브피아에서 함희수(hhs93)님이 쓰신글입니다.
굉장히 유용한 팁입니다. 웹사이트가 느려지는 경우가 과도한 트래픽아니면, 잦은 디비연결 요구거든요.
그래서 대부분의 메인페이지는 디비연결을 최소화 하기 위해서 순수한 html로 띄워놓습니다. 변경되는
내용은 배치처리로 반영하구요. 밑에서 부터 원문입니다.
태요 사이트에서 올렸는데요..
여기에도 한번 올려봅니다.
다들 아시는 내용이 아닌지..???
삭제하라면 삭제 하겠습니다.
사이트 방문자가 많은 경우에 메인에 디비로 연결해서 하게 되면은 서버에 부하를 많이 주게 됩니다 그래서 일반적으로 배치를 돌려서 파싱된 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
위와 같이 사용하시면 어떨지 모르겠네요..
지금까지 초보였습니다.
데브피아의 이광수님이 쓰신 글입니다.
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/
작성자: 다자래(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 Set Fso = Server.CreateObject("Scripting.FileSystemObject") '파일객체 생성 Set Fso = nothing %> |
HOWTO: 세션 쿠키를 사용하지 않고 값을 보존하는 방법
출처: Microsoft고객기술지원
URL: http://support.microsoft.com/kb/175167/ko
요약
HTML 양식을 사용하는 웹 사이트를 개발하는 경우 나중에 사용하기 위해 사용자가 입력한 정보를 추적해야 할 수
도 있습니다. 이 작업을 "값 보존"이라고 합니다. Active Server Pages(ASP)는 이 작업을 편리하게 수행할 수 있는
세션 변수를 제공하지만 이 변수를 사용하려면 세션 ID가 필요합니다. 본 문서에서는 세션 쿠키를 사용하지 않고 양
식 값을 저장하는 방법을 설명합니다.
추가 정보
HTML로 개발할 때 값을 보존하기 위해 일반적으로 아래 세 가지 방법을 사용합니다.
값을 양식의 숨김 필드에 저장
값을 숨김 필드에 저장하면 값은 보이지 않지만 손상되지 않습니다. 사용자가 양식을 전송하면 양식 값이 읽혀진 다음
곧바로 HTML 양식의 숨김 필드에 다시 작성됩니다. 이 값은 그 양식이 전송될 때 다른 필드와 함께 전송됩니다.
아래의 세 페이지는 이 방법에 대한 예를 보여줍니다.
<%@ LANGUAGE="VBSCRIPT" %> <HTML> <Input Type=Submit Name=btnSubmit> <!-- This is FORM2.ASP --> <!-- This is FORM3.ASP --> |
값을 URL에 추가
이 방법은 첫 번째 방법과 비슷하지만 값을 숨김 변수에 전달하지 않고 대신 URL의 끝에 추가하여 전송합니다. 이 방법의
단점은 브라우저마다 다를 수 있는 URL의 크기 제한에 있습니다. 또한, 개인 정보나 기타 정보가 다른 사용자에게 노출되
기 쉽습니다. 아래의 페이지는 이 방법에 대한 예를 보여줍니다.
<!-- This is FORM1.HTM --> <Input Type=Submit Name=btnSubmit> <!-- This is FORM2.ASP --> <Form Action="Form3.asp?value1=<%= <Input Type=Submit Name=btnSubmit> <!-- This is FORM3.ASP --> |
자신만의 쿠키에 기록
이 방법은 정보를 다시 클라이언트 컴퓨터에 기록해야 하기 때문에 잘 사용되지 않습니다. 이 방법이 일반적인 세션 기반
변수를 사용하는 방법보다 나은 점은 브라우저를 통해 나중에 다시 방문할 수 있도록 정보를 보존한다는 것뿐입니다. 이
때문에 웹 서버에 정보를 유지할 필요성이 줄어듭니다.
<!-- This is FORM1.HTM --> <!-- This is FORM2.ASP --> <!-- This is FORM3.ASP --> |
본 문서의 정보는 다음의 제품에 적용됩니다.
● Microsoft Active Server Pages 1.0
● Microsoft Visual Studio 97 서비스 팩 3
● Microsoft Internet Information Server 4.0
● Microsoft Internet Information Services 5.0
[저장된 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" '보낸사람 메일주소 ............ |
이번에 소개해 드리는 방법은 파일객체를 생성하여 저장되어 있던 html파일을 읽어들여서 처리하는 방법입니다.
html파일의 내용이 변하여도 메일발송에는 아무런 제약이 없습니다. 파일객체가 읽어들일 html파일의 경로만 정확
하다면 바뀐내용 그대로 메일발송이 이루어집니다. 아래 예제는 파일객체를 생성하여 html파일을 읽어들인후 처리
하는 예제입니다.
예제 )
<%
Set Fso = Server.CreateObject("Scripting.FileSystemObject") '파일객체 생성 '읽어들인 html파일 열기 name = "고객님" '받는고객 이름 content=Replace(Replace(mail,chr(13)&chr(10),""),"[고객이름]",name) %> |
[ASP에서 Redim() 함수를 이용한 동적배열 사용]
작성자: 다자래(mfcchang@naver.com)
ASP에서 Redim()함수를 이용한 동적배열 처리의 짧은 예제입니다. Redim()함수는 배열의 크기를 조정할때 쓰며
기존의 배열에 저장된 값은 보존되지 않습니다. 기존 값을 보존하기 위해서는 Redim()함수와 Preserve라는 파라
미터가 함께 사용되어야 합니다. 아래 예제는 100개의 동적배열을 잡고 값을 할당합니다.
<HTML> For i = 0 to nCount '배열에 할당된 값을 확인합니다.
|
Html내의 Table을 엑셀로 저장하기
아래와 같은 html내의 Table을 엑셀로 저장하는
아주 간단한 팁입니다.
번호 |
멤버별명 |
카페주소 |
1 |
다자래 |
http://cafe.naver.com/webdeveloper.cafe |
2 |
오렌지 |
<%
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>