相关疑难解决方法(0)

Binary(16)字段截断了Guid的尾随零

在C#中,我有一个byte[]名为UniqueId的字段。我将此字段存储为SQL Server数据库(EF6)中的Binary(16)。

我注意到有时,存储的guid是15个字节而不是16个字节。var guid = new Guid(uniqueId)从数据库中检索值后,这会导致以下异常:

System.ArgumentException:GUID的字节数组必须恰好是16个字节长。

在对此进行调查之后,我注意到,只要生成的guid在十六进制末尾包含“ 00”,SQL就会将其截断!

例:

生成的Guid(通过Guid.NewGuid): FF96F954777E8941A04774CD157C5C00(16字节)

在SQL Server中存储二进制(16):0xFF96F954777E8941A04774CD157C5C(15字节)

如果您注意到,00末尾的将被截断。结果,如果我查询此字段并尝试将其字节转换为Guid,则会得到一个System.ArgumentException

还有其他人遇到这个问题吗?解决方法是什么?我正在考虑一个包装器,Guid该包装器会一直生成向导,直到没有尾随零为止,但这似乎很hack。

更新1:由于你们的要求,我运行了SQL事件探查器,这是由EF(节略版)生成的SQL:

exec sp_executesql N'INSERT [dbo].[customers]([UniqueId])
VALUES (@0)',N'@0 varbinary(max)',@0=0xFF96F954777E8941A04774CD157C5C00
Run Code Online (Sandbox Code Playgroud)

c# sql sql-server entity-framework guid

3
推荐指数
1
解决办法
112
查看次数

标签 统计

c# ×1

entity-framework ×1

guid ×1

sql ×1

sql-server ×1