본문 바로가기

C# WPF

[C# WPF] ACCESS DB를 사용한 전화번호 검색 프로그램

DB를 사용하여 뭔가 쓸만한 프로그램을 만들어 보려다가... 학교 전화번호부를 만들어보기로 했습니다. 구내 전화번호 찾는 경우가 많거든요. 프로그램은 다음과 같은 UI를 갖습니다.

 

대학 캠퍼스가 두 곳이라 전화번호부가 두개로 나뉘어 있습니다. 검색도 두 캠퍼스를 나누어 하도록 만들었습니다.

 

ACCESS DB를 사용하며 두개 테이블의 필드는 다음과 같습니다. 이름, 부서명, 직급명, 전화번호 등으로 검색이 가능하도록 하겠습니다.

 

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

<Window x:Class="phoneBook.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="건양대학교 전화번호부(2014.5)" Height="270" Width="487"  ResizeMode="NoResize" Background="#FFDDE7F3">
    <Grid Margin="0,0,0,-4">
        <TextBox Name="txtNonsan" HorizontalAlignment="Left" Height="23" Margin="39,40,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" KeyDown="txtNonsan_KeyDown"/>
        <TextBox Name="txtDaejon" HorizontalAlignment="Left" Height="23" Margin="244,41,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" KeyDown="txtDaejon_KeyDown"/>
        <TextBlock HorizontalAlignment="Left" Margin="39,19,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Text="논산캠퍼스" Width="62"/>
        <TextBlock HorizontalAlignment="Left" Margin="244,20,0,0" TextWrapping="Wrap" Text="대전캠퍼스(세종,계룡)" VerticalAlignment="Top" Width="122"/>
        <Button x:Name="btnNonsan" Content="검색" HorizontalAlignment="Left" Margin="168,40,0,0" VerticalAlignment="Top" Width="64" Click="btnNonsan_Click"/>
        <Button x:Name="btnDaejon" Content="검색" HorizontalAlignment="Left" Margin="369,41,0,0" VerticalAlignment="Top" Width="61" Click="btnDaejon_Click"/>
        <ListBox Name="lbNonsan" HorizontalAlignment="Left" Height="126" Margin="39,68,0,0" VerticalAlignment="Top" Width="391"/>
        <Label Content="※ 성명, 부서명, 직급명, 전화번호 등으로 검색하실 수 있습니다" HorizontalAlignment="Left" Margin="39,199,0,0" VerticalAlignment="Top"/>

    </Grid>
</Window>

C# 소스파일을 설명하지요.

우선 OleDb를 사용하기 위해 다음을 추가합니다.

using System.Data.OleDb;

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

connstr을 보면 전화번호부 DB는 실행파일과 같은 폴더에 있어야 합니다. 파일이름은 전화번호부.accdb 입니다.

sql 문에 like '%{0}%' 를 썼기 때문에 입력한 문자열이 매칭되는 모든 레코드를 출력하게 됩니다. 예를 들어 텍스트박스에 "강"이라고 치고 검색을 하면 "강"이 들어간 모든 레코드가 출력되겠지요. 성명, 부서명, 직급명, 연락처를 검색할 수 있습니다.

namespace phoneBook
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        OleDbConnection conn = null;
        OleDbCommand cmd = null;
        OleDbDataReader reader = null;
        string connstr = null;

        public MainWindow()
        {
            InitializeComponent();
            DbConnect();
        }

        private void DbConnect()
        {
            connstr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=./전화번호부.accdb";
        }

        private void btnNonsan_Click(object sender, RoutedEventArgs e)
        {
            if (txtNonsan == null)
                return;

            string sql = string.Format("SELECT * FROM 논산본부 WHERE 성명 like '%{0}%' OR 부서명 like '%{0}%' OR 직급명 like '%{0}%' OR 연락처 like '%{0}%'", txtNonsan.Text);

            conn = new OleDbConnection(connstr);
            try
            {
                conn.Open();
                cmd = new OleDbCommand(sql, conn);
            }
            catch (Exception ex)
            {
                MessageBox.Show("DB 파일이 없습니다.\n전화번호부 파일이 같은 위치에 있어야 합니다\n"
                    +ex.Message+"\nbikang@konyang.ac.kr로 연락주세요", "에러: DB 없음");
                return;
            }

            try
            {
                reader = cmd.ExecuteReader();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            lbNonsan.Items.Clear();

            while (reader.Read())
            {
                string item = "";
                item += reader["내선번호"].ToString() + " ";
                item += reader["성명"].ToString() + " ";
                item += reader["부서명"].ToString() + " ";
                item += reader["직급명"].ToString() + " ";
                item += reader["연락처"].ToString() + " ";
                item += reader["비고"].ToString() + " ";
                lbNonsan.Items.Add(item);
            }

            reader.Close();
            conn.Close();

        }

        private void btnDaejon_Click(object sender, RoutedEventArgs e)
        {
            if (txtDaejon == null)
                return;
            string sql = string.Format("SELECT * FROM 대전세종계룡캠퍼스 WHERE 성명 like '%{0}%' OR 부서명 like '%{0}%' OR 직급명 like '%{0}%' OR 연락처 like '%{0}%'", txtDaejon.Text);

            conn = new OleDbConnection(connstr);
            conn.Open();
            cmd = new OleDbCommand(sql, conn);

            try
            {
                reader = cmd.ExecuteReader();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            lbNonsan.Items.Clear();

            while (reader.Read())
            {
                string item = "";
                item += reader["내선번호"].ToString() + " ";
                item += reader["성명"].ToString() + " ";
                item += reader["부서명"].ToString() + " ";
                item += reader["직급명"].ToString() + " ";
                item += reader["연락처"].ToString() + " ";
                item += reader["비고"].ToString() + " ";
                lbNonsan.Items.Add(item);
            }

            reader.Close();
            conn.Close();
        }

        private void txtNonsan_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key != Key.Enter)
                return;
            TextBox box = sender as TextBox;
            if (string.IsNullOrEmpty(box.Text))
                return;
            btnNonsan_Click(sender, e);
        }

        private void txtDaejon_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key != Key.Enter)
                return;
            TextBox box = sender as TextBox;
            if (string.IsNullOrEmpty(box.Text))
                return;
            btnDaejon_Click(sender, e);
        }
    }
}

 

프로그램에 보면 icon을 사용했는데요... 이건 프로젝트의 속성 페이지를 열어서 다음과 같이 아이콘을 바꾸어 주면 됩니다.

 

 

BeeEye Dmu