2011/09/25

[C#] Firebird Embedded로 사용하기

C#에서 Firebird를 사용해 보았는데 Embedded 도 사용이 가능한지 테스트 해 보았다.


Embedded 사용도 크게 차이가 없었다.


연결문자열의 ServerType을 1로(FbConnectionStringBuilder를 사용할 경우 csb.ServerType = FbServerType.Embedded;) 설정 하고 Firebird Embedded 패키지의 아래 파일들을 실행파일과 함께 두면 된다.

fbembed.dll

firebird.conf

firebird.msg

ib_util.dll

icudt30.dll

icuin30.dll

icuuc30.dll<

Original Post : http://neodreamer-dev.tistory.com/581

2011/09/22

[C#] Firebird 연결문자열을 FbConnectionStringBuilder를 이용하여 만들기

Connection Strings을 아래와 같이 문자열로 작업하는 것이 아니라 FbConnectionStringBuilder 객체를 이용하면 좀 더 쉽고 직관적으로 만들 수 있다.

string connectionString =
"User=SYSDBA;" +
"Password=masterkey;" +
"Database=F:\FirebirdDB\ estdb.fdb;" +
"DataSource=localhost;" +
"Charset=UTF8;" +
"ServerType=0"; // Type: 0 - Server, 1 - Embedded



FbConnectionStringBuilder csb = new FbConnectionStringBuilder();
csb.UserID = "SYSDBA";
csb.Password = "masterkey";
csb.Database = "F:\FirebirdDB\ estdb.fdb";
csb.DataSource = "localhost";
csb.Charset = "UTF8";
csb.ServerType = FbServerType.Default;

// Create Database
FbConnection.CreateDatabase(csb.ToString());

// Create Connection object
FbConnection conFirebird = new FbConnection(csb.ToString());

:

// Drop Database
FbConnection.DropDatabase(csb.ToString());



FbConnectionStringBuilder Properties (출처: Firebird .Net Provider SDK 1.7 문서)





















































































































NameTypeDescription
CharsetstringGets or sets the connection character set.
ClientLibrarystring

ConnectionLifeTimeintGets or sets the lifetime of a connection in the pool.
ConnectionTimeoutintGets the time to wait while trying to establish a connection before terminating
the attempt and generating an error.
ContextConnectionbool

DatabasestringGets the name of the actual database or the database to be used when a
connection is open.
DataSourcestringGets the name of the Firebird Server to which to connect.
DbCachePagesint

DialectintGets or sets the database dialect.
Enlistbool

FetchSizeintIndicates the number of rows that will be fetched at the same time on Read calls into the internal row buffer.
IsolationLevelIsolationLevel Gets or sets the default Isolation Leve for implicit transactions.
MaxPoolSizeintGets or sets the maximun pool size.
MinPoolSizeintGets or sets the minumun pool size.
PacketSizeintGets or sets the size (in bytes) of network packets used to communicate with an
instance of Firebird Server.
PasswordstringGets ort sets the password for the Firebird user account.
PoolingboolGets or sets the status of the connection pooling.
PortintGets or sets the port number in the server for establish the connection.
ReturnRecordsAffected bool

RolestringGets or sets the suer role name.
ServerTypeFbServerType Gets or sets the server type to wich we want to connect.
UserIDstringGets or sets the firebird User account for login.



<

Original Post : http://neodreamer-dev.tistory.com/580

[C#] Firebird 사용하기

C#을 공부하고 있는데 Firebird를 사용해보고 싶어 Firebird .Net Provider 사용에 대한 테스트를 해 보았다.

C#은 참 사용하기 쉽게 만든 언어 같다. Firebird를 C++에서 사용하기 위해 IBPP 나 Firebird C API를 사용해서 Firebird를 이용할 때에는 무척이나 복잡했었다.

Firebird C++ Wrapper도 .Net Provider 처럼 사용하기 어렵지 않은 라이브러리가 있었으면 좋겠다.


C#에서의 테스트는 데이버베이스를 생성하고 테이블을 만들어 Insert, Update 등의 테스트를 하고 테이블과 데이터베이스를 삭제하여 보았다.


아래 코드는 테스트에 사용된 코드이다.

txtResult.Clear();
txtResult.AppendText("Begin Testing...\n");

string connectionString =
"User=SYSDBA;" +
"Password=masterkey;" +
"Database=F:\FirebirdDB\ estdb.fdb;" +
"DataSource=localhost;" +
"Charset=UTF8;" +
"ServerType=0"; // Type: 0 - Server, 1 - Embedded

try
{
// Create Database
FbConnection.CreateDatabase(connectionString);
txtResult.AppendText("Create Database...OK\n");

// Create Connection object
FbConnection conFirebird = new FbConnection(connectionString);
txtResult.AppendText("Create Connection Object...OK["
+ conFirebird.State.ToString() + " : "
+ FbConnection.ConnectionPoolsCount.ToString()
+ "]\n");

// Connect
conFirebird.Open();
txtResult.AppendText("Open Connection...OK["
+ conFirebird.State.ToString() + " : "
+ FbConnection.ConnectionPoolsCount.ToString()
+ "]\n");

FbCommand cmdSQL = new FbCommand();
cmdSQL.Connection = conFirebird;

// Create Table
string strQuery = "CREATE TABLE Member"
+ "("
+ " ID VARCHAR(20) NOT NULL,"
+ " NAME VARCHAR(20) NOT NULL,"
+ " ALIAS VARCHAR(20),"
+ " AGE INTEGER"
+ ")";

cmdSQL.CommandText = strQuery;
cmdSQL.ExecuteNonQuery();
txtResult.AppendText("Create test Table...OK\n");

// Insert Data
FbTransaction transInsert = conFirebird.BeginTransaction();
cmdSQL.Transaction = transInsert;
for (int i = 0; i < 5; i++)
{
cmdSQL.CommandText = "INSERT INTO Member(ID, NAME, ALIAS, AGE) "
+ "VALUES ("
+ " 'Man" + i.ToString() + "' "
+ " ,'Name" + i.ToString() + "' "
+ " ,'Alias" + i.ToString() + "' "
+ " ," + (i + 10).ToString()
+ ");";
int nRow = cmdSQL.ExecuteNonQuery();
txtResult.AppendText(" Insert " + nRow.ToString() + "row(s)...OK\n");
}
transInsert.Commit();
transInsert.Dispose();
cmdSQL.Transaction = null;
txtResult.AppendText(" Insertion committed...OK\n");
txtResult.AppendText("Insert data...OK\n");

// Select Data
FbDataAdapter da = new FbDataAdapter("SELECT * FROM Member", conFirebird);
DataTable dt = new DataTable();
da.Fill(dt);
ArrayList lstColumn = new ArrayList();
foreach (DataColumn col in dt.Columns)
{
txtResult.AppendText(col.ColumnName + " ");
lstColumn.Add(col.ColumnName);
}
txtResult.AppendText("\n");
foreach (DataRow row in dt.Rows)
{
txtResult.AppendText(row[lstColumn[0] as string] + " "
+ row[lstColumn[1] as string] + " "
+ row[lstColumn[2] as string] + " "
+ row[lstColumn[3] as string] + " "
+ "\n"
);
}
dt.Clear();

// Update some data
FbTransaction transUpdate = conFirebird.BeginTransaction();
txtResult.AppendText("UPDATE Member SET Age = Age + 20 WHERE Age > 11;\n");
cmdSQL.CommandText = "UPDATE Member SET Age = Age + 20 WHERE Age > 11;";
cmdSQL.Transaction = transUpdate;
int nUpdate = cmdSQL.ExecuteNonQuery();
transUpdate.Commit();
transUpdate.Dispose();
cmdSQL.Transaction = null;
txtResult.AppendText(" " + nUpdate.ToString() + "row(s) updated!\n");
txtResult.AppendText("Update data...OK\n");

// Select Data
da.SelectCommand.CommandText = "SELECT * FROM Member";
da.Fill(dt);
foreach (DataColumn col in dt.Columns)
{
txtResult.AppendText(col.ColumnName + " ");
}
txtResult.AppendText("\n");
foreach (DataRow row in dt.Rows)
{
txtResult.AppendText(row["ID"] + " "
+ row["NAME"] + " "
+ row["ALIAS"] + " "
+ row["AGE"] + " "
+ "\n"
);
}
dt.Clear();
da.Dispose();

// Delete data
cmdSQL.CommandText = "DELETE FROM Member;";
cmdSQL.ExecuteNonQuery();
txtResult.AppendText("Delete data...OK\n");

// Drop Table
cmdSQL.CommandText = "DROP TABLE Member;";
cmdSQL.ExecuteNonQuery();
txtResult.AppendText("Drop test Table...OK\n");

// Close
conFirebird.Close();
txtResult.AppendText("Close Connection...OK["
+ conFirebird.State.ToString() + " : "
+ FbConnection.ConnectionPoolsCount.ToString()
+ "]\n");

// Clear Pool
FbConnection.ClearPool(conFirebird);
txtResult.AppendText("Clear Connection pool...OK["
+ conFirebird.State.ToString() + " : "
+ FbConnection.ConnectionPoolsCount.ToString()
+ "]\n");

// Drop Database
FbConnection.DropDatabase(connectionString);
txtResult.AppendText("Drop Database...OK\n");
}
catch (FbException ex)
{
//MessageBox.Show("Occured FbException \n" + ex.ToString());
txtResult.AppendText("Occured FbException => Error code : "
+ ex.ErrorCode.ToString() + "\n");
txtResult.AppendText("-------------------------------------------------\n");
txtResult.AppendText(ex.ToString() + "\n");
txtResult.AppendText("-------------------------------------------------\n");
}
catch (Exception ex)
{
//MessageBox.Show("Occured Exception \n" + ex.ToString());
txtResult.AppendText("Occured Exception \n");
txtResult.AppendText("-------------------------------------------------\n");
txtResult.AppendText(ex.ToString() + "\n");
txtResult.AppendText("-------------------------------------------------\n");
}

txtResult.AppendText("End Testing.\n");


실행 결과:


Begin Testing...
Create Database...OK
Create Connection Object...OK[Closed : 0]
Open Connection...OK[Open : 1]
Create test Table...OK
Insert 1row(s)...OK
Insert 1row(s)...OK
Insert 1row(s)...OK
Insert 1row(s)...OK
Insert 1row(s)...OK
Insertion committed...OK
Insert data...OK
ID NAME ALIAS AGE
Man0 Name0 Alias0 10
Man1 Name1 Alias1 11
Man2 Name2 Alias2 12
Man3 Name3 Alias3 13
Man4 Name4 Alias4 14
UPDATE Member SET Age = Age + 20 WHERE Age > 11;
3row(s) updated!
Update data...OK
ID NAME ALIAS AGE
Man0 Name0 Alias0 10
Man1 Name1 Alias1 11
Man2 Name2 Alias2 32
Man3 Name3 Alias3 33
Man4 Name4 Alias4 34
Delete data...OK
Drop test Table...OK
Close Connection...OK[Closed : 1]
Clear Connection pool...OK[Closed : 0]
Drop Database...OK
End Testing.
<

Original Post : http://neodreamer-dev.tistory.com/579

[C#] Delay

// #1 Using Thread Sleep method
Thread.Sleep(5000);

// #2 Using TickCount
public void Delay(int ms)
{
int time = Environment.TickCount;

do
{
if(Environment.TickCount - time >= ms) return;
} while(true)
}

// #3 Using DateTime
public static DateTime PauseForMilliSeconds( int MilliSecondsToPauseFor )
{
System.DateTime ThisMoment = System.DateTime.Now;
System.TimeSpan duration = new System.TimeSpan( 0, 0, 0, 0, MilliSecondsToPauseFor );
System.DateTime AfterWards = ThisMoment.Add( duration );

while ( AfterWards >= ThisMoment )
{
System.Windows.Forms.Application.DoEvents();
ThisMoment = System.DateTime.Now;
}

return System.DateTime.Now;
}
<

Original Post : http://neodreamer-dev.tistory.com/578

2011/09/21

메모장을 버리다.

윈도우즈에 기본으로 포함되어있는 텍스트 편집기인 메모장(Notepad)을 집어 던졌다.

가벼워서 사용을 하고 있었는데 기능도 빈약하데다 버그 같은 녀석을 가지고 있길래 바꿔 버렸다.


Notepad에서 WordWrap 기능을 이용할 경우 간혹 모든 라이피드(\n) 문자가 사라져 당황케 하는 문제가 발생했다. 이 녀석을 대체할 녀석이 있는지 찾아 보았는데 인터넷 상에서 여러 편집기 들이 거론이 되고 있었다. PSPad, Notepad++, Notepad2 등. 거론되고 있는 대부분의 편집기들을 이미 내가 사용한 경험이 있거나 사용하고 있는 프로그램들이였다. 이 중에서 메모장을 대신하려면 메모장 만큼이나 가벼워야 하는데 몇몇 편집기들은 기능이 다양해서 메모장에 비하면 상대적으로 무겁고 느렸다.


그래서 최종적으로 선택된 녀석이 Notepad2 이다.





Notepad2는 기존의 메모장 만큼이나 가벼우면서 많이 부가 기능을 제공한다. UI면에서도 툴바와 줄번호를 지원한다. 기능적인 면은 보이는 것보다 많은 기능이 있다. 문법강조 또한 지원하고 있다.



Notepad2 홈페이지에서 설치파일과 프로그램 파일을 제공하고 있는데 그냥 Notepad2를 맛보고자 하는 경우 프로그램파일을 다운받아 실행하면 손쉽게 사용할 수 있다. 그리고 설치파일로 프로그램을 설치할 경우 기존의 Notepad를 대체하도록 설치하는 것을 지원한다. 그리고 32비트와 64비트용을 별도록 제공하고 있다.


기존의 Notepad를 대체하고자 하는 경우 플랫폼에 맞는 설치파일을 설치만 하면 된다.

 

Notepad 2 homepage&

Original Post : http://neodreamer-dev.tistory.com/577

2011/09/20

[WPF] StatusBar 프로그램 하단에 배치하기

<Window ...>
<DockPanel>
<StatusBar DockPanel.Dock="Bottom">
<StatusBarItem>
<TextBlock Name="statusText">Ready</TextBlock>
</StatusBarItem>
</StatusBar>
:
</DockPanel>
</Window>
<

Original Post : http://neodreamer-dev.tistory.com/576

2011/09/19

간편한 SQLite 관리 프로그램 - SQLiteSpy 1.9.1

SQLiteSpy는 작고 편린한 로컬데이터 베이스 시스템인 SQLite 를 관리하는 관리 프로그램 이다.

프로그램 크기도 작고 SQLite 를 사용함에 있어 아주 유용한 프로그램 이다.



SQLiteSpy 1.9.1 – 28 Jul 2011


  • Update built-in DISQLite3 engine to pre SQLite 3.7.8.

  • Add YuStemmer language stemming to the FTS4 unicode tokenizer.

  • Add the fuzzer and wholenumber virtual tables.

  • If a database file can not be opened, fall back to the :memory: database.




<

Original Post : http://neodreamer-dev.tistory.com/575

2011/09/15

Virtual Box 에 Android 올리기

Android 를 VirtualBox에 올려보고자 정보를 찾아서 해 보았다.



일단 VirtualBox 는 이미 설치되어 있는 상태에서 android-x86.2.3-4th-test-110620.iso 이미지를 이용하여 Android를 설치하였다.



Android 이미지는  http://code.google.com/p/androbox/ 에서 다운 받았다.



VirtualBox 에서 운영 체제를 Other/Unknown 으로 설정하고 가상 머신을 만들었다. 그리고 받아두었던 Android 이미지를 마운트 시켜주었다.

Android 머신 설정화면

Android 머신 설정화면



가상 머신을 시작하면 아래와 같은 부팅 화면을 볼 수 있다. 이 화면에서 Installation 메뉴를 선택한다.

Android 부팅 메뉴 화면

Android 부팅 메뉴 화면



파티션 선택 화면에서 "Create/Modify partitions"를 선택한다.

파티션 선택 화면

파티션 선택 화면



다음 화면에서 "[ New ]" 메뉴로 새로운 Primary 파티션을 생성한다.

파티션 생성

Primary 설정

크기 설정




생성한 파티션을 "[ Bootable ]" 명령을 이용해 부팅 가능하도록 설정을 하고 저장"[ Write ]"한다. 그리고 "[ Quit ]" 명령으로 작업을 마친다.

Bootable 설정

partition 변경 사항 기록




작업을 마치면 아래와 같이 파티션을 포맷하는 대화 상자가 나온다. filesystem 을 ext3로 선택하고 포맷을 수행한다.

filesystem 선택 화면

filesystem 선택 화면



그리고 다음 단계로 Grub를 설치한다.

Grub 설치 확인 화면

Grub 설치 확인 화면



System 디렉토리를 읽기/쓰기 모드로 설치를 한다.

/system directory 설치 화면

/system directory 설치 화면



마지막으로 필요할 경우 가상 sdcard 를 생성해 주면 설치가 완료 된다.


Android를 부팅해 보면 아래와 갈은 화면을 볼 수 있다.

Android 화면

Android 화면



Android 부팅후 몇 가지 점검을 해 보았다. 키 입력이 중국어로 되어 있어 설정을 우리 나라에 맞게 바꾸어 주었다. 실행 되는 속도를 보면 SDK의 Emulator 보다는 빠르게 동작을 하였다.


VirtualBox에 올린 Android 를 개발용으로 사용할 수 있는지 Emulator 를 대신할 수 있는지 확인해 보아야 겠

Original Post : http://neodreamer-dev.tistory.com/574

Windows 8 잠깐 사용기

Windows 8 을 설치하고 잠깐 사용하여 보았다.

설치 후 실행하고 로그인을 하면 아래와 같은 초기 화면을 만나게 된다.

Windows 8 초기 화면

Windows 8 초기 화면



시작 화면은 가로로 스크롤이 되고 사용하면서 바뀌겠지만 처음에는 대략 3페이지 정도로 구성이 되어 있다.





Windows 는 PC와 타블렛을 모두 포함하기 위해 Metro UI를 사용하였다고 한다. 기존의 PC 용 Windows 7과 얼마나 다를까 해서 먼저 Desktop 을 실행하여 보았다.

Windows 8 Desktop 초기 화면

Windows 8 Desktop 초기 화면



탐색기를 실행한 화면은 아래와 같았다.

Windows 8 탐색기

Windows 8 탐색기



화면의 왼쪽 아래에 전통적인 시작 버튼이 보이는데 기능은 전통적이지 않다. 저 시작 버튼을 누르게 되면 초기 화면으로 돌아가게 된다.

아마도 기존의 PC 사용자가 가장 혼란스러워 할 수 있는 것일 것 같다.



간단한 프로그램을 실행하기 위해서 기존과 같은 방법으로 프로그래을 실행해 보려 했지만 어떻게 하는지 찾을 수가 없었다. 그래서 Win + R 키로 그림판(mspaint)를 실행하였다.





크게 달라진 것이 없어 보였다. Windows 8의 시작 버튼이 기존의 시작 버튼과 달라 아마도 Windows 8이 발표되는 시점까지 이대로 유지 하게되면 기존 방식의 시작 프로그램이나 새로운 Launcher가 개발될 것 같다.



한글이 되는지 궁금하여 메모장을 실행 시키고 한글을 입력해 보니 잘 되었다. 폰트 설정에 보니 맑은 고딕이 이미 포함되어 있었다. 아무래도 모바일 장치쪽에 별다른 추가 설치 없이 사용할 수 있도록 다양한 폰트를 기본 탑재한게 아닌가 생각 된다.

Windows 8 메모장

Windows 8 메모장





시작 버튼의 좌측 하단의 코너로 마우스를 이동하면 아래와 같은 화면이 나온다.

Windows 8 시작 메뉴

Windows 8 시작 메뉴



Settings 메뉴는 아래 화면을 볼 수 있으며 네트웍이나 볼륨을 설정할 수 있다. 기존 Windows 7 의 Tray에 종료 기능이 추가된 것 처럼 보인다.

Windows 8 Settings

Windows 8 Settings

 

Devices 와 Share 는 눈에 띄는게 없었고 Search 에는 아래 화면 처럼 검색 기능을 제공하고 있다.

Windows 8 Search

Windows 8 Search

 

Search 메뉴의 Apps 메뉴에서 현재 시스템에 설치되어 있는 프로그램 리스트를 볼 수 있다.

Windows 8 Apps

Windows 8 Apps



 









 

대충 살표 보고 로그오프를 하였다. 로그오프는 시작화면의 계정을 클릭하면 나오는 메뉴에 있다.

Windows 8 Log Off

Windows 8 Log Off

 

로그 오프를 하면 대기 화면이 보여지고 이 대기 화면을 위쪽으로 드래그 하면 로그인 화면이 보여진다. 하지만 대기 화면에서 위쪽으로 드래그 하라는 표시가 없어 처음에는 좀 당황 하였다.

 



 일단 Desktop 만 살짝 들여다 보았는데 시작 버튼의 기능 때문에 당황 스러운 것 외에는 Windows 7과 크게 달라 보이지 않았다. 좀 더 프로그램을 설치하고 여러 기능을 사용해 보아야 겠지만 초기 설치는 가벼운 느낌은 들었다. 아직 Preview라서 안정성을 거론은 이른 것 같다.



다음에는 모바일에서 사용할 UI를 들여봐야 겠다.&

Original Post : http://neodreamer-dev.tistory.com/573

Windows 8 설치하기

Windows 8 시작 화면

Windows 8 시작 화면



어제 발표된 Windows 8이 궁금하여 설치하여 보기로 했다.

가상 PC 프로그램으로는 Virtual Box 만을 사용하고 있어 Virtual Box에 시도를 하였다. 인터넷에 보니 Virtual Box와 Parallels 에 설치가 가능 하다 한다. VMware 와 Virtual PC 에는 설치가 되지 않는다고 한다.(최근 발표한 VMWare 8 에서는 가능 하다고 함.)



Virtual Box의 운영체제 종류는 Other Windows로 설정을 하고 Windows 8을 설치하였다.

Windows 8 이 Windows 7 보다 가볍다고 하여 메모리를 1GB로 설정하고 HDD는 40GB로 설정을 하였다. 설치에 사용된 이미지는 32비트 Windows 8 이다.







설치 과정은 Windows 7 과 크게 다르지 않았다.













Windows 7과 다른 과정은 설치 마지막 즈음에 PC 설정과 계정 생성 화면 정도이다.

 
<

Original Post : http://neodreamer-dev.tistory.com/572

2011/09/14

MS Windows 8 공개!!

MS에서 태블릿과 PC에서 사용할 수 있는 Windows 8 버전을 공개하였다.

이번 버전은 Developer Preview 버전으로 누구나 다운 받아서 사용해 볼 수 있다.


Windows 8 화면

Windows 8 화면 [출처:Preview Guide]

Windows 8 화면 [출처:Preview Guide]




Windows 8 Desktop 화면

Windows 8 Desktop 화면 [출처: Preview Guide]





Welcome to Windows 8 – The Developer Preview

Windows 8 Developer Preview Guide


Windows Developer Preview downloads
&

Original Post : http://neodreamer-dev.tistory.com/571