업무 과정에서 MDB -> SQLite로 마이그레이션 작업을 해야 하는 경우가 생겼습니다.

방법을 찾아 보는 과정에서 ESF Database Migration Toolkit을 알게되었고 비교적 쉽고 간단하게

변경할 수 있어 여러분에게 소개해 드리려고 합니다.

저는 MDB를 SQLite로 변환하였기 때문에 MDB와 SQlite를 기준으로 설명드리겠습니다.

 

 

 

https://www.dbsofts.com/articles/ms_access_to_sqlite/

 

Migrating data from MS Access to SQLite | DBSofts

Migrating data from MS Access(*.mdb; *.accdb) to SQLite This article will show you how to use a simple database migration wizard to quickly migrate data from MS Access to SQLite! Help you solve complex tasks and save a lot of time! Requirements: Introducti

www.dbsofts.com

위의 사이트에서 먼저 설치를 진행합니다.

 

요구사항

Windows 7 이상

MS Access 97 이상

SQLite 2 이상

 

실행파일

본인의 운영체제 조건에 맞게 32비트 64비트를 선택하여

다운로드를 완료하면 위의 실행파일 아이콘이 생깁니다.

더블클릭하여주시고, 

 

Source에 변경 전 파일 포맷을 눌러주시고, 해당 파일의 경로를 입력하여 줍니다.

이후에 Next를 눌러주시면 됩니다.

 

 

 

 

 

Destination에 변경 후 파일 파일 포맷을 눌러주시고, 저장할 경로를 

입력해주시고 Next를 눌러주세요

 

 

변환 하고자 하는 테이블을 선택하고 Next!

 

 

마지막으로 로그를 남길 수 있는 창이 뜹니다.

저는 딱히 로그가 필요하진 않을 것 같아서 공백으로 두었습니다.

그다음 Submit을 눌러주시면 끝!

 

 

 

 

 

 

최종적으로 Viewer파일을 통하여 결과를 확인하시면 성공적인 것을 확인할 수 있습니다.

 

 

 

 

 

 

콘솔 응용 프로그램

 

위의 화면은 우리가 쉽게 볼 수있는 콘솔 응용 프로그램 화면이다.

종종 개발하는 과정에서 Visual Studio 콘솔 창을 통하여 테스트 코드 디버깅을 하게 된다. 

프로그램이 종료되기 직전에 "계속하려면 아무 키나 누르십시오..."라고 알려주던 이 까만 녀석이

오늘은 약올리듯 깜빡거리고, 꺼진다.

 

예전처럼 내가 아무 키나 누를 때까지 기다려주던 그의 모습으로 되돌리는 2가지 방법에 대해서 알아보자

 

 

1. 소스코드 끝에 System("pause") 입력하기

system 함수의 "pause" 명령어는 일시 정지를 하는 기능을 갖는다.

프로그램 중간에 넣으면 pause 실행 전 소스만 실행되고

뒤의 소스는 실행이 되지 않는다. 이러한 기능을 이용하여

소스의 끝 부분에 넣어 콘솔 창이 종료되지 않도록 하는 방법이 있다.

 

 

 

 

 

 

 

2. 프로젝트 속성 값 변경

 

프로젝트 - 속성 ( ALT + F7 )을 클릭합니다.

구성 속성 - 링커 - 시스템 - 하위 시스템의 값을

콘솔(/SUBSYSTEM:CONSOLE)으로 변경합니다. 

적용 및 확인 후 다시 콘솔 창을 띄우면 끝!

 

 

 

만약에 적용이 되었음에도 불구하고, 콘솔 창이 그대로 꺼진다면

프로젝트를 새로 만들어 다시 확인하면 정상적으로 유지되는 것을 확인할 수 있습니다.

 

 

 

 

SQLite

일반 사용자 어플리케이션 데이터베이스를 위한 사용 목적으로 개발된 오픈 RDBMS로서

별도의 서버와 프로세스 통신 없이 응용 프로그램 내에서 DB처리를 할 수 있고, 

C언어로 작성 되었으며, 일반적인 SQL(Structured Query Language)로 쿼리가 가능하다.

빠른 속도와 이식성, 안정성의 특징을 갖는다.

또한 가장 매력적인 특징 중 하나는 어디서든 실행이 가능하다는 점이고

공개된 도메인으로서 사용 목적에 관계없이 모든 사람이 자유롭게 사용 할 수 있다.

 

 

SQLite Install(설치)

2020년 4월 10일 기준 최신 버전은 3.31.1버전이며,

https://sqlite.com/index.html 에서 다운 가능하다.

 

SQLite Home Page

SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine. SQLite is the most used database engine in the world. SQLite is built into all mobile phones and most computers and comes bu

sqlite.com

Sqlite-amalgamtion-3310100.zip 설치하고 압축을 해제한다.

 

 

 

압축해제 후 결과물

 

 

Static Library 생성

 

나는 VIsualStudio2005 환경에서 정적라이브러리를 생성하였다.

프로젝트명을 sqlite3으로 하고, PreCompiled Header를 체크해제하고, Static Library로 프로젝트를 생성하여

디버그 모드와 릴리즈 모드로 각각 빌드를 하여 sqlite3.lib 파일을 생성하였다.

SQLite Sample Project 생성

 

TestSQlite라는 프로젝트를 생성하여 앞에서 만든 라이브러리와 헤더파일을 각각 링크해준다.

 

아래와 같이 테스트 코드를 작성하여 보고 Test.db 파일이 실제로 생성되는지 확인

// TestSQLite.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "sqlite3.h"
int _tmain(int argc, _TCHAR* argv[])
{
	sqlite3* myDB;

	if( SQLITE_OK != sqlite3_open("Test.db", &myDB) )
	{
		cout << "Not Accessed" << endl;
	}




	sqlite3_close(myDB);
	

	return 0;
}

 

생성된 테이블 확인하기

 

// TestSQLite.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "sqlite3.h"
int _tmain(int argc, _TCHAR* argv[])
{
	sqlite3* myDB = NULL;
	sqlite3_stmt *stmt = NULL;

	if( SQLITE_OK != sqlite3_open("Test.db", &myDB) )
	{
		cout << "Not Accessed" << endl;
	}

	char *sql = "CREATE TABLE SmartID(ID INTEGER, NAME TEXT);";

	if( SQLITE_OK == sqlite3_prepare_v2(myDB, sql, -1, &stmt, 0) )
	{
		sqlite3_step(stmt);
	}
	else
	{
		cout << "can not create table" << endl;

	}



	sqlite3_finalize(stmt);
	sqlite3_close(myDB);

	return 0;
}

 

다음 코드를 통하여  정수형 타입을 갖는 ID,

문자열 NAME 의 Attribute(어트리뷰트)를 갖는 SmartID 테이블을 생성한다.

 

그리고 DB Browser를 통하여 생성된 테이블을 확인해보자.

 

 

SmartID라는 테이블이 정상적으로 생성되었고, 앞으로 이 테이블을 이용하여 사용자의

ID와 Name의 데이터를 관리 할 수있게 되었다. 

 

DB Browser 설치 : https://sqlitebrowser.org/

 

DB Browser for SQLite

DB Browser for SQLite The Official home of the DB Browser for SQLite Screenshot What it is DB Browser for SQLite (DB4S) is a high quality, visual, open source tool to create, design, and edit database files compatible with SQLite. DB4S is for users and dev

sqlitebrowser.org

 

 

 

 

#include <string>
#include <iostream>
using namespace std;

bool solution(string s)
{
    bool answer = true;
    int pCnt = 0;
	int sCnt = 0;
    
    if( false == ( s.length() <= 50) ) answer = false;
    
    for(int i = 0; i < s.length(); ++i)
	{
		if( 'p' == s[i] || 'P' == s[i] ) pCnt++;
		else if( 'y' == s[i] || 'Y' == s[i]) sCnt++;
	}
    
    if( pCnt == sCnt ) answer = true;
    else answer = false;
    
    return answer;
}

 

 

 

 

1. 남이 작성한 코드를 자주 읽는 연습을 한다.

누군가가 작성한 잘 짜여진 코드는 우리에게 훌륭한 스승이 됩니다. 선배, 직장 상사, 교수님, 오픈 소스 등을 통해서

소스를 분석하고, 학습하세요 그 소스를 통해서 좋은 습관, 효율적인 알고리즘 등을 얻을 수 있습니다.

 

2. 남이 작성한 코드에 내가 원하는 기능을 추가해 본다.

누군가가 작성 해놓은 소스를 적절히 활용하여 기능을 추가하는 과정은 최초 작성자의 생각을 이해할 수 있게 됩니다.

 

3. 실 생활에서 내가 구현할 수 있다고 판단되는 것들을 개발하여 본다

프로그래밍은 꾸준히, 직접 구현 할 때 실력이 많이 향상합니다. 실 생활의 작은 부분이라도, 내가 생각한 대로 구현해 보는 습관은 프로그래밍에 재미를 느끼게 해 주고 점차 실력이 향상됨을 느끼게 해줍니다.

 

4. 글로 써보고, 그려보고 생각 해본다.

개발 전 혹은 소스 분석 과정에서 각 함수, 클래스, 상속관계 등을 글로 써보고 도식화를 통해 많은 것을 얻을 수 있습니다.

 

5. 온라인 알고리즘 사이트를 통해 최소한 하루에 한 문제씩 풀어 본다.

한 번에 많은 양을 푸는 것은 지칠 수 있으니, 쉬운 것부터 차근차근!

 

6. 자신이 맡은 혹은 개발 중인 프로그램이 작동하지 않을 때, 도움을 받으려 하지 말고 스스로 생각해보아라.

우리는 동작하지 않거나, 작동은 하되 적절하게 동작하지 않는 코드를 가지고 있을 수 있습니다. 가능한 빠르게 해결하길 원하지만 바로 도움을 요청하기보다 스스로 문제를 해결하기 위해 시간을 충분히 투자해 본다면, 큰 도움이 될 것입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 


 

해당 문제는 피보나치 함수를 재귀적으로 호출하며 0과 1의 개수를 카운팅 하는 문제다.

나는 Count라는 객체를 만들고 멤버변수로 zero, one을 추가하였다.

 

testCase의 수를 입력받고 Counter 포인터 객체인 cnt를 동적으로 메모리를 잡아주었고, 

피보나치 함수에 각 인덱스에 해당 하는 값을 넘겨주어 zero, one을 카운팅 해주었다.

 

testCase 만큼 반복하고 프로그램이 종료되기 전 cnt의 zero, one을 cout을 통하여 출력해준다.

 

코드는 아래와 같다.

 

 


 

 

#include <iostream>
#include <list>
using namespace std;
class Counter
{
public:
	int zero;
	int one;
public:
	Counter()
	{
		zero = 0;
		one = 0;
	}
};
int fibonacci(int n, Counter& c);
Counter* cnt;
int main()
{
	int testCase = 0;
	int succeedCase = 0;
	int num = 0;
	cin >> testCase;
	cnt = new Counter[testCase];
	while (true)
	{
		cin >> num;
		if (0 <= num && num < 40)
		{
			
			fibonacci(num, cnt[succeedCase]);
			++succeedCase;
		}
		else
		{
		}
		if (testCase == succeedCase)
		{
			break;
		}
		
	}
	for (int i = 0; i < succeedCase; ++i)
	{
		cout << cnt[i].zero << " " << cnt[i].one << endl;
	}
	return 0;
}
int fibonacci(int n, Counter& c)
{
	if (n == 0)
	{
		c.zero++;
		return 0;
	}
	else if (n == 1)
	{
		c.one++;
		return 1;
	}
	else
	{
		fibonacci(n - 1, c) + fibonacci(n - 2, c);
	}
}

 

 

 

 

 

질의어


관계대수와 같다.
대수 = 식 
5 + 4 = 10 -> 수식
식을 구성하는 구성요소가 있다. 5, 4의 위치는 각각 항이라고 칭하고 +는 산술연산자
관계대수도 이런 식!. 

 

그러나 수가 아닌 관계(릴레이션)이 들어간 식.
마찬 가지로 관계대수에도 연산자가 있다. 
관계대수의 연산자를 이해하고 활용 하는 방법을 배운다.

관계해석 = 집합의 개념으로 나타냄, 원하는 데이터만 명시하고 질의를 어떻게
               수행할 것인가는 명시하지 않는 선언적인 언어
                대통령 선언문 -> 꿈이 있는 나라를 만들겠습니다!

관계대수 = 수식으로 뭔가를 나타냄, 선언적인언어 이기는 하지만 관계해석에 비해 약간의
               절차성이 있다.


.

실렉션, 프로젝션은 단항 연산자
합집합, 차집합, 카티션 곱은 집합연산자


1. 실렉션(σ) : 세로줄은 애트리뷰트, 가로줄은 튜플, 
r(R)에서 선택조건 c를 만족하는 튜플들을 선택
               ex)  학생 튜플이 40개 있을때, 조건을 1개줌 
                     이중에서 지난 학기 4.0이상인 학생들을 뽑아라. 
                     그럼 그에 해당하는 튜플들이 나옴 
                    원래 데이터의 갯수를 넘을 수 없다.

 


2. 프로젝션(π) : 
                 ex) 학생이라는 릴레이션에 학번, 평점만 나오게해줘!
                     특정 지정만 애트리뷰트들만 짤라 나올수 있게 하는 것이 프로젝션
                     원래 데이터의 갯수를 넘을 수 없지만 릴레이션을 집합으로 보기 때문에
                      중복된 값은 합치게 되어 ex) 과장 2개 나오면 과장1개 줄어 들 수는 있다.
실렉션과 프로젝션은
일반적으로는 교환법칙이 성립한다.
그러나 없어지는 애트리뷰트에 대한 조건문이 들어가면 안된다.
ex) 프로젝션을 통해 이름 애트리뷰트가 사라진 상태에서 
실렉션을 통해 이름을 찾는 경우 문제가 됨.



3. 합집합 : 
두개의 릴레이션의 튜플들을 합쳐주는 것 

4. 차집합 : 
2-1 학생들 중 자료구조를 수강, 송윈플 노수강인 친구들을 뽑아주세요!

5. 교집합 :
송윈플, 장자구 둘다 들은 학생을 뽑아주세요

- 합집합, 차집합, 교집합은 애트리뷰트 들의 갯수가 동일하고, 대응되는
   애트리뷰트들의 도메인이 호환성을 가져야 한다. -> 이를 합집합 호환성이라 부른다.
   = 즉 스키마가 동일한 두 릴레이션에 대해서만 집합연산이 가능하다.


두 릴레이션 들에 대해서 차집합 연산을 할때 합집합 호환성이 있어야 된다. 

 

디버그 모드

 

- 실행파일에 디버깅 정보를 포함

- 실행파일 상태 정보 확인 가능

- 디버깅 정보를 포함하였기 때문에속도가 릴리즈모드에 비해 느리다.

 


릴리즈 모드

 

- 코드를 최적화하여 실행파일의 크기를 최대한 줄인다.

- 속도가 디버그 모드에 비해 빠르고, 파일의 크기가 비교적 작다. 메모리 점유율이 낮음

- 초기화가 이루어지지 않는다.

 


디버그 모드와 릴리즈 모드의 차이점

 

일단 큰 차이는 디버깅 정보가 실행코드에 포함 되냐 안되냐의 차이가 있다.

따라서 소스의 크기가 다르고, 속도의 차이를 갖는다.

실행파일 크기의 경우 3~4배 정도의 차이가 있다.

 

디버그모드와 릴리즈모드를 각각 실행했을때 둘중 하나가 정상적으로 실행되지 않는 경우는

프로그램 상에 문제가 있다는 것이다. 따라서 둘다 정상적으로 실행이 되었을때 배포 할 것.

 

+ Recent posts