[ASP] MSXML 버젼 확인

[■Web Programing/OO ASP OO]

[펌] http://rahxephon.tistory.com/880


내 컴퓨터 안에 ,

system32 폴더 안에 msxml4.dll ,msxml4a.dll ,msxml4r.dll

파일이 있는지 확인 해보면 된다.


만약 없을 경우 :msxsml sdk를 다운받아 설치 해주면 된다.


내 컴퓨터에 설치된 msxsml 설치 버전 정보 확인 ↓(아래 파일을 html로 저장후 보면 자신의 컴퓨터에 설치된 msxml버전 을 알수있다.)

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

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE>파서 설치정보 알아보기</TITLE>
</HEAD>
<BODY>

<P>&nbsp;</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>

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



작성자 : 한진석

크리에이티브 커먼즈 라이센스
Creative Commons License

[ASP] mxsml2.xmlhttp 에 대해서 알아보자

[■Web Programing/OO ASP OO]

[출처] http://blog.naver.com/webjeck?redirect= ··· 00835474

요즘 xmlhttp를 궁금해하시는 분들이 많은듯해서...

xmlhttp는 원격파일을 부르는 방법입니다. 물론 로컬웹서버에 있는 파일도
가능하고, 같은 도메인 내에서라면 클라이언트영역에서도 사용가능합니다. 이렇게
개체를 참조합니다.

set xh=createobject("msxml2.xmlhttp")

get/post 둘다 사용가능합니다.

xh.open "get", "url", false
xh.open "post", "url", false

url은 비록 로컬서버라 해도 반드시 http로 시작합니다. 이렇게 연결을 연
다음에는 보냅니다.

xh.send something

마지막 something은 생략될수도 있습니다. 예를들어 get방식에서는 보낼게
없을겁니다. 그러므로 그냥,

xh.send

무언가를 보냈으면 받는게 있을수도 있습니다. 받는건 스트링, 바이너리, xml
등이 있습니다. 그러므로 호출자측 코드는 마지막으로 이렇게 끝납니다.

response.write xh.responseText 'or
response.binarywrite xh.responsebody 'or
response.write xh.responseXml.xml

한편 피호출자(url의 주소페이지)는 xmlhttp가 보내는걸 이렇게 받습니다.

response.write request.querystring(1)
response.write request.form(1)
response.binaryWrite request
xmldoc.load request

각각 get, post, binary, xml을 보냈을 경우입니다. 한편 두번째 post방식은
그동안 설명만으론 안됩니다. 사실은 보낼때, open과 send 사이에 다음 행을
집어넣습니다.

xh.setRequestHeader "Content-Type","application/x-www-form-urlencoded"

담에 보낼때,

xh.send "f1=1&f2=2"

이런식으로 쿼리스트링을 나누는것처럼 폼 변수를 나누어 보냅니다. 받는측에선
request.form(1), request.form(2), 이런식으로 나누어 받을겁니다.

한편 get방식은 오픈할때 그냥 url에 쿼리문자열을 넣어서 보냅니다.

xh.open "get", "http:// url/page.asp?a=1&b=2", false
그리고 send는 그냥,
xh.send

한글페이지를 불러올때는 바이너리로 열어야 글자가 안깨집니다.

xh.open "get", "http:// 한글페이지주소/page.asp", false
xh.send
response.binaryWrite xh.responseBody

이외에 xmlhttp는 바이너리나 xml dom 개체를 보내는데도 편리하게 사용할수
있습니다.

xmlhttp는 윈도우의 wininet.dll이라는 개체를 사용합니다. 단점은 멀티스레드가
안된다는겁니다. 그러므로 요즘은 serverXmlHttp가 권장됩니다. 사용법은
같습니다. 그냥 시작할때,

set xh=createobject("msxml2.serverXmlhttp")

server만 앞에 붙이면 됩니다. 한편 최신xml버전을 깔아두고, 버전까지 명시해서
사용하는것이 좋습니다.

set xh=createobject("msxml2.xmlhttp.4.0")
set xh=createobject("msxml2.serverXmlhttp.4.0")

이상 초간단 xmlhttp 설명이었습니다. 혹시 안되시는 부분, 추가응용이
있으시다면, 질문을 올려주십시오.


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

Han님 좋은 강좌 감사합니다.

예전에 Han님께서 제공해주신 xmlhttp에 대한 소개를 접하고
잘 사용하고 있습니다.

그동안 xmlhttp 개체를 자바스크립트에서

var oXMLHTTP = new ActiveXObject( "Microsoft.XMLHTTP" );

이렇게 생성해서 사용했는데
오늘 게시하신 글을 읽고 아래 처럼 바꿔봤으나 되는 게 있고
또 되지 않는게 있었습니다.

msxml2.xmlhttp         <-- 잘됨
msxml2.xmlhttp.4.0    <-- 잘됨

msxml2.serverxmlhttp         <-- 에러
msxml2.serverxmlhttp.4.0    <-- 에러

발생하는 스크립트 오류는 다음과 같습니다:

    오류: 자동화 서버는 개체를 작성할 수 없습니다.

xml은 4점대 버전이 설치되어 있습니다.

serverxmlhttp를 사용하기 위해 또 다른 설치가 필요한 건가요?



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


혹시 클라이언트 영역에서 사용하신게 아닌지요? 클라이언트영역에선 안됩니다.
그리고 버전명도 클라이언트영역에선 옛날걸로 하시는게
안전합니다(msxml2.xmlhttp). xml4.0을 가진 클라이언트는 1백명에 한명도
안될겁니다
==================================================================

Han님이 알려주신 msxml2.xmlhttp를 사용하다가 질문입니다...

4월9일 ADSI질문에 답변글을 만들면서 ASP에서 사용해 보았는데...
msxml2.serverxmlhttp 에서는 에러가 발생합니다.

msxml2.xmlhttp <-- 잘됨
msxml2.serverxmlhttp <-- 에러

msxml3.dll error '80072eef'
로그인 요청이 거부되었습니다.
/vir.asp, line 59

저는 xml3.0 이깔려있는 것은데... 최신버전 다운로드 경로도 알수있을까요?


'------------ 소스 ----------------
<%
Function execADSI(v_idx, v_name, v_path)
Dim xh, xPath, strPost, intVal

xPath = "http://220.xx.xx.xx/ADSI/VirCreate.asp"

v_idx = Server.URLEncode(v_idx)
v_name = Server.URLEncode(v_name)
v_path = Server.URLEncode(v_path)

strPost = "iis_idx=" & iis_idx & "&vir_name=" _
& vir_name & "&vir_path=" & vir_path

xPath = xPath & "?" & strPost
Response.Write xPath & "<hr>" '경로확인

Set xh = Createobject("msxml2.serverxmlhttp")
  xh.open "GET", xPath, false, PROC_ID, PROC_PW
  xh.send()            <---- 이부분에서 에러발생
  intVal = xh.ResponseText
Set xh = Nothing

execADSI = Cint(intVal)
End Function
%>

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

좋은 정보 감사합니다... 하하 ^^; 해결되었습니다...

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 는 정말 좋네요. ^_^ 확실한 에러처리로 다운도 전혀
안되고...


MSDN에도 이와 비슷한 문제에 관련된 글이 있군요...
ServerXMLHTTP 를 쓰라는 말 같은데.. 영어가 딸려서....
http://msdn.microsoft.com/library/defau ··· dr%2Fhtm
l/askgui05012001.asp


언제나 도움주시는 Han님께 다시한번 감사드립니다.

크리에이티브 커먼즈 라이센스
Creative Commons License

[ASP] ASP에서 웹서비스(WebService) 호출

[■Web Programing/OO ASP OO]

[참조] http://www.acidrazor.com/blog/calling-a ··· c-asp%2F

ASP 에서 웹서비스를 호출 하는 경우에 Soap 을 이용하여 처리 한다.


'*********************************************************************************
' 웹서비스 호출
'*********************************************************************************

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

크리에이티브 커먼즈 라이센스
Creative Commons License

[ASP] RS.GetRows 처리

[■Web Programing/OO ASP OO]

    str_sql = " select * from aaaa "
    If Not rs.eof Then
        ArrCoaRows = rs.getrows
    End If
    rs.close
    Set rs = Nothing

    CoaCols = UBound(ArrCoaRows,1) '컬럼
    CoaRows = UBound(ArrCoaRows,2) '로우

    For rowCnt = 0 To CoaRows
       For colCnt = 0 To CoaCols
            response.wirte ArrCoaRows(colCnt, rowCnt) '0,0 1,0 거의 구구단과 흡사
       Next
    Next


크리에이티브 커먼즈 라이센스
Creative Commons License
TAG. asp, rs.getrows

[ASP] [ASP] VbCrLf, VbCr, VbLf, VbNewLine ... 기타 상수..

[■Web Programing/OO ASP OO]

Miscellaneous 상수
  

아래 상수는 Visual Basic for Applications 형식 라이브러리에 정의되어 있으며 코드의 어느 곳에서나 실제값 대신 사용될 수 있습니다.

상수 등가 설명
VbCrLf Chr(13) + Chr(10) 캐리지 리턴 – 라인 피드 조합
VbCr Chr(13) 캐리지 리턴 문자
VbLf Chr(10) 라인 피드 문자


VbNewLine Chr(13) + Chr(10)  플랫폼 특정 줄 바꿈 문자, 즉 현재 플랫폼에 대해 어떤 것이라도 적절합니다.


VbNullChar Chr(0) 값 0을 가지는 문자입니다.


VbNullString 값 0을 가지는 문자열 길이가 0인 문자열("")과 같지 않습니다. 외부 프로시저를 호출하는 데 사용됩니다.


VbObjectError -2147221504 사용자 정의 오류 번호는 이 값보다 커야 합니다. 예를 들면 다음과 같습니다.


Err.Raise Number = vbObjectError + 1000

Call Err.Raise(65535, , "Unknown MessageBox command specified")



VbTab Chr(9) Tab 문자


VbBack Chr(8) 백스페이스 문자


VbFormFeed Chr(12) Microsoft Windows에서는 유용하지 않습니다.


VbVerticalTab Chr(11) Microsoft Windows에서는 유용하지 않습니다 

크리에이티브 커먼즈 라이센스
Creative Commons License
TAG. asp, 상수

[ASP] Command객체를 사용해야 하는 이유

[■Web Programing/OO ASP OO]
 

다음의 예를 실예로 보면서 설명하겠다

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가 아닌 날쿼리로 작성되는 쿼리라면 그리고 특히 페이지 접속이 많은 경우라면
   사용하면 성능의 향상을 꾀할수 있다..

   Cmd.Execute 속성...
   --  Execute [RecordAffected],[Parameters],[Options]

이곳은 다들 알고 있는것이라 생각하므로 Options인자중
잘 쓰지 않는 Opitons중..adExecuteNoRecords를 말하지 않을수 없다.

물론 알고계실것이라 생각들지만..
insert,update,Delete를 할때는 굳이 RecordSet을 생성하지 않아도 된다
이때는 명시적으로 Options 인자중 위의 adExecuteNoRecords를 쓰지 않는경우
보이지 않는 레코드셋이 생성된다.
해서..반드시 adExecuteNoRecords를 쓴다면..레코드셋 객체 자체를 생성치 않으므로..
서버 성능을 꾀할수 있다.

크리에이티브 커먼즈 라이센스
Creative Commons License
TAG. asp, command