-- Admin권한으로 원하는 테이블의 컬럼 정보를 확인한다.
SELECT a.OWNER, a.TABLE_NAME, a.COLUMN_NAME, b.COMMENTS,
a.data_type || '(' || a.data_length || ')' AS COLUMN_TYPE
FROM dba_tab_columns a, dba_col_comments b
WHERE a.owner = 'OPS$USR001'
AND a.table_name = 'tbUser'
AND b.owner = 'OPS$USR001'
AND b.table_name = 'tbUser'
AND a.owner = b.owner
AND a.table_name = b.table_name
AND a.column_name = b.column_name
;

--owner는 조회하고자 하는 테이블 정보의 소유자 정보를 넣으면 되고 table_name에서는 조회하고자 하는 테이블 명을 입력한다.


--user 권한으로 원하는 테이블의 컬럼 정보를 조회한다.
SELECT TABLE_NAME
, COLUMN_NAME
, Replace(COMMENTS,' ','')
FROM USER_COL_COMMENTS
WHERE TABLE_NAME = ''tbUser';

--로그인된 사용자가 소유한 테이블의 컬럼에 대한 정보를 조회한다.
ㅇ. 서비스 응용프로그램의 특징
-> 일반적인 응용프로그램과는 다르다.
-> 컴파일된 실행파일은 반드시 서버에 설치
-> 디버그 하거나 서비스 프로그램을 직접 실행시클수 없음
-> 서비스 응용프로그램을 위한 설치 프로그램을 만들어야함

ㅇ. 윈도우 서비스 프로그램의 작성
-> 윈두우 서비스 프로젝트 선택
-> 서비스 이름지정 (ServiceName 속성)
-> 속성에 대한 서비스 여부 결졍
: CanStop
: CanShupDown
: CanPauseAndContinue
: AutoLog

ㅇ. ServiceController
-> 기존에 설치되어 있는 서비스와 연결
-> 서비스 시작, 중지, 정지 등을 제어
-> ServiceController 컴포넌트 작성
: 도구상자에서 추가
: 코드안에서 ServiceController 클래스의 인스턴스를 만들어서 사용
: ServiceName (동작하는 서비스)
: MachineName ("."은 현재 머신.. 리모트 머신은 머신명 기입)

ㅇ. 서비스 프로그램의 시작
-> 서비스 클래스의 OnStart 메서드를 호출
-> InstallUtil.exe를 사용하여 서비스를 설치한 후 시작
-> 개발환경에서 시작할 경우 오류 메세지 표시

ㅇ. 서비스 정보 로깅
-> 응용프로그램 이벤트 로그에 정보를 기록
-> AutoLog 속성을 지정 (기본 : True)
-> EventLog 개체를 사용하여 정보와 오류를 기록
: EventLog.WriteEntry("String")
-> 이벤트 소스로 등록하지 않아도 됨
: EventLog.CreateEventSource()없이도 로그 사용

ㅇ. 서비스 프로그램 디버깅
-> 서비스 응용프로그램은 직접 디버깅이 안됨
-> 디버깅 방법
: 서빗르를 시작한다.
: 서비스가 동작하는 프로세스에 디버거를 붙인다.
: 다른 응용프로그램 처럼 디버깅 한다.

ㅇ. 설치 컴포넌트
-> 서비스의 디자인 모드를 선택하여 설치 컴포넌트를 추가(마우스 왼쪽클릭 팝업 메뉴)
-> Add Installer를 선택
: ProjectInstaller라는 클래스 추가
: ServiceProcessInstaller, ServiceInstallerX가 추가
-> 필요한 속성을 수정, 필요한 메서드 오버라이드
ㅇ. VB6.0과의 차이점
-> OLEDrag(Drop)Mode 속성 사용 (수동 or 자동)

ㅇ. Drag & Drop을 처리하기 위한 이벤트
-> .NET 프레임워크에서 제공하는 끌어놓기 메커니즘을 이용
-> .NET 프레임워크의 DragEventArgs 클래스를 이벤트 핸들러의 파라미터로 사용
-> DragDrop(개체위에 마우스를 Drop한 상태)
, DragEnter(개체위에 Drag로 진입상태)
, DragLeave(개체위에 Drag로 벗어나는 상태)
, DragOver(오브젝트를 마우스를 누른상태에서 올려져 있는 상태)
-> Beta1에서는 완전하지 않음

-> 선택한 개체를 마우스로 끌어서 다른 개체 위에 올려 놓는 것
예) Form, TextBox, PictureBox 위에 파일을 끌어다 올려 놓는다.
: AllowDrop 속성을 설정
: Drag & Drop 처리를 위한 이벤트 핸들러를 구성

Public Sub PictureBox1_DragDrop(ByVal sender AS Object, _
ByVal e As System.Winforms.DragEventArgs)
Handles PictureBox1.DragDrop

'코드 작성
End Sub


ㅇ. System.WinForms.DragEventArgs
-> DragDrop...... 등등의 이벤트에 대한 데이터를 제공 (e)
-> 주요 속성
: AllowEffect
: Data (실제 넘어온 데이터 포멧-어떤데이터인지...)
: Effect (Target 객체가 속성을 지원하는지...)
: KeyState (Shift 혹은 Ctrl, Alt 키등이 눌렸는지)
: X, Y (화면상의 좌표)


ㅇ. Drag & Drop을 구현하려면
-> Drag & Drop의 Source와 Target을 결정한다.
-> DragDrop 이벤트 핸들러를 구성한다.
-> DragEventArgs에서 제공하는 데이터를 활용한다.
ㅇ. PrintDialoag
-> 인쇄대화상자 표시 컨트롤
-> .NET FrameWork의 PrintDialog 클래스에서 파생
-> 인쇄할 프린터를 선택하거나 문서에서 인쇄할 범위 선택

-> 속성
: AllowPrintToFile(파일로인쇄 True or False)
: AllowSelectioon(선택한 부분 인쇄 True or False)
: AllowSomePages(인쇄할 페이지 범위 True or False)

: Document (인쇄할 문서 셋팅 - PrintDocument객체 셋팅)

: PrinterSettings (프린터 셋팅)

: PrintToFile (파일로 인쇄 체크 되었는지 확인)
: ShowHelp, ShowNetwork

-> 메서드
: Reset (인쇄대화상자 표시할 때 모든 항목들이 기본값으로 셋팅됨)


ㅇ. PrintPreviewDialog
-> 미리보기 대화상자 표시 (미리보기 화면을 구현하지 않아도 자동으로 미리보기 화면이 표시)
-> .NET FrameWork에서 PrintPreviewDialog에서 파생
-> 속성
: AutoScaleBaseSize (기본 Zoom에 대한 설정)
: Document
: PrintPreviewControl

-> 메서드
: CreateHandle (별도의 대화상자 핸들 제공, 별도의 폼을 만들어서 대화상자 구성가능)
: Dispose (Resource 해지)


ㅇ. PrintPrevbiewControl
-> 인쇄미리보기 컨트롤
-> 간단하게 미리보기 화면 구성
-> .NET FrameWork의 PrintPreviewControl 클래스에서 파생

-> 속성
: AutoZoom, Zoom
: Columns, Rows
: Document
: StartPage

-> 메서드
: InvalidatePreview (미리보기 화면을 다시 부를때)
: ShouldPersistBackColor (설정된 컬러를 유지)
: ShouldPersistForeColor (설정된 컬러를 유지)



ㅇ. PageSetupDialig
-> 페이지 설정 대화상자
-> .NET FrameWork의 PageSetupDialog 클래스에서 파생
-> 페이지 여백, 용지 방향등을 설정
-> 속성
: AllowMargins, AllowOrientation, AllowPaper, AllowPrinter
: Document
: MinMargins
: PageSettings, PrinterSettings

-> 메서드
: Reset
: ShouldPersistMinMargins




ㅇ. PrintDocument
-> 문서를 인쇄할 때 사용
-> .NET FrameWork에 PrintDocument 클래스에서 파생

-> 속성
: DocumentName
: DefaultPageSettings
: PrinterSettings

-> 메서드
: Print
ㅇ. 메뉴구성하기
-> MainMenu 컨트롤
: 도구상자에서 MainMenu 컨트롤을 폼에추가하면서 사용 가능
: 디자인 모드에서 메뉴 설계가 더욱 편해짐
: 메뉴 디자이너를 이용하거나 혹은 동적으로 메뉴 구성

: 주요속성
- Checked : 메뉴 항목의 체크 상태
- DefaultItem : 기본항목으로 지정
- MDIList : 차일드 윈도우의 목록을 표시
(별도 코딩필요없이 자동으로 자식윈도우 리스트가 추가됨)
- MergeType : 메뉴가 합쳐지는 유형
(Add, Replace, MergeItems, Remove)
: MDIChild 윈도우에 메뉴가 있을때 메뉴를 합침
- OwnerDraw : 사용자가 직접 메뉴 항목을 그릴 것인지 지정
- ShortCut : 단축키를 지정
- ShowShortCut : 단축키를 표시할 것인지 지정.


ㅇ. 도구바 만들기
-> ToolBar 컨트롤
: ToolBar 컨트롤을 폼에 추가
: ImageList 컨트롤을 폼에 추가
: ImageList에 Bitmap 추가
: ToolBar 컨트롤에 버튼 추가
: 각 버튼의 속성 지정
: ToolBar_ButtonClick()이벤트에 대한 코딩
: 기존 VB6.0과 동일

Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
Dim objBut As New ToolBarButton
objBut = e.Button
MessageBox.Show(objBut.ImageIndex)
End Sub

별도의 인덱스가 없기 때문에 ImageIndex를 이용함



ㅇ. 상태바 만들기
-> StatusBar 컨트롤
: 패널을 추가하고 속성을 편집

Protected Sub StatusBar1_Panel(ByVal sender As Object, _
ByVal e As System.WinForms.StatusBarPanelEventArgs)

Dim objPanel As StatusBarPanel

objPanel = e.statusBarPanel
MessageBox.Show(objPanel.Text)

End Sub

: 기본적인 구현방법은 ToolBar와 동일함
ㅇ. 윈도우 폼을 상속하여 새로운 폼을 상속함

ㅇ. 프로그램을 통한 상속
-> 상속하고자 하는 폼을 가지고 있는 네임스페이스를 참조
-> 클래스 정의에 상속하려고 하는 폼의 네임스페이스를 추가

Imports Namespace1
Public Class Form2 Inherits Namespace1.Form1

ㅇ. Inheritance Picker 이용 (가장 일반적이고 쉬운 방법)



-> 프로젝트에 Form 추가시에 "상속된폼" 으로 추가를 하면 상속가능한 폼 리스트가 표시되고 상속할 폼을 선택하여 추가하게된다.
-> 추가된 폼에는 상속된 폼에 있는 모든 컨트롤들이 ReadOnly로 표시된다.
-> 해당 컨트롤들을 수정하려면 상속시킬 폼의 컨트롤 속성중 Modifiers를 Public으로 해주고 해당 컨트롤 Event는 Protected로 해준다.

ㅇ. Base Form 컨트롤 보안 레벨
-> 버튼 이벤트에 대한 오버라이딩

상속될 폼
Protected Overridables Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Messagebox.Show("This is a base form.")
End Sub

상속된 폼
Protected Overrides Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Messagebox.Show(Textbox1.Text)
End Sub


ㅇ. 윈도우 폼에 대한 상속 방법
-> 동일 프로젝트에 있는 폼
: Picker 사용하면 편함
-> 다른 모듈에 있는 폼
: Picker 혹은 Inherite 구문 사용
-> 베이스 폼의 컨트롤 보안 레벨
: 상속 가능 혹은 Midifiers 속성을 이용한 수정
컴터 사양이 딸려서 VS로 작업하기 힘들때 유용하게 사용할수 있을것이다.

아니면.. 걍... 취향따라 쓰던지.. 쩝..


ㅇ. 컴파일러 화일명 : vbc.exe
(닷넷 프레임웍 폴더 확인)

ex)

vbc File.vb (단순 컴파일)
vbc /target:library file.vb (library(dll)로 컴파일)
vbc /out:My.exe file.vb (output file 지정)
vbc /defime:DEBUG=1 /optimize /out:File2.exe *vb (현재 디렉토리에 있는 모든 vb파일을 File2.exe로 최적화 시켜서 컴파일, DEBUG 조건 컴파일)
vbc /target:library /out:Something.dll *.vb (library(dll)로 컴파일 output 파일 지정)



ㅇ. 옵션 :

최적화(Optimization) : /optimize

/optimize[+] 최적화 수행 (안써주면 default)
/optimize- 최적화 수행하지 않음

-. 실행 파일을 작고, 빠르게 만들지만 디버깅이 어렵게 된다.
-. 그러므로 디버깅모드시에는 수행하면 안됨

출력 파일 지정 : /out:filename, /target

-. 이름을 지정하지 않은경우
: .exe는 sub main이 들어 있는 소스코드 파일 이름을 사용
: .dll은 첫번째 소스 코드 파일 이름을 사용

-. /targer 출력파일의 형태를 지정

/targer:exe 실행가능한 콘솔 응용프로그램을 생성
/target:library dll을 만든다.
/target:module 어셈블리에 추가할수 있는 모듈을 생성
: 모든 닷넷 언어에서 가져다가 사용가능
/target:winexe 실행 가능한 윈도우 프로그램을 생성


.NET 어셈블리 : /addmodule, /delaysign, /imports, /keyfile 등

/addmodule:module[,module2] 현재 컴파일 하고 있는 프로젝트에서 사용할수 있도록 지정한 모듈로부터 타입정보를 얻어옴.
/delaysign[+또는-] 어셈블리안에 사인을 함.. /keyfile 혹은 /keycontainer와 같이 사용 (모듈안에 Digital Signature를 삽입)
/imports:namespace[,namespace] 지정한 어셈블리에서 네임스페이스를 가져온다.


디버깅 오류체크 : /debug, /nowarn, /quiet, /removeintchecks 등

/bugreport 버그를 보고하기 쉽도록 여러 정보를 담은 파일을 생성
/debug 디버그 정보를 만들거나 생략 (반드시 알아야할 옵션중 하나)
/nowarn 컴파일시 경고 메세지를 만들지 않는다.
/quiet 문법관련 오류나 경고에 대한 코드를 포시하지 않는다.
/removeintchecks 정수형 오버플로우를 체크하지 않음
/warnaserror 경고를 오류로 표시한다.


선처리(Preprocessor) : /define

/define:symbol=value[,symbol=value] 조건 컴파일을 위해 사용할 상수를 정의

Sub Mytest()
#if debugmode then
'디버그 문장
#Else
'평상시의 코드
#End if

상기 예제에서 define시에 DEBUGMODE=True로 하면 디버그 문장이 False면 평상시 코드가 실행될 것이다.


자원(Resource) : /resource, /linkresource, /win32icon 등

/linkresource 리소스 연결
/resource 어셈블리 모듈안에 리소스 포함
/win32icon 출력 파일에 .ico 파일을 추가
/win32resource 출력 파일에 Win32 리소스를 추가

기타 옵션들 : @, /?, /baseaddress, /main, /nologo 등

/@response_file 컴파일러 옵션과 소스코드 파일들을 명시한 파일(중요)
/? 또는 /help 컴파일러 옵션 표시
/baseaddress dll의 기본 주소를 지정한다.
/main Sub Main 프로시져가 들어있는 클래스를 명시
/nologo 컴퍼일러 배너 정보를 생략
/optionexplicit 변수들을 선언한 후 사용할 수 있도록
/optionstrict 유형에 대한 체크를 강력히 함, 묵시적인 유형변환 금지
/optioncompare 문자열 비교시 바이너리로 할 것인지, 문자로 할 것인지 지정
/recurse 컴파일 할 소스 파일을 가져오기 위해 하위 폴더까지 검색
/rootnamespace 모든 유형 선언에 대한 네임스페이스 지정


ex)

vbc @Response.txt module1.vb
혹은
vbc @Response.txt /out:test1.exe module1.vb

Response.txt 파일 내용 :

/Import:"Microsoft.VisualBasic"
/Import:"System"
/Import:"System.Collections"
/Import:"System.Diagnostics"

-> vbproj 파일안에 Import 부분의 내용
기본 개념.. 따로 정리할 필요는 없을듯..

ㅇ. 구조적인 예외처리
: Try ~ Catch ~ Finally ~ End Try
: 오류 필터링
: 안정적이고 쉽게 오류에 대한 대응
형식)
Try
Try Statements
Catch [exception[As Type]][When expression]
catchstatements
[exit try]
Catch [exception[As Type]][When expression]
catchstatements
[exit try]
....
[Finally
finallystatements
End Try


: Exception 클래스
- 표준 코드와 분리하여 예외를 처리
- 지원 속성 (StackTrace, InnerException, Message,
HelpLink, Hresult, Source, TargetSite)




ㅇ. 비구조적인 오류 처리
: On Error ~
: 프로시져 내에서 오류처리
: 프로그램 속도 저하
: 디버그나 유지 보수가 어렵다.

형식)
On Error GoTo Line (or Label)

On Error Resume Next

On Error Goto 0 (에러처리 안함)

On Error Goto -1 (에러처리 루틴이 활성화 되어 있으면 Off 시킴)


: Err 개체
- 에러 발생시 에러 정보를 가진다.
- Raise 메서드 -> 일부러 Run-time 에러 발생
- Clear -> 강제로 Err 개체를 Reset


ㅇ. 오류의 종류
: 문법 오류 (Syntax Error)
: 실시간 오류 (Run-time Error)
: 로직 오류 (Logic Error)


Sample)

Try
Devide = Cint(First/Second)
carch when Second = 0
msgbox("Devide by Zero")
Finally

End Tty
ㅇ. 다형성이란
: 많은 클래스들이 동일한 속성과 메서드를 가지고 있을 경우 호출한 쪽에서는 현재 사용중인 개체가 어느 클래스를 기반으로 하고 있는지 알필요가 없다.

ㅇ. 다형성을 이용한 클래스 작성 접근방법

-. 인터페이스(Interface) 기반
: 기존의 VB6.0에서 사용
: 클래스 안에서 인터페이스 멤버를 구현한다.
- Interface키워드를 사용하여 인터페이스 정의
- Implements 키워드를 사용
: Overloads 키워드 사용 가능

형식)
Interface tmpInterface
Function Method1(ByRef s As String) As Boolean
Overloads Sub Method2()
Overloads Sub Method2(ByVal i As Integer)
End Interface

Ex)

Interface iPerson
Property LastName() As String
Sub Display()
End Interface

Class Emp
Implements iPerson
Private strName As String
Private strCompant As String

Public Sub Display() Implements iPerson.Display
MsgBox(LastName & " " & strCompant, , "Employee")

End Sub

Public Property LastName() As String Implements iPerson.LastName
Get
Return strName
End Get
Set(ByVal Value As String)

End Set
End Property

Public Property Company() As String
Get

End Get
Set(ByVal Value As String)

End Set
End Property
End Class

Dim perPerson As Iperson, empEmp As New Emp
empEmp.Company = "Company Name"
perPerson = empEmp
perPerson.LastName = "Yoo"
perPerson.Display()
empEmp.Display()


-. 상속(Inheritance)을 기반
: VB.NET에 새롭게 추가됨
: 베이스 클래스에서 메서드를 작성
: 파생된 클래스에서 오버라이딩

Ex)
상속을 이용한 클래서 두어개 만들고..
서브루틴 함수 호출해만서 클래스변수를 넘겨 주면..
해당 루틴안에서 어떤 클래스건 상관없이 공통의 메소드를 실행시켜 준다는 건데..
예제가 좀 기네..



사실.. 별거 아닌듯..

인터페이스를 기반으로 한거나.. 상속을 기반으로 한거나...

설명이 간단해서 그런가..

동영상 강좌로 공부하고 있는데..


별거 없지 싶은.. 쩝..

말만 너무 어려워서.. 쯧... -_-++
VB개발만 하다보니.. 개념이 헷갈려서.. 쯧..

ㅇ. 이미 존재하는 클래서(Base Class)로 부터 새로은 클래서(Derived Class)를 만들기 위해 사용.

ㅇ. 파생된 클래서에서는 속성, 메서드, 이벤트, 필드, 이벤트 핸들러등을 그대로 혹은 새롭게 정의해서 사용 가능

ㅇ. 한 프로젝트 내에서 다른 클래서로부터 혹은 프로젝트에서 찹조하고 있는 개체로부터 상속 가능

+ Recent posts