GUID的字节数组长度必须正好为16字节- Devart - Oracle

gj3fmq9x  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(427)

当我在oracle数据库中插入一个Guid值时遇到问题(raw(16)字段)。我在C#应用程序中使用Devart库来记录记录。这个错误是随机发生的,因为我使用Guid.NewGuid()生成将记录在表中的值。我能够通过一个测试项目模拟导致问题的Guid值,我想知道我是否可以创建一个验证方法来评估Guid.NewGuid生成的guid值在记录在Oracle数据库中时是否表示有效值。以下是用于模拟问题的测试项目以及数据库中记录的无效值的证据:
测试代码:

[TestMethod]
public void RegraNegocio_GerarGuids2()
{
    int id;
    CanalVenda canalVenda = null;
    CanalVenda canalVenda2 = null;

    try
    {
    canalVenda = CanalVenda.New();
    canalVenda.RowGuid = Guid.Parse("d8a5feff-51da-4101-9889-77bec5339077");
    canalVenda.Nome = $@"Teste Guid {canalVenda.RowGuid.ToString()}";
    id = canalVenda.Save().Id;
    canalVenda2 = CanalVenda.Get(id);
    }
    catch (Exception e)
    {
    throw new Exception($@"Guid: {canalVenda.RowGuid} - Erro: {e.Message}");
    }
}

数据库中记录的值:
enter image description here
注意:在写入数据库之前,guid变量的值被转换为字节数组,以与raw(16)字段兼容。

Guid guidValue = (Guid)value;
value = guidValue.ToByteArray();

在C#中,我们尝试使用length属性来找出无效的guid大小是否与有效的guid不同,但我们没有成功。

7gcisfzg

7gcisfzg1#

根据定义,GUID的长度为16个字节。不长也不短。这不太可能是错误的来源。
如果有任何问题,最有可能是在数据库的接口层。您确定对象转换部分按预期工作吗?序列化数组的一种常见方法是添加长度作为前缀,您确定ORM没有这样做吗?
Oracle似乎没有原生的GUID/UUID数据类型,这让我有点震惊,因为这可能会让事情变得更容易。
请注意,字节顺序可能与您期望的不匹配:1 2.但是只要你使用.net方法在字节数组和GUID之间进行转换,这就不重要了。new Guid(myGuid.ToByteArray())应始终生成原始值。
我将从等式中删除GUID,只向数据库中添加一些16字节的数组,并验证是否返回相同的值。我会用全零、全byte.MaxValue和随机值进行测试。

相关问题