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 메서드를 재정의하려고 시도했습니다. 사용자가 방지 한 뷰에 행을 추가 할 때만 가정합니다.
누구든지 저에게 줄 수있는 도움을 크게 주시면 감사하겠습니다.
감사합니다. 입출력 작업에 대한 흥미로운 점. adapter.Fill()이 완료되면 시작되는 이벤트가 있습니까? 그래도 코드를 LogDataTable 클래스로 옮기고 테이블이 채워진 후 반복되는 경우에도 보간을 원활하게 수행 할 수 있습니다. – Timothy
작성한 후에 이벤트가 발생했는지 여부는 알 수 없습니다. 'adapter.Fill (table); 뒤에 메소드 호출 문을 삽입 할 때 실제로 어떤 문제점을 발견합니까? :) – Amsakanna