2010-05-05 4 views
0

SqlAdapter.Fill()에 의해 DataTable에로드 될 때 값을 수정하는 것이 적절한 방법은 무엇입니까?SqlAdapter.Fill() 중에 값을 즉시 수정하십시오.

내 응용 프로그램의 로그 메시지를 세계화했습니다. 이벤트 유형 및 이벤트와 관련된 일련의 데이터를 나타내는 정수가 아래에 표시된대로 데이터베이스에 저장됩니다. DataGridView 컨트롤을 통해 기록 된 이벤트를 사용자에게 표시 할 때 데이터를 서식 지정 문자열로 보간합니다.

event_type event_timestamp  event_details 
============================================ 
3   2010-05-04 20:49:58 jsmith 
1   2010-05-04 20:50:42 jsmith 
... 

현재 DataTable의 행을 반복하여 메시지 서식을 지정하고 있습니다. 닮은 것 표시된

public class LogDataTable : DataTable 
{ 
    public LogDataTable() 
    { 
     Locale = CultureInfo.CurrentCulture; 
     Columns.AddRange(new DataColumn[] { 
      new DataColumn("event_type", typeof(Int32)), 
      new DataColumn("event_timestamp", typeof(DateTime)), 
      new DataColumn("event_details", typeof(String))}); 
    } 
} 

... 
using (SqlDataAdapter adapter = new SqlDataAdapter(...)) 
{ 
    adapter.SelectCommand.Parameters.AddRange(new Object[] { 
     ... 
    }); 
    adapter.Fill(table); 
} 
foreach (DataRow row in table.Rows) 
{ 
    switch ((LogEventType)row["event_type"]) 
    { 
     case LogEventType.Create: 
      row["event_details"] = String.Format(Resources.Strings.LogEventCreateMsg, row["event_details"]; 
      break; 
     case LogEventType.Create: 
      row["event_details"] = String.Format(Resources.Strings.LogEventCreateMsg, row["event_details"]; 
      break; 
     ... 

최종 결과 :

Type Date and Time  Details 
==================================================================== 
[icon] 2010-05-04 20:49:58 Failed login attempt with username jsmith 
[icon] 2010-05-04 20:50:42 Successful login with username jsmith 
... 

테이블이 교체를 수행하기 위해 다시 어댑터에 의해 작성되고로 한 번에 2 회, 결과 세트를 반복하는 낭비 보인다. 채워지는대로 LogDataTable 클래스에서 즉시 대체를 수행하고 싶습니다.

InRowChangingEventException을 throw하는 LogDataTable에서 OnRowChanging 메서드를 재정의하려고 시도했습니다.

protected override void OnRowChanging(DataRowChangeEventArgs e) 
{ 
    base.OnRowChanging(e); 
    switch ((LogEventType)row["event_type"]) 
    ... 

내가있는 StackOverflowException를 슬로우 OnRowChanged 방법, 오버라이드 (override) 시도 (나는 그것이 변화하는 가정합니다 방법 무한히를 다시 트리거?).

예외를 발생시키지 않지만 호출되지 않는 것으로 보이는 OnTableNewRow 메서드를 재정의하려고 시도했습니다. 사용자가 방지 한 뷰에 행을 추가 할 때만 가정합니다.

누구든지 저에게 줄 수있는 도움을 크게 주시면 감사하겠습니다.

답변

0

IMO, 현재 수행중인 작업이 정상입니다. 메모리 내 DataTable 항목은 IO 작업을 방해하기 때문에 성능이 저하 될 수 있으므로 즉시 변경하는 대신 채워진 항목을 매우 잘 변경할 수 있습니다.

반면에 DB 관리자라면 첫 번째 열을 더 잘 ETL 할 수 있습니다.

+0

감사합니다. 입출력 작업에 대한 흥미로운 점. adapter.Fill()이 완료되면 시작되는 이벤트가 있습니까? 그래도 코드를 LogDataTable 클래스로 옮기고 테이블이 채워진 후 반복되는 경우에도 보간을 원활하게 수행 할 수 있습니다. – Timothy

+0

작성한 후에 이벤트가 발생했는지 여부는 알 수 없습니다. 'adapter.Fill (table); 뒤에 메소드 호출 문을 삽입 할 때 실제로 어떤 문제점을 발견합니까? :) – Amsakanna

관련 문제