본문 바로가기

C# WPF

[C# WPF] 우편번호 찾기 DB 프로그램(Access DB 사용)

인터넷 사이트에서 회원가입을 할 때 우편번호를 찾는 경우가 많이 있습니다. 동이름을 쓰면 우편번호를 찾아서 입력해주는 방식이죠. 이와 비슷한 프로그램을 C# 으로 만들어보겠습니다. Database 프로그램의 가장 기초입니다. 사용할 DB는 MS Access입니다.

우선 우편번호DB를 구합니다.

우편번호는  http://www.zipfinder.co.kr/ 사이트에서 구할 수 있습니다.

이 사이트에서는 데이타베이스용 우편번호 파일을 필드의 구성에 따라 5종류로 제공하고 있으며, 필요한 파일을 다운로드하고 엑셀, 엑세스 등에서 읽어들여 활용할 수 있습니다. (제공하는 DB파일은 탭으로 분리한 TXT파일입니다)

압축을 풀고. ACCESS 에서 읽기->텍스트파일->"파일명.txt" 하여  다음 그림과 같은 순서로 파일을 읽어들입니다.

 

 

 

 

테이블명을 Zip으로 바꾸겠습니다. 파일이름은 zipcode로 바꾸어 저장하겠습니다. 이제 DBFiles 폴더에 zipcode.accdb 라는 파일이 생겼습니다.

 

 

VS에서 새로운 프로젝트를 하나 만듭니다. 나는 zipCode라는 프로젝트를 만들었습니다.

디자인은 다음과 같이 만들고자 합니다.

 

 

xaml 파일은 다음과 같습니다.

<Window x:Class="zipCode.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="우편번호찾기" SizeToContent="WidthAndHeight">

    <Grid Background="LightSteelBlue">

        <StackPanel>

            <StackPanel Orientation="Horizontal">

                <Label Name="lbl" Margin="10" VerticalAlignment="Center"

     HorizontalAlignment="Center">읍면동 : </Label>

                <TextBox Name="txtDong" Width="230" Margin="10"/>

            </StackPanel>

            <TextBox Name="txtAddr" Width="300" Margin="10"/>

            <ListBox Name="lbZip" Width="300" Height="300" Margin="10"/>

<Button Name="Close" Margin="10" Height="25" Click="Close_Click">DB Close / Quit</Button>

        </StackPanel>

    </Grid>

</Window>

 

프로그램의 동작은 다음과 같이 정의하지요.

- 먼저 txtDong 에 읍면동 이름을 쓰고 <Enter>를 치면, DB의 DONG 필드에서 이름을 찾아 리스트박스(lbZip)에 출력하도록 하겠습니다.

- liZip에 표시된 주소를 더블클릭하면 그 주소가 중간에 있는 txtAddr 텍스트 상자에 보이도록 합니다.

소스코드는 다음과 같습니다.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Data.OleDb;    //  .NET Framework Data Provider for OLE DB
namespace zipCode
{
    public partial class MainWindow : Window
    {
        OleDbConnection con = new OleDbConnection();
        OleDbCommand com = new OleDbCommand();
        OleDbDataReader reader = null;

        public MainWindow()
        {
            InitializeComponent();

           //  이벤트 등록

            txtDong.KeyDown += txtDong_KeyDown;
            lbZip.MouseDoubleClick += lbZip_MouseDoubleClick;

// 솔루션 폴더에 DBFiles라는 폴더를 만들고 그 안에 zipcode.accdb 파일을 둡니다 

            string connStr = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" +
                    "../../../DBFiles/zipcode.accdb; Persist Security Info=False";
            con.ConnectionString = connStr;

            try
            {
                con.Open();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            com.Connection = con;
        }
        void txtDong_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key != Key.Enter)
                return;
            TextBox box = sender as TextBox;
            if (string.IsNullOrEmpty(box.Text))
                return;

            string sql = string.Format("select * from ZIP where DONG like '{0}%' OR RI like '{0}%'" +
                            "order by SIDO, GUGUN, DONG, RI, BUNJI", box.Text);
            com.CommandText = sql;
            try
            {
                reader = com.ExecuteReader();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            lbZip.Items.Clear();

            while (reader.Read())
            {
                string item = "";
                item += reader["ZIPCODE"].ToString() + " ";
                item += reader["SIDO"].ToString() + " ";
                item += reader["GUGUN"].ToString() + " ";
                item += reader["DONG"].ToString() + " ";
                item += reader["RI"].ToString() + " ";
                item += reader["BUNJI"].ToString() + " "; 
                lbZip.Items.Add(item);
            }
            reader.Close();
        } 
        void lbZip_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            ListBox lb = sender as ListBox;
            txtAddr.Text = lb.SelectedItem.ToString();
        }

        private void Close_Click(object sender, RoutedEventArgs e)
        {
            if (con != null)
                con.Close();
            this.Close();
        }
    }
}

 

DB 응용프로그램을 만들 때는 반드시 프로그램 종료 전에 DB와 연결된 con을 닫고 종료하여야 합니다. 그렇지 않으면 DB가 열려있는 상태로 방치될 수 있습니다. 따라서 "DB Close / Quit" Button이 클릭되었을 때 DB와의 연결을 끊어주는 이벤트 함수 Close_Click()를 넣어주어야 합니다.

여기서 con.Close()는 DB와의 연결을 닫아주는 것이고, this.Close()는 윈도우를 닫아주는 것입니다.

 

 

BeeEye Dmu