代理密钥生成器状态文件,有没有办法从另一种编程语言读取文件?

Surrogate Key Generator state file, is there a way to read file from another prog language?

美好的一天。我正在尝试找到一种方法来读取代理键状态文件以获取其当前值以及如何更改它。问题是数据库不断刷新,我需要一种机制,我可以从 table 中获取最大值,然后设置代理键状态文件。

据我所读,它不像数据集 (.ds) 文件,您可以在其中使用 DataStage Designer 工具来读取它。我尝试制作一个小型 C# 应用程序,它将其作为二进制文件读取。各种文章解释说它是一个无符号的 64 位整数。仍然当我尝试阅读它时,它给出了一组随机数字。它以 1 开头,然后以 999 结尾的数字,然后重复。我试着用位转换器 class 阅读它,但也没有运气。

到目前为止,我看到的唯一解决方案是创建一个并行或顺序作业,从数据库中获取最大数量,然后使用它创建代理键,如 http://it.toolbox.com/blogs/infosphere/datastage-8-tutorial-surrogate-key-state-files-17403 中所述。

我不是第一个尝试通过代码更改它的人,并且很好奇是否有某种方法可以做到这一点。

使用 DataStage 8.7 尝试使用 C# BinaryReader.ReadUInt64、BinaryReader.ReadInt64 和 BitConverter.ConvertToUInt64

2016-10-19更新: 部分答案是它可以作为二进制文件读取。它分为 4 组,每组 8 个字节。类似这样的东西(你可以用十六进制编辑器看到它。

01 00 00 00 00 00 00 00
00 00 00 00 00 00 00 05
00 00 00 00 00 00 00 08
00 00 00 00 00 00 00 08

第一组我觉得是增量数(+1、+5等)

第二组为初值

第三组是下一个要分配的号码

第四组我认为是要分配的批次的结尾。如果你做 10 x 10 个批次,那么第三个是 10 个,第四个是 20 个,或者这就是我认为它的工作方式。

因此,要通过代码读取它,您需要使用二进制文件 reader 读取它,并获取一组 8 个字节以转换为 UINT64。

问题仍然存在,因为我不确定他们的意思。

为什么您认为需要代理密钥生成器阶段? 另一种更简单的解决方案是使用 Transformaer 阶段进行编号,并使用顺序文件(或参数)对其进行初始化。新号码——在处理之后——然后可以写回数据库序列。所以你只需要处理平面文件,无需编程。

要在转换器(并行)中生成唯一数字,您必须考虑分区 - 这个公式可以做到

(@NUMPARTITIONS * ( @INROWNUM - 1)) +  @PARTITIONNUM + Max_Field1

所有这一切的原因是我正在寻找代理键状态文件中的错误。 因此,当您转到复杂的转换器(抱歉没有图片)时,您将转到属性并看到它有一个代理键选项卡。你有三个设置。一个是文件,一个是初始值,一个是块大小。

该文件是存储当前代理项密钥的位置。我将很快解释它是如何格式化的。 Initial value是你希望从哪个数字开始,block size是为你的transformer预留一组数字。

文件格式为16字节增量,第一个是当前数字。分配的数字是这个数字+1,第二个是块大小的末尾。当您不定义初始值或块大小时,它只会是 16 个字节。如果您定义这些,它将是 32 个字节。其中最后两个值是当前编号和块结束。

因此,当您有两个或更多转换器使用同一个文件时。它将在获取新块之前分配一个具有可用数字的块,并在需要时将文件大小增加 16 个字节。

那么是什么错误,当你不定义块大小而定义初始值时,系统块大小将在1000左右。假设您做了一个小示例,其中您所拥有的只是一个连接到以顺序文件结尾的转换器的行生成器。您只需要一行。执行多次,假设您的初始值为 200。它将是 200,201,203,204,(1),205。出于某种原因,它在 DataStage 8.7 中存在错误,当您未定义块大小时,它 returns 恢复为 1。

我希望关于该主题的这项研究会对某人有所帮助,因为我看了又看,但关于如何最好地使用代理键的内容并不多。

如果您希望错误发生得更快,只需删除文件并使用 C# 创建一个新文件,分配 4 个 UINT64 值并保存为 BYTES。前两个值 1,1,200,300。最终它会像我描述的那样。