Classic ASP with Oracle Database

2 minute read

Classic ASP는 아직도 많이 사용된다. (cba) 일반 웹사이트에서는 많이 없어졌지만 Legacy System.에는 아직도… 새로 만드는 곳도 간혹 그냥 ASP로 하기도 한다.

용도는 주로 관리자 사이트, 소규모 쇼핑몰.

 

소규모 SI업체에서 일을 하다보면 이 꼴도보기 싫은 Legacy System을 설치/수정해야 할 일이 생긴다. (새로 만들고 - 메뉴얼 문서작성한 다음에 유지보수팀에 인수인계 하기 싫으면 그냥 해야지)

시스템 엔지니어도 Windows서버 잘 하는 사람도 잘 없고.. ClassicASP와 얽혀있는 문제는 잘 해결이 되지 않는다. IIS설정과 DB연결에서부터 심각한 문제가 발생한다.

잘 알지도 못하면서 보다보니 순수 투입시간만 10시간은 여기저기 찾아보고 삽질 반복한 것 같다.

 

WebServer(IIS)

IIS설정은 그래도 검색하면서 하면 금방 처리 된다. http://tutorial.beansugar.org/w/WindowsServer:IIS

Database(ODBC)

보통 IIS설치하고 ASP첫화면 뜨는거 보고 끝난줄 알지만… 사실 여기서 고생 시작이다.

ConnectionString은 다음과 같다.

Const DB_MSORA_CONSTR =”Provider=msdaora.1;Data Source={db name in tnanameora};User ID={userid};Password={password};Persist Security Info=True;” Const DB_ORA_CONSTR =”provider=OraOLEDB.Oracle.1.1;Data Source={db name in tnanameora};User ID={userid};Password={password};Persist Security Info=True;”

ASP는 윈도우 기반 언어답게 윈도우 커넥션을 사용하는데… ODBC, OleDB, ADODB, ADONET.. .뭐 등등 있는 것 같은데… 사실 뭐가뭔지 잘 모르겠다.

ADO.NET 닷넷용이고 ODBC는 JDBC처럼 윈도우 구형 커넥션 프로토콜… ADODB는 ODBC Wrapper정도 아닐까? 생각해본다. (따로 찾아봐야겠다)

Oracle Provider에는 두가지가 있다. Provider=msdaora.1 (32bit) Provider=OraOLEDB.ORacle.1.1 (32bit, 64bit) 이름에서 알 수 있듯이 MS에서 제공하는 것과 Oracle에서 제공하는 것. 내가 설치한 프로젝트에서는 이 두가지를 함께 쓰고 있었다.

왜 두가지를 함께 쓰는지 이해할 수가 없었는데… 같은 프로시저를 실행시켜도 커넥션 스트링에 따라 돌아가기도 안돌아가기도 하더라.. OraOLEDB.Oracle.1.1을 이용해서 접속한경우에 아래의 쿼리를 돌리면 파라미터 개수가 안 맞는다고 오류가 난다.

set fmcon = GetConnectionObject(“DB_MSORA_CONSTR”) Set objCmd = Server.CreateObject(“ADODB.Command”) with objCmd .ActiveConnection = fmcon .CommandText = “PL_USER_LIST” .CommandType = adCmdStoredProc

.Parameters.Append .CreateParameter("@PAGE", adInteger , adParamInput, 5,cpage)
.Parameters.Append .CreateParameter("@PAGE\_SIZE", adInteger , adParamInput, 5 ,page\_Size)

.Parameters.Append .CreateParameter("@OUT\_RESULT", adInteger, adParamOutPut,0)

Set rs = .Execute

outResult = .Parameters("@OUT\_RESULT") End with

out OUT_RESULT 이외에 out SYSREFCURSOR이 있는데 이것을 못 받아오고 이런 오류를 낸다. PLS-00306: wrong number or types of arguments in call to ‘{procedure name}’

다른방법으로 호출을 해야되나보다.. LegacyCode를 그대로 쓰려면 커넥션 스트링을 두개 생성할 수 밖에… msdaora를 쓰려면 32bit Client를 써야한다.

Client 설치

Oracle.com에서 Server 버전에 맞는 클라이언트를 다운받는다. 내 경우에는 서버가 11gr2 11.2.0.4.0버전이었다. (클라이언트 버전은 크게 상관없을지도 모르겠다. 어느정도 호환이 되니까) 32bit - win32_11gR2_client.zip - http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win32soft-098987.html 64bit - win64_11gR2_client.zip - http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-linx8664soft-100572.html

설치할 때 instantclient로 설치하면 개발에 필요한 요소가 다 설치되지 않는다.(network/admin) 관리자 또는 런타임으로 설치하자. 그런데 마지막으로 성공했을 때 관리자로 했기 때문에 런타임으로 해도 잘 될지 모르겠다.

대강 경로는 비슷하다 C:\app\useruser\product\11.2.0\client_1\network\admin\tnsnames.ora

{db service name 다른말로 tns source name} = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {host address or ip??})(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = {SID_NAME}) ) )

여기서 설치 완료

32비트 클라이언트를 사용하려면 IIS(인터넷 정보 서비스) 관리자에서 - 응용 프로그램 풀 - 고급설정 - 32비트 응용 프로그램 사용 = True로 변경해줘야한다. 기본값이 False로 되어 있다. 변경 후 IIS를 재시작 해보고.. 안되면 재부팅 해야한다.

 

ODBC 데이터 원본(32비트,64비트)

윈도우에서 이걸 설정 해 줘야 하는 줄 알았는데.. 안해도 된다.

 

 

ERRORS

ADODB.Connection 오류 ‘800a0e7a’ 공급자를 찾을 수 없습니다. 올바르게 설치되지 않았을 수 있습니다.

 

*** 실패하면 완전 삭제 후 위 삽질을 반복하도록 한다

삭제는 D:\app\useruser\product\11.2.0\client_1\deinstall\deinstall.bat를 실행

제대로 안될때도 있는데 그 때는

1 서비스 종료 Oracle 관련 서비스 다 종료

2 레지스트리 삭제 시작 - regedit - Oracle 찾아서 삭제 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Oracle in OraClient11g_home2 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Oracle11 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Oracle11

3 설치파일 삭제 C:\Program Files (x86)\Oracle C:\Program Files\Oracle C:\ProgramData\Oracle

4 D:\app\useruser\product\11.2.0\client_1\ 이 경로 통째로 삭제