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