-1

我为你们准备了一个漂亮的集市,我只是想不通,甚至无法理解。我过去创建了一些 Azure 数据库,我相信这是我使用 .NET 后端的第二个数据库。除了浮点变量外,我似乎所有东西都正确拉/插入。

精简类客户端:

class MealItem
{
    public string ID { get; set; }
    public string Name { get; set; }
    public float Price { get; set; }
}

精简类后端:

public class MealItem : EntityData
{
    public string Name { get; set; }
    public float Price { get; set; }
}

在服务器端,Price 列(和该类的其他浮点数)设置为数据类型“float”,允许使用空值。

我正在使用同步表,因此运行此行会显示错误:

await client.GetSyncTable<MealItem>().PullAsync("All", client.GetSyncTable<MealItem>().CreateQuery(), 
CancellationToken.None);

我也试过这个:

await client.GetTable<MealItem>().ToListAsync();

当我在客户端和后端注释掉浮点变量时,一切正常。我在这个上花了很多时间,但似乎无法弄清楚。任何想法将不胜感激!谢谢!

4

2 回答 2

1

该错误与将数据插入表时发生的从 varchar 到 float 数据类型的转换失败有关。您必须先验证“价格”数据,然后才能将其插入表中。如果 TRY_CONVERT 返回 NULL,则您无法插入该记录,因为价格值无效。

于 2020-03-20T20:07:09.747 回答
0

铺垫在继续寻找我的问题时,我在 SSMS 中查看了我的数据库,发现我的“浮点数”占用了 8 个字节。

我为找到问题而采取的步骤如下。首先,在后端,我记录了一个Query().toString();以获取发送到 SQL 数据库的 SQL 字符串。就像是:

SELECT[Extent1].[Id] AS [Id],[Extent1].[Name] AS [Name],[Extent1].[ItemType] AS [ItemType], [Extent1].[Price] AS [Price],[Extent1].[Version] AS [Version],[Extent1].[CreatedAt] AS [CreatedAt],[Extent1].[UpdatedAt] AS [UpdatedAt],[Extent1].[Deleted] AS [Deleted]FROM [dbo].[MealItems] AS [Extent1]

我尝试将此语句的结果记录为错误,但一无所获。试图用@albert Morillo 发布的解决方案四处寻找,我试过了

SELECT[Extent1].[Id] AS [Id],[Extent1].[Name] AS [Name],[Extent1].[ItemType] AS [ItemType], Try_convert(float,[Extent1].[Price]) AS [Price],[Extent1].[Version] AS [Version],[Extent1].[CreatedAt] AS [CreatedAt],[Extent1].[UpdatedAt] AS [UpdatedAt],[Extent1].[Deleted] AS [Deleted]FROM [dbo].[MealItems] AS [Extent1]

但仍然没有结果。我终于有幸将此语句放入 try catch 并在那里记录错误。它回吐了以下内容:

"Error: The 'Price' property on 'MealItem' could not be set to a 'System.Double' value. You must set this property to a non-null value of type."

不知道这意味着什么,我在 SSMS 中寻找双列类型。没有找到,我决定在后端应用程序上将我的浮点数更改为双精度数。神奇的是,这似乎成功了。

我不确定这是否是正确的解决方案,但它似乎对我有用。这是有道理的,因为 SQL 数据库正在保存和 8 个字节数,而 C# double 是 8 个字节。

于 2020-03-20T23:09:41.140 回答