(DataSource) Տվյալների աղբյուր ձեռնարկ
Բովանդակություն
- Ներածություն
- Տվյալների աղբյուրի նկարագրման համար անհրաժեշտ ընդհանուր քայլեր
- Sql-based տվյալների աղբյուրի նկարագրման ձեռնարկ
- Array-based տվյալների աղբյուրի նկարագրման ձեռնարկ
Ներածություն
Տվյալների պահոցից աղյուսակային տեսքով տվյալներ կարդալու և ցույց տալու համար նկարագրվում է տվյալների աղբյուր։
Տվյալների աղբյուրը ըստ տվյալների բեռնման աղբյուրի լինում է 2 տեսակի՝
- sql-based (տվյալները ստացվում են տվյալների բազայից՝ sql հարցման միջոցով),
- array-based (տվյալները ստացվում են այլ աղբյուրներից և ավելացվում տվյալների աղբյուրի տողերի զանգվածին):
Տեսակը որոշվում է տվյալների աղբյուրը նկարագրող դասի IsSQLBased հատկության միջոցով, որի լռությամբ արժեքը true է։
8X-ում տվյալների աղբյուրի նկարագրության համար հարկավոր է ունենալ DATA նկարագրություն .as
ֆայլում, սահմանել պարամետրերի և տողերի դասերը, սահմանել կառուցվածքի սխեման և իրականացնել հաշվարկները C# դասում (.cs
ֆայլում)։
Պարամետրերի և տողերի դասերի սահմանումը ինչպես նաև կառուցվածքի սխեմայի սահմանումը կարող է ավտոմատացվել CodeGen գործիքի միջոցով, եթե DATA նկարագրությունը սահմանված է 4X գործիքներով, և պարունակում է պարամետրերի և սյուների նկարագրությունները, ինչը պարտադիր չէ։
Արդյունքում կունենանք կա՛մ 2 ֆայլ, եթե C# դասը ստեղծվում է ձեռքով
- definition.as
- definition.cs
կա՛մ 4 ֆայլ, եթե մասնակի ավոտմատացվում է C# դասի ստեղծումը
- definition.as
- definition.cs
- definition.CodeGen.tt
- definition.CodeGen.cs
Ստորև նկարագրված է քայլերը երկու ֆայլի համար են։
Տվյալների աղբյուրի նկարագրման համար անհրաժեշտ ընդհանուր քայլեր
.as ընդլայնմամբ ֆայլի սահմանում
- Ստեղծել .as ընդլայնմամբ ֆայլ՝ ավելացնելով DATA տիպի նկարագրություն, որը պարունակում է տվյալների աղբյուրի՝
- NAME - ներքին անվանումը,
- CAPTION - հայերեն անվանումը ANSI կոդավորմամբ,
- ECAPTION - անգլերեն անվանումը,
- PROCESSINGMODE - կատարման ռեժիմը։
DATA { NAME = TreeNode; CAPTION = "Ծառի հանգույցներ"; ECAPTION = "Tree Nodes"; PROCESSINGMODE = 1; }
C# դասի սահմանում
Օժանդակ դասերի սահմանում
Ստորև նկարագրված դասերը ավտոմատ կարող են ձևավորվել CodeGen գործիքով։
Ստորև նկարագրված դասերը որպես կանոն սահմանվում են Տվյալների աղբյուրի ստեղծվող դասի ներքին դասեր։
-
Ստեղծել տվյալների աղբյուրի սյուները նկարագրող դաս՝ որպես հատկություններ ավելացնելով սյուները, որը պարտադիր պետք է իրականացնի
IExtendableRow
ինտերֆեյսը։public class DataRow : IExtendableRow { public string Code { get; set; } public string Name { get; set; } public object Extend { get; set; } }
- Ստեղծել տվյալների աղբյուրի պարամետրերը նկարագրող դաս՝ որպես հատկություններ ավելացնելով պարամետրերը։
public class Param { public string TreeId { get; set; } public string NodeType { get; set; } }
-
Հայտատարել դաս, որը ունի տվյալների աղբյուրի ներքին անունը պարունակող
DataSource
ատրիբուտը և ժառանգում էDataSource<R, P>
դասը՝ որպեսR
փոխանցելով տվյալների աղբյուրի տողը նկարագրող դասը, իսկ որպեսP
՝ պարամետրերը նկարագրող դասը։ Եթե տվյալների աղբյուրը չի պարունակում պարամետրեր, ապա որպեսP
անհրաժեշտ է փոխանցելNoParam
դասը։[DataSource("TreeNode")] public class TreeNode : DataSource<TreeNode.DataRow, TreeNode.Param>
Կոնստրուկտորի ձևավորում
Ստորև նկարագրված կոնստրուկտորը և սխեման կարող են ձևավորվել CodeGen գործիքով։
-
Ձևավորել տվյալների աղբյուրի կոնստրուկտորը՝
IServiceProvider
տիպի պարտադիր պարամետրով, որը պիտի կանչի բազայինDataSource<R, P>
դասի կոնստրուկտորը և փոխանցիIServiceProvider
տիպի պարամետրը: Կոնստուկտորում անհրաժեշտ է ինյեկցիա անել աշխատանքի համար անհրաժեշտ սերվիսները։private readonly IDBService dbService; public TreeNode(IDBService dbService, IServiceProvider serviceProvider) : base(serviceProvider) { this.dbService = dbService; //... }
- Կոնստրուկտորում ավելացնել տվյալների աղբյուրի սխեման, որը նախատեսված է տվյալների աղբյուրի սյուների ու պարամետրերի հատկությունները պահման համար։
Դա անելու համար անհրաժեշտ է բազային դասի Schema հատկությանը վերագրել Schema տիպի նոր օբյեկտ՝ կոնստրուկտորին փոխանցելով հետևյալ պարամետրերը՝
name
- Սխեմայի ներքին անունը։armenianCaption
- Սխեմայի հայերեն անվանումը ANSI կոդավորմամբ։englishCaption
- Սխեմայի անգլերեն անվանումը։rowType
- Տվյալների աղբյուրի տողը նկարագրող դասի տիպը։paramType
- Տվյալների աղբյուրի պարամետրերը նկարագրող դասի տիպը:
this.Schema = new Schema(this.Name, "Ծառի հանգույցներ".ToArmenianANSI(), "Tree nodes", typeof(DataRow), typeof(Param));
- Սխեմայում ավելացնել տվյալների աղբյուրի սյուների հատկությունները Schema դասի AddColumn մեթոդի միջոցով` փոխանցելով հետևյալ պարամետրերը՝
name
- Սյան ներքին անունը, որի պետք է համընկնի սյուները նկարագրող դասում ավելացված համապատասխան սյան անվան հետ:source
- SQL-ից կարդացվող սյան անունը:armenianCaption
- Սյան հայերեն անվանումը ANSI կոդավորմամբ։englishCaption
- Սյան անգլերեն անվանումը։columnType
- Սյան համակարգային տիպը։
this.Schema.AddColumn(nameof(DataRow.Code), "Code", "Կոդ".ToArmenianANSI(), "Code", FieldTypeProvider.GetStringFieldType(20)); this.Schema.AddColumn(nameof(DataRow.Name), "Name", "Անվանում".ToArmenianANSI(), "Name", FieldTypeProvider.GetStringFieldType(50));
- Սխեմայում ավելացնել պարամետրերի հատկությունները Schema դասի AddParam մեթոդի միջոցով` փոխանցելով հետևյալ պարամետրերը՝
name
- Պարամետրի ներքին անունը, որի պետք է համընկնի պարամետրերը նկարագրող դասում ավելացված համապատասխան պարամետրի անվան հետ:description
- Պարամետրի հայերեն անվանումը ANSI կոդավորմամբ։eDescription
- Պարամետրի անգլերեն անվանումը։columnType
- Պարամետրի համակարգային տիպը։
this.Schema.AddParam(nameof(Param.TreeId), "Ծառի իդենտիֆիկատոր".ToArmenianANSI(), FieldTypeProvider.GetStringFieldType(4), eDescription: "TreeId"); this.Schema.AddParam(nameof(Param.NodeType), "Ծառի հանգույցներ".ToArmenianANSI(), FieldTypeProvider.GetStringFieldType(1), eDescription: "Tree nodes");
Sql-based տվյալների աղբյուրի նկարագրման ձեռնարկ
Ամբողջական կոդը դիտելու համար տե՛ս:
Sql հարցման ձևավորում
Վերևում նշված ընդհանուր քայլերից կատարումից հետո անհրաժեշտ է override անել MakeSQLCommand մեթոդը։
MakeSQLCommand մեթոդում անհրաժեշտ է ստեղծել և վերադարձնել SqlCommand դասի օբյեկտ՝ IDBService դասի CreateCommand մեթոդի միջոցով։
Այստեղ հարկավոր է ձևավորել sql հարցման տեքստը հաշվի առնելով նաև փոխանցված պարամետրերի արժեքները։
protected override Task<SqlCommand> MakeSQLCommand(DataSourceArgs<Param> args, CancellationToken stoppingToken)
{
var cmd = this.dbService.CreateCommand();
cmd.CommandText = $@"SELECT fCODE AS Code, fNAME AS [Name]
FROM TREES
WHERE t.fTREEID = @TreeId";
cmd.Parameters.Add("@TreeId", SqlDbType.Char, 8).Value = args.Parameters.TreeId;
if (!string.IsNullOrWhiteSpace(args.Parameters.NodeType))
{
cmd.CommandText += " AND fLEAF = @NodeType";
cmd.Parameters.Add("@NodeType", SqlDbType.Char, 1).Value = args.Parameters.NodeType;
}
cmd.CommandText += "\n ORDER BY Code";
return Task.FromResult(cmd);
}
Տողերի լրացուցիչ մշակում
Sql հարցման կատարումից բացի հնարավոր է նաև լրացուցիչ մշակում կատարել ստացված արդյունքի։ Տե՛ս Sql-based տվյալների աղբյուրի տողերի հավելյալ մշակում:
Array-based տվյալների աղբյուրի նկարագրման ձեռնարկ
Ամբողջական կոդը դիտելու համար տե՛ս:
Տվյալների ձևավորում
Վերևում նշված ընդհանուր քայլերից կատարումից հետո անհրաժեշտ է override անել IsSQLBased հատկությունը՝ վերադարձնելով false արժեք և FillData մեթոդը՝ տվյալները ձևավորելու համար։
FillData մեթոդում անհրաժեշտ է ստեղծել տվյալների աղբյուրի սյուները նկարագրող դասի օբյեկտներ, լրացնել սյուների արժեքները և ստեղծված տողերը ավելացնել տվյալների աղբյուրի Rows տողերի ցուցակին։
public override bool IsSQLBased => false;
protected override async Task FillData(DataSourceArgs<Param> args, CancellationToken stoppingToken)
{
string treeId = args.Parameters.TreeId;
if (!string.IsNullOrWhiteSpace(treeId))
{
var treeNodes = await this.treeElementService.GetTreeElements(treeId, args.Parameters.NodeType);
foreach (var (code, treeNode) in treeNodes)
{
var row = new DataRow
{
Code = treeNode.Key,
Name = treeNode.Comment
};
this.Rows.Add(row);
}
}
}