我将json字符串发布到我的方法,并在反序列化到我的类时收到错误。
错误:
将值-1转换为类型' System.Nullable`1 [System.UInt64]'时出错。 Path' MyMappings 1。MySqlColumns [7] .size'。内在例外:{"价值 对于UInt64来说太大或太小。"}
下面是我要在反序列化json值后输出的类:
public class MyMappings
{
public string Name { get; set; }
public List<MysqlColumns> MySqlColumns { get; set; }
}
public class MySqlColumns
{
public string Column { get; set; }
public string Datatype { get; set; }
public string IsNullable { get; set; }
public UInt64? Size { get; set; }
public UInt64? NumericPrecision { get; set; }
public UInt64? NumericScale { get; set; }
}
string myJson = "MyMappings": [
{
"Name": "dbo.Table1",
"MySqlColumns": [
{
"Name": "Address",
"datatype": "nvarchar",
"isNullable": "YES",
"size": -1,
"numericPrecision": null,
"numericScale": null
}]
var deserializeData = JsonConvert.DeserializeObject<MyMappings>(myJson);
现在,当用户为任何列设置nvarchar(max)时,我将size设置为-1,这是setinel值以表示最大大小。现在将size设置为-1的原因是因为在读取大小为nvarchar(max)的列时,我的setinel值为-1 Marc Gravell's comment
我见过这个answer,但我的问题是如何在反序列化时使用它。我正在使用NewtonSoft json。
将尺寸指定为uint的原因:
答案 0 :(得分:3)
类型名称中的U
代表无符号,即这些值始终为正。所以值-1太小而不能存储在这样的变量中。将您的类型更改为已签名的Int64
。或者使用null
作为最大标记,并在创建列时将其解释为相应的。
至于你的更新,你唯一能做的就是使用null并让你的逻辑在需要时将其解释为-1。因为很难过你不能吃蛋糕并同时吃它。
答案 1 :(得分:1)
我会在MySqlColumns类中添加新属性(bool)。让我们把它命名为MaxLength。这将用作最大值标记。如果您的数据类型是nvarchar,varchar或任何其他类型,您可以查看此属性,您可以在其中定义长度。