Sql-based տվյալների աղբյուրի տողերի հավելյալ մշակում
Բովանդակություն
Ներածություն
Sql-based տվյալների աղբյուրի տողերի հավելյալ մշակման, ֆիլտրման և հաշվարկային սյուների արժեքների հաշվարկման համար կարող են օգտագործվել երկու մեթոդներ՝ ProcessRow և AfterDataReaderClose:
Երկու մեթոդները փոխարինում են 4X համակարգում նկարագրված OnEachRow և Valid իրադարձություններին:
ProcessRow
Մեթոդը կանչվում է MakeSqlCommand մեթոդում ձևավորված SQL հարցման կատարման ընթացքում, երբ հարցման տվյալները կարդացող SqlDataReader-ը դեռ բաց է:
Մեթոդը է վերադարձնում են bool տիպի արժեք, որը ցույց է տալիս թե ընթացիկ տողը պետք է ընդգրկվի տվյալների աղբյուրի տողերի վերջնական ցուցակում, թե ոչ։
Մեթոդում նախատեսված չէ կատարել sql հարցումներ կամ կանչել ասինխրոն ֆունկցիաներ։ Այլ հարկավոր է կա՛մ աշխատել ընթացիկ տողի հետ, կա՛մ reader-ի ընթացիկ տողի հետ։
Օրինակ 1
Այս օրինակում fSTATENAME string տիպի հաշվարկային սյան արժեքը որոշվում fSTATE short տիպի ոչ հաշվարկային սյան արժեքներից ելնելով:
protected override bool ProcessRow(DataSourceArgs<Param> args, DataRow row, SqlDataReader reader)
{
switch (row.fSTATE)
{
case 998:
row.fSTATENAME = "Մերժված";
break;
case 999:
row.fSTATENAME = "Հեռացված";
break;
default:
row.fSTATENAME = "Անհայտ";
break;
}
return true;
}
Օրինակ 2
Ներկայացված է տվյալների աղբյուրի տողերի ֆիլտրացիայի օրինակ՝ վերջնական տողերի ցուցակում ընդգրկվում են այն տողերը, որտեղ ստուգվում է տարիքը։
reader-ից տողերը կարդալը առավել արագացնելու համար կարելի է AfterExecuteSQLCommand մեթոդում ստանալ reader-ի մեջ հարկավոր դիրքերը։
private int ageOrdinal;
protected override void AfterExecuteSQLCommand(DataSourceArgs<Param> args, SqlDataReader reader)
{
this.ageOrdinal = reader.GetOrdinal("fAGE");
}
protected override bool ProcessRow(DataSourceArgs<Param> args, DataRow row, SqlDataReader reader)
{
if (args.Parameters.CheckAge && reader.GetInt32(this.ageOrdinal) < 18)
{
return false;
}
else
{
return true;
}
}
AfterDataReaderClose
AfterDataReaderClose-ը կանչվում է SQL հարցման կատարման ավարտից հետո, երբ SqlDataReader-ը արդեն փակ է: Մեթոդում թույլատրվում է կատարել այլ sql հարցումներ և կանչել ասինխրոն ֆունկցիաներ։
AfterDataReaderClose-ի աշխատանքի երկու տարբերակ կա կախված գերբեռնվող AfterDataReaderCloseMode հատկության արժեքից՝
- Ամեն տողի համար առանձին կանչ,
- Մեկ կանչ բոլոր տողերի մշակման համար։
Օրինակ 1
Այս օրինակում յուրաքանչյուր տողի համար բեռնվում է տողի fISN դաշտի արժեքով փաստաթուղթը և DOCARMCAPTION, DOCENGCAPTION string տիպի հաշվարկային սյուներին վերագրում բեռնված փաստաթղթի հայերեն և անգլերեն անվանումները։
public override CallMode AfterDataReaderCloseMode => CallMode.EachRowCall;
protected override async Task<bool> AfterDataReaderClose(DataSourceArgs<Param> args, DataRow row)
{
Document doc = await this.documentService.Load(row.fISN);
row.DOCARMCAPTION = doc.Description.ArmenianCaption;
row.DOCENGCAPTION = doc.Description.EnglishCaption;
return true;
}
Օրինակ 2
Այս օրինակում տողերի մի մասը ստացվում է այլ աղբյուրից, և դրանք ավելացվում են վերջնական տողերի ցուցակին։
public override CallMode AfterDataReaderCloseMode => CallMode.SingleCall;
protected override async Task AfterDataReaderClose(DataSourceArgs<Param> args, CancellationToken stoppingToken)
{
var otherRows = await GetRowsFromOtherSource(args, stoppingToken);
this.Rows.AddRange(otherRows);
}
private async Task<List<DataRow>> GetRowsFromOtherSource(DataSourceArgs<Param> args, CancellationToken stoppingToken)
{
//...
}