C# WinForm에서 DataGridView에 Oracle 데이터 바인딩 후 실시간 검색 기능 어떻게 구현하나요?

C# .NET Framework WinForm 앱에서 Oracle DB(예: SELECT * FROM events WHERE event_name LIKE '%공정%') 결과를 DataGridView에 바인딩하고 있어요.

TextBox에 입력할 때마다 실시간으로 필터링(검색)되게 하고 싶은데, Timer나 KeyUp 이벤트로 구현하려면 어떻게 해야 할까요?DataTable 사용 중MyBatis나 ADO.NET으로 쿼리성능 최적화 팁도 부탁드려요!

3개의 답변이 있어요!

  • 안녕하세요. 서종현 전문가입니다.

    WinForm 에서 Oracle DB 데이터를 DataGridView에 바인딩한 후 , TextBox입력시 실시간 검색은 다음과 같이 간단히 구현할수있습니다.

    • TextBox의 TextChange이벤트에 타이머를 연결해 입력이 멈춘후 300ms 뒤에 DB 쿼리 실행

    • 타이머 Tick 이벤트에서 Oracle에 LIKE 쿼리 실행후 DataTable에 결과 채워 DataGridView에 바인딩

    • 쿼리는 인덱스 활용과 파라미터 바인딩으로 최적화하고 , 데이터가 크면 꼭 DB에서 필터링 하기

    <예시코드>

    Timer timer = new Timer { Interval = 300 };

    timer.Tick += (s, e) => {

    timer.Stop();
    string keyword = textBox1.Text.Trim();
    string sql = "SELECT * FROM events WHERE event_name LIKE '%' || :kw || '%'";
    var cmd = new OracleCommand(sql, conn);
    cmd.Parameters.Add(new OracleParameter("kw", keyword));
    var dt = new DataTable();
    new OracleDataAdapter(cmd).Fill(dt);
    dataGridView1.DataSource = dt;

    };

    textBox1.TextChanged += (s, e) => timer.Start();

    필터링 때마다 DB에서 쿼리해 데이터가 많아도 성능 유지가 좋습니다.

  • 보통은 처음에 Oracle에서 데이터를 가져와 DataTable에 담고 DataGridView에 바인딩해 둔 다음, TextBox의 KeyUp 이벤트에서 DataView.RowFilter로 필터를 거는 방식이 많이 쓰입니다.
    예를 들어 dataView.RowFilter = "event_name LIKE '%" + textBox1.Text + "%'" 이런 식으로 입력할 때마다 필터를 바꾸면 비교적 간단하게 실시간 검색이 됩니다.
    데이터가 많다면 매번 DB를 다시 조회하기보다 메모리에서 필터하는 방식이 보통 더 빠른 편입니다.
    DB에서 직접 검색해야 할 정도로 데이터가 많다면 LIKE 조건 컬럼에 인덱스를 두는 것도 성능에 도움이 될 수 있습니다.
    또 너무 자주 쿼리가 실행되지 않게 Timer로 0.3~0.5초 정도 딜레이를 주는 방식도 실무에서 종종 사용합니다.

  • 안녕하세요. 조일현 전문가입니다.

    관련기능을 구현 하려면 KEY UP 이벤트와 DataGridView 로우 필터를 사용하는 것이 좋을 듯합니다.

    텍스트 박스에서 입력할 때 DataGridView 로우 필터로 필터링 합니다.

    또한 DB 부하를 줄이기 위해서 딜레이 30ms를 적용 할 수 있겠네요