1

前言:我正在编写一套程序,用于从共享驱动器中检索文件,将它们转换为数据库中的几个表,使用户能够对数据库中的记录执行 CRUD 操作(通过 MVC4 ASP.NET Web 应用程序),以及然后将数据库中的记录重新组合为相同的文件格式,并将文件通过 FTP 传输回大型机。这些文件代表从大型机 VSAM 文件中提取的数据,我无法控制格式。还有其他类似徒劳的项目即将出现——检索、翻译、编辑、组装和上传大型机提取文件。一切都完成了,但是我编写代码来组装文件的方式是不可重用的,并且仅特定于当前项目域模型中的实体对象。

机会:因为其他即将进行的项目的文件中的数据格式非常相似,所以我也希望有一些可重复使用的代码来重新组装这些文件。

数据:下面代表一些模拟的文件数据。文件中的每一行文本(我现在称之为记录)可以是特定长度(在这种情况下为 80 个字节)。记录可以是带有星号前缀的注释。未注释的记录可以是 4 种不同的类型。

  • 线
  • 序列预告片
  • 表拖车
  • 表格类型预告片

“行”属于“序列”(序列号 - 仅对表唯一)。一个“序列”属于一个“表”(表键 - 对文件来说是唯一的)。“表”有一个类型,表按它们在文件中的类型和键排序。

该线路按顺序排列如下:

  1. 三位数的商业代码。
  2. 三字符表类型。
  3. 五字符表键。
  4. 九位序列号。左填充零。
  5. 六位数的行号。左填充零。
  6. 三字符动作代码。
  7. 一个字符包括。代码。
  8. 五位数值长度。
  9. 休息是价值观。

Sequence Trailer 的顺序如下:

  1. 三位数的商业代码。
  2. 三字符表类型。
  3. 五字符表键。
  4. 九位序列号。左填充零。
  5. 五位数填充符('9')。
  6. 序列中的九位数行数(左填充零)。

Table Trailer 有以下顺序:

  1. 三位数的商业代码。
  2. 三字符表类型。
  3. 五字符表键。
  4. 十四位数字填充符('9')。
  5. 表中序列的九位数计数(左填充零)。

表格预告片按顺序排列如下:

  1. 三位数的商业代码。
  2. 三字符表类型。
  3. 十九位填充符 ('9')。
  4. 文件中表格的九位数计数(具有#2 表格类型)。(左填充零)。

表尾出现在文件中每个有序表集之后。

****************************************************** ************************
* 表 00001 - 更多评论
* 04/04/11 创建表
****************************************************** ************************
* 对 SEQ 1 的评论
720PFT0000100000001000001PROI00011E1037-E1039
720PFT0000100000001000002PGMI000016
720PFT0000100000001000003RTN 00004 NAC
720PFT0000100000001099999000000003
* 对 SEQ 2 的评论
720PFT0000100000003000001PROI00011E1037-E1039
720PFT0000100000003000002CLSI000037,8
720PFT0000100000003000003MEDE000010
720PFT0000100000003000004RTN 00004 NAC
720PFT0000100000003099999000000004
720PFT0000199999999999999000000002
720PFT9999999999999999999000000001

代码:以下代表领域模型中的实体(为简洁起见,我排除了相关实体):

[Table("Line",Schema="Pft")]
public class Line
{
    #region Entity Properties

    [Key]
    public int LineId { get; set; }

    [Required]
    public short LineNumber { get; set; }

    [StringLength(255)]
    public string Comment { get; set; }

    [Required]
    public int SequenceId { get; set; }

    [Required]
    public int IncludeExcludeId { get; set; }

    [Required]
    public int QualifierId { get; set; }

    [Required]
    [ForeignKey("PlanFlexTable")]
    public int PlanFlexTableId { get; set; }

    #endregion
}

[Table("Sequence", Schema="Pft")]
public class Sequence
{
    #region Entity Properties

    [Key]
    public int SequenceId { get; set; }

    [Required]
    public int SequenceNumber { get; set; }

    [StringLength(511)]
    public string Comment { get; set; }

    #endregion
}

[Table("PlanFlexTable", Schema = "Pft")]
public class PlanFlexTable
{
    #region Entity Properties

    [Key]
    public int PlanFlexTableId { get; set; }

    [Required]
    public int StatusId { get; set; }

    [StringLength(5, MinimumLength = 5)]
    [Required]
    public string Key { get; set; }

    [StringLength(255)]
    [Required(AllowEmptyStrings = true)]
    public string Title { get; set; }

    [Display(Name="Table Comment")]
    public string Comment { get; set; }

    public int PlanFlexTableTypeId { get; set; }

    public int UpdateHistoryId { get; set; }

    [StringLength(3)]
    [Required]
    public string PlanId { get; set; }

    #endregion
}

摘要:我正在寻求一种可重用的生成文件的方法的建议,就像我上面提到的那样。目前,我有一个类,它采用 PlanFlexTable 实体的 IEnumerable 并对其进行迭代以组装要上传的文件。我考虑过使用反射来创建一些属性以放在实体上以定义文件的构建方式;但是,我真的很感激关于其他可能性的更多反馈和想法。

谢谢!

4

1 回答 1

0

您想动态生成代码....试试 T4?您可以为您的实体类提供一个基本模板,其中包含模式要素(键控等),并根据 VSAM 文件填充类的其余部分(您将拥有一个可重用的解析器......)

考虑到(生成的)实体类和数据库表,您的 CRUD 工具的其余部分可能是可重用的?

于 2013-07-12T15:15:32.023 回答