<P> </P> <script language="VBscript"> dim msg
msg = " 지금 내 컴퓨터에는" msg = msg & (Chr(13)&Chr(10))
xml = "<?xml version='1.0'?><root>Sniffer</root>" On Error Resume Next
set dom = CreateObject("microsoft.XMLDOM") dom.async = false If Err = 0 Then if(dom.loadXML(xml)) then msg = msg + " - msxml" msg = msg & (Chr(13)&Chr(10)) end if set dom = nothing end if
On Error Resume Next set dom = CreateObject("Msxml2.DomDocument") dom.async = false If Err = 0 Then If(dom.loadXML(xml)) then msg = msg + " - Msxml2.DomDocument " msg = msg & (Chr(13)&Chr(10)) end if set dom = nothing end if
On Error Resume Next set dom = CreateObject("Msxml2.DomDocument.2.6") dom.async = false If Err = 0 Then if(dom.loadXML(xml)) then msg = msg + " - Msxml2.DomDocument2.6 " msg = msg & (Chr(13)&Chr(10)) end if set dom = nothing end if
On Error Resume Next set dom = CreateObject("Msxml2.DomDocument.3.0") dom.async = false If Err = 0 Then if(dom.loadXML(xml)) then msg = msg + " - Msxml2.DomDocument3.0 " msg = msg & (Chr(13)&Chr(10)) end if set dom = nothing end if
On Error Resume Next set dom = CreateObject("Msxml2.DomDocument.4.0") dom.async = false If Err = 0 Then if(dom.loadXML(xml)) then msg = msg + " - Msxml2.DomDocument4.0 " msg = msg & (Chr(13)&Chr(10)) end if set dom = nothing end if
msgbox msg & " 이 설치되어 있습니다.",,"내 컴퓨터에 설치된 파서목록" </script> </BODY> </HTML>
ServerXMLHTTP 는 XMLHTTP 보다 엄격한것 같습니다.. Admin 이라고 하면 안되더군요... 검퓨터이름\Admin 이런식으로 정확한 사용자명만 되는군요...
MSDN에도 이런설명이 전혀 없고 도움말 예제가 아래와 같이 되어 있다는게 정말 황당하네요... >.<
<%@language=Jscript%> <% var objSrvHTTP; objSrvHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP.4.0"); objSrvHTTP.open ("GET","http://someotherserver/secure.asp",false, _ "testuser", "testpassword"; objSrvHTTP.send (); Response.ContentType = "text/xml"; Response.Write (objSrvHTTP.responseXML.xml); %> ----- 잘못된점... 1. ")"가 빠졌다. 2. Jscrpt에서는 _ 로 줄바꿈을 할수 없다. 3. "testuser" 이런식으로는 절대 로그인할수 없다.
저는 "testuser" (아이디) 때문에 4시간 넘게 방황했습니다... 다른분들도 저처럼 고생하는 일 없었으면 좋겠네요....
* 정확한 로그인 사용법 MSXML2.XMLHTTP --> Admin 또는 myCom\Admin MSXML2.ServerXMLHTTP --> myCom\Admin
--- XMLHTTP의 추가적인 사용기....
>단점은 멀티스레드가 안된다는겁니다. 그러므로 요즘은 serverXmlHttp가 권장됩니다. >사용법은같습니다.
han님이 말씀하신 것이 정말 맞는것 같습니다....
낮은 버전의 xmlhttp 는 개발서버에 올려놓고 테스트 하는데... 잘못된 인터넷 주소를 가지고 이렇게 저렇게 하다보니 금방 다운이 되버리네요... 한번 다운된후에 다른 웹브라우져를 올려놓고 http://www.yahoo.co.kr을 쳐도 서버가 먹통犬六?... scriptTimeOut까지 완전히 해당페이지가 뻗어 버리는군요... xmlhttp4.0의 경우는 그나마 에러처리가 잘되는것 같구요...
ServerXMLHTTP.4.0 는 정말 좋네요. ^_^ 확실한 에러처리로 다운도 전혀 안되고...
Function sendToWebService(WebService,Data) Dim SoapRequest Set SoapRequest = Server.CreateObject("Msxml2.XMLHTTP") SoapRequest.Open "POST",WebService , False SoapRequest.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" SoapRequest.Send Data sendToWebService = SoapRequest.responseText Set SoapRequest = Nothing End Function
Function sendToWebService(WebService,Data) Dim SoapRequest Set SoapRequest = Server.CreateObject("MSXML2.ServerXMLHTTP") SoapRequest.Open "POST",WebService , False SoapRequest.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" SoapRequest.Send Data
status = SoapRequest.status
On Resume Next '오류가 있거나 (오류가 없을경우 err.number가 0 값을 돌림) status 값이 200 (로딩 성공) 이 아닐경우 If err.number <> 0 or status <> 200 then if status = 404 then sendToWebService = "존재하지 않는 페이지 입니다.(404)" elseif status >= 401 and status < 402 then sendToWebService = "접근이 금지된 페이지 입니다.(401)" elseif status >= 500 and status <= 600 then sendToWebService = "내부 서버 오류 입니다.(500)" else sendToWebService = "서버가 다운되었거나 올바른 경로가 아닙니다." end if '오류가 없음 (문서를 성공적으로 로딩함) else sendToWebService = SoapRequest.responseText end if
'sendToWebService = SoapRequest.responseText Set SoapRequest = Nothing End Function
Data = "firstparameter=yourdata&secondparameter=yourdata" 'and the WebService would look like: WebService = "http://" & trim(Request.ServerVariables("SERVER_NAME")) & "service/service.asmx/webmethodfunction"
If InStr(sendToWebService(WebService, Data), "true") = 0 Then response.write "<script>alert('오류가 발생하였습니다.');</script>" Else response.write "성공" End If 'response.end
strQuery = "SELECT * FROM Orders WHERE OrderDate >= '" & startDate & "' AND OrderDate < '" & endDate & "'"
rs.Open strQuery, adoConn
일단 따옴표(')를 빼먹기 쉽다는 문제는 제쳐 두더라도, 이 쿼리는 SQL 서버 내에서 수행될 때 startDate와 endDate의 값이 변경될 때마다 매번 컴파일 과정을 거쳐야 한다.
불필요한 SQL 컴파일은 DB의 부하를 가중시키켜 성능 저하로 이어지게 된다.
이 문제를 피하려면 파라미터화된 쿼리(Parameterized Query)를 사용하는 것이 좋습니다. 보다시피 따옴표가 사라지고 ? 또는 @로 시작하는 파라미터가 추가되었습니다.
strQuery = "SELECT * FROM Orders WHERE OrderDate >= ? AND OrderDate < ?"
또는
strQuery = "SELECT * FROM Orders WHERE OrderDate >= @startDate AND OrderDate < @endDate"
매개변수를 가진 쿼리를 사용하는 경우에는 매개변수를 넣어주기 위해 반드시 Command 객체를 사용해야 한다.
(아래 예제 참조 )
… Set adoCmd = CreateObject("ADODB.Command") Set adoCmd.ActiveConnection = adoConn adoCmd.CommandText = strQuery adoCmd.CommandType = adCmdText '또는 1 adoCmd.Parameters.Append adoCmd.CreateParameter("@startDate", adDate, adParamInput, , startDate) adoCmd.Parameters.Append adoCmd.CreateParameter("@endDate", adDate, adParamInput, , endDate) … rs.Open adoCmd 'Query 대신 Command 객체를 지정
이렇게 매개변수를 가진 쿼리를 실행하면, SQL Profiler에서 SQL배치가 아닌 RPC가 수행되어 더욱 속도가 빨라진다. 또한 다음과 같이 매개변수화 되므로 startDate, endDate의 값이 변경되더라도 SQL 컴파일은 한번만 일어나게 된다.
exec sp_executesql N'SELECT * FROM Orders WHERE OrderDate >= @P1 AND OrderDate < @P2 ', N'@P1 datetime,@P2 datetime', '01 1 1995 12:00AM', '01 1 1996 12:00AM'
매개변수를 가진 쿼리는 코드 가독성을 높여주고, 성능 면에서는 좋긴 하지만 코딩량이 다소 늘어난다는 단점 이 있어서 귀차니즘(?) 때문에 안 쓰는 사람들이 많지만..최소한 자주 수행되는 쿼리의 경우 이렇게 작성하면 DB의 부하를 줄이고 성능을 향상시킬 수 있다.
========================= Command 객체의 속성 지정으로 최적화 ===================== 우리는 날쿼리를 자주 사용하게 되거나 프로세스 로직이 들어가있는 경우 sp를 사용하게 됩니다. 헌데..날쿼리를 사용하고 Command객체를 사용할경우..
Cmd.Prepared=True 속성이 있다.. -- 이속성은 명령을 실행하기 전에 미리 컴파일해 둘 것인지를 지정하는 속성이다. 위와 같이 속서을 지정하게 되면..Command 개체는 명령을 실행하기 전에 명령을 컴파일 해서 저장하게된다. 해서 .. 처음 실행시에는 시간이 조금은 걸리지만 이후 같은 명령을 재실할 경우에는컴파일된 버전을 사용하게 되므로 속도의 향상 효과를 낼수있다. 특히.. sp가 아닌 날쿼리로 작성되는 쿼리라면 그리고 특히 페이지 접속이 많은 경우라면 사용하면 성능의 향상을 꾀할수 있다..
이곳은 다들 알고 있는것이라 생각하므로 Options인자중 잘 쓰지 않는 Opitons중..adExecuteNoRecords를 말하지 않을수 없다.
물론 알고계실것이라 생각들지만.. insert,update,Delete를 할때는 굳이 RecordSet을 생성하지 않아도 된다 이때는 명시적으로 Options 인자중 위의 adExecuteNoRecords를 쓰지 않는경우 보이지 않는 레코드셋이 생성된다. 해서..반드시 adExecuteNoRecords를 쓴다면..레코드셋 객체 자체를 생성치 않으므로.. 서버 성능을 꾀할수 있다.
::: 사람과 사람의 교감! 人터넷의 첫 시작! 댓글을 달아주세요! :::