PROGRAMMING WORKSHOP

VB.Net |
Diary_2

사용자 폴더 만들기

소루션을 실행하면서
폴더를 만들도록 해보자
매번 열릴때마다 소루션용 폴더가 없으면 만들어 주도록 하는 것
폼이 실행될때 폴더가 있는지 없는지 확인하고 없으면 아래의 폴더만들기
구문이 실행되도록 한다

Public PROJ_NAME As String = "UNO_NetSeries"
Public PROJ_FOLDER As String = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\" & PROJ_NAME
Public PROJ_PICS_FOLDER As String = PROJ_FOLDER & "\PICS"
Public PROJ_DB As String = PROJ_FOLDER & "\UNO_Net.accdb"

Function isProjFolderExist() As Boolean
	Return My.Computer.FileSystem.DirectoryExists(PROJ_FOLDER)
End Function

Function isProjDBExist() As Boolean
	Return My.Computer.FileSystem.FileExists(PROJ_DB)
End Function

Sub manageFolder()
	If Not isProjFolderExist() Then
		My.Computer.FileSystem.CreateDirectory(PROJ_PICS_FOLDER)
	Else
		If Not My.Computer.FileSystem.DirectoryExists(PROJ_PICS_FOLDER) Then
			My.Computer.FileSystem.CreateDirectory(PROJ_PICS_FOLDER)
		End If
	End If
End Sub

폼이 실행될때 위의 manageFolder만 한번씩 호출하면 되겠다

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
	setControls()
	modMain.manageFolder()
End Sub
	
폴더가 없으면 무조건 만든다..
사용자가 삭제를 해버려도 항상 같은 폴더를 유지한다
이폴더를 만드는 이유는 억세스 DB를 항상 같은 위치에 보관시켜야 하니까..

또한.. DB가 있는지 없는지 체크하여야 할것이고
없으면 역시 DB를 위의 폴더에 만들어 넣는다
이제 도구가 필요하다
억세스 DB를 만들기 위한 ADO라이브러리..
VB.Net의 ADO.Net과 COM 에서 제공하는 ADO와는 다르다..
억세스는 COM라이브러리인 ADO 라이브러리를 참조시켜야 한다



ADO도 일반적으로 정보를 불러오고 입력하고 하는 것이 아닌
DB의 구조를 만들어야 하는 경우에는 ADO EXT을 참조하여 만든다

DB를 구축한다고 하는 것은..DB file을 만들고,
DB file 속에 Table을 몇개를 만들어 넣는 작업이다
DB file만 만든다고 하는것은 빈껍데기이고 아무내용도 없는 셈이다
우선 DB, 여기에서는 Access DB..

Dim ADOX_ As New ADOX.Catalog
ADOX_.Create("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & sPathAndFolder)

빨강색은 위에서 만든 경로명과 폴더명을 문자열로 전달 한것
그러면 만들어진다..
이렇게 딱 두줄???
그렇다 딱 두줄이다..

프로그래밍은 주어진 개체를 조합만 하면 된다
그러면서 필요한 정보를 전달해주면 된다

당연히 ADOX.Catalog라는 것은 참조한 라이브러리 ADO EXT가 제공하는
자산이다, 필요한 라이브러리, 필요한 개체, 필요한 속성이나 메소드를
선택하여 사용하면 되는 것, 아래화일 다운로드하여 실행해보시고

***[LOG-IN]***

다음 작업은 위의 sPathAndFolder 변수가 갖고 있는
위치와 Access DB에 테이블을 만들어주는 것..
이때 생각을 좀 해보아야 하는 것이 사람의 몫이다
어떤 정보를 어떻게 보관할 것인가..
그리고 나중에 찾아 보는 것은 어떤 것을 찾아 볼 것인가??
이런 궁리를 해야 하는 것,
정말 컴퓨터가 할일이 아닌 사람의 몫인 것이다
이런 생각의 추적과 관리를 위하여 BrainStorming Tool이라는것을
만들어서 올려놓았는데 활용을 어떻게 하는 것인지 모르시는 분들이 많다
다목적 생각관리도구이니까..당연히 아래와 같이 사용할수 있을 것이다



빨강색은 테이블이고 그러니, 빨강색이 3개, 3개의 테이블
그리고 파랑색은 테이블을 구성하는 휠드들..
대강 그려 넣은것이지만, 아무튼 이렇게 활용하는 것이다
그리고 다음주에 추가할 기능이지만 [엑셀로 옮기기를 하면]



엑셀로 질서있게 잘 옮겨진다..

생각은 글로 쓰는 것보다는 다이아그램으로 연상을 하면서
연결을 해나가면 생각이 훨씬 자유로워지고, 전혀 생각지도 않은 생각이
나게 되기도 한다..아무튼 그런 도구를 이런 DB를 구축하는 아이디어에서도
활용하시라는 것

DB를 만들고 Table을 만들고 그리고 Table을 구성하는 휠드를 만들고
이것은 정보를 체계적으로 모아놓는 구조를 디자인 하는 것이다
정리정돈된 창고를 만드는 셈이다
그러려면 어떤 정보를 보관할 것인지, 정보의 타입을 알아야 하는 것이 순서다
정보는 크게 구분하여 문자정보와 숫자 정보가 있고
이것이 기본적으로 구분이 안되면 정보의 분석이 어려워진다
엑셀에서 DB로 개념을 바꿀때 난관중의 하나가, 정보의 타입과 정보의 크기가
엑셀에 비하여 엄격하다는 것이 껄끄럽다
그러나 VBA를 하면서 변수의 정보의 타입에 숙달이 되었다면
자연스러운 것이고
숫자 정보는 또 크게 날짜나 시간정보와 Integer,Long,Double,Single등이 있을 것이다
엑셀의 테이블로 구성된 휠드명을 보면..
연번---이것은 DB에서 자동발생하는 일련번호형식의숫자
식당명--문자열정보
전화번호--문자열정보
위치--문자열정보
구분(음식구분)--문자열정보
회식용(식당의 용도)-- 문자열정보
추천별점(평가 별점)--문자열정보
평가1(요약평가)-- 문자열정보
평가2(평가메모)-- 문자열정보
가본곳(가본곳인지 안가본것인지.)--논리값정보

우선 만들기 전에 DB속에 Table이 있는지 없는지도 확인해보아야 한다
없으면 만들고, 있으면 사용하고
DB속의 테이블이 있는지 없는지 알아 본다고 하는 것은
DB의 생겨먹은 구조(Schema)를 알아내야 하는 것
걱정할 것이 없다 ADO에서 DB의 구조를 보관하고 있는 것이 어떤 개체인지만
알면 되는 것
그런데 이런 것은 자주 사용하는 것이 아니라..뭐더라???하게 된다
영어를 즐기세요..영어가 힘입니다!! 라고 하는 이유는 바로 이런 부분이다
그냥 웹사이트에 들어가서..
how can i find table infomation in database
라고 검색어를 넣거나 비슷하게 넣으면 주루룩 걸려 올라온다
그러니 이런 것을 외우고 자시고 할 것이 없는 것이다
물론 중요하다고 생각하면 , 나중에 또 쓸일이 있다면 code snippet를
위에서 이야기한 BrainStorming Tool에 보관하여 두었다가 쓰면 더욱 편리할 것이고..
그러면 가장 신뢰성있는 곳은 두말할 것없이 MS기술사이트인것...
MS 표준은 아래와 같다..

Public Function GetSchemaTable(ByVal connectionString As String) _
    As DataTable

    Using connection As New OleDbConnection(connectionString)
        connection.Open()
		Dim schemaTable As DataTable = _
            connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
            New Object() {Nothing, Nothing, Nothing, "TABLE"})
        Return schemaTable
    End Using 
End Function

그런데 위의 구문중에 낯선 단어가 있다 Using 과 End Using 브록이 있다
이것이 뭐지... With ~ End With구문과 같다고 생각하면 좋겠다
그럼 With문을 쓰지, 왠 또 낯선 Using 인가..
이것은 Using~ End Using이라고 하는 순간 사용하였던 개체가 메모리에서
싹 사라져 버리는 임시 사용하겠다는 키워드인것이다
VB.Net은 눈에 보이지 않는 뒤에서 엄격하게 메모리등을 자동관리하는 발전된
환경이라서.. 개체 하나라도 알뜰하게 사용하고 사용후 버리는 것이다
그렇지 않으면 사용하였던 개체의 메모리가 어정거리고 쓰레기로
남아 있게 되는 것..
하지만 사용해도 되고, 사용하지 않아도 별 큰문제는 없다
알뜰살뜰하게 코딩을 하고 싶다면 Using~End Using브록을 사용하면 되는것
그냥 위의 내용을 아래와 같이 사용해도 된다

 Public Function GetSchemaTable(ByVal connectionString As String) As DataTable
        Dim connection As New Data.OleDb.OleDbConnection(connectionString)
        connection.Open()
        Dim schemaTable As DataTable = _
                  connection.GetOleDbSchemaTable(Data.OleDb.OleDbSchemaGuid.Tables, _
                  New Object() {Nothing, Nothing, Nothing, "TABLE"})

        connection.Close()
        Return schemaTable
    End Function

문제는 DataTable에 DB의 정보가 담겨서 리턴값으로 받을수 있다는 것
이 DataTable에 사용하려고 하는 테이블의 이름이 있으면 이미 만들어져 있는 것이고
그렇지 않으면 없는 것이니 , 만들면 된다는 것
위의 것을 좀더 우리가 사용하려는 소루션에 맞게 다시 만들면..

Function isTableExist(ByVal sTableName As String, ByVal sDBFileAndPath As String) As Boolean
	Dim bX As Boolean = False
	Dim oCon As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDBFileAndPath & ";User Id=admin;Password=;")
	oCon.Open()
	Dim oDBSchema As DataTable = oCon.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
	oCon.Close()
	oCon = Nothing
	If oDBSchema.Rows.Count > 0 Then
		For i = 0 To oDBSchema.Rows.Count - 1
			If sTableName = oDBSchema.Rows(i).Item(2) Then
				bX = True
				Exit For
			End If
		Next
	End If
	Return bX
End Function

위의 것을 폼이 실행될때 아래와 같이 불러서 사용하면 될 것이다

If isTableExist(modMain.PROJ_DB_TBL_NAME, modMain.PROJ_DB) Then
	' 테이블이 있으니 그냥 통과..OK!
Else
	' 테이블이 없으니 만들면 되고..
End If

너무 복잡하게 생각하실 것 없다, 자주 사용하지 않는 것이니
그냥 위의 것을 복사해 두었다가 다른 경우에
변수만 바꿔서 사용하는 것이 요령이다
이제 테이블을 만든다..

Public Sub createTable(ByVal sTableName As String, ByVal sDBFileAndPath As String)
	Dim oCon As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDBFileAndPath & ";User Id=admin;Password=;")
	Dim sSQL As String = "CREATE TABLE " & sTableName & _
						"(ID AUTOINCREMENT PRIMARY KEY ," & _
						"식당명 TEXT(30)," & _
						"전화번호 TEXT(20)," & _
						"위치 TEXT(30)," & _
						"구분 TEXT(10)," & _
						"용도 TEXT(10)," & _
						"별점 TEXT(10)," & _
						"평가 TEXT(30)," & _
						"메모 TEXT(200)," & _
						"방문 YESNO)"

	oCon.Open()
	Dim oCMD As New OleDb.OleDbCommand(sSQL, oCon)
	Try
		oCMD.ExecuteNonQuery()
	Catch ex As Exception
		MsgBox(ex.Message)
	End Try
End Sub

모든 프로그래밍은 데이타타입이 중요하다..데이타타입도 DB마다 약간씩의
차이도 있고, 호칭도 다르고 그렇다
이 사이트를 참조하시고 테이블을 만드는 SQL문을 작성하면 될 것이다
아무튼 메모를 잘하는 습관이 있다면 그냥 만들어서 성공적이였던 것들 잘 보관하여도 좋겠지만
우노는 게을러서 그렇지 못하다, 그냥 할때마다 기억이 안나면 찾아 본다
아래 화일에서 테이블 하나를 만들었다
다음 페이지에서 테이블을 두개를 더 만들자?
어떤 테이블??
하나의 테이블에 죄다 때려 넣으면 안되나??
간단한 쌤플이지만 할 것은 죄다 하도록 하여 많은 경험을 하시게
하고 싶어서 작은 것이지만 큰 프로젝트의 모양새는 갖추어 보도록 하자

***[LOG-IN]***