Azure SQL C# 后端查询浮动原因 "Internal Server Error"

Azure SQL C# Backend Querying Float Caues "Internal Server Error"

我有一个非常适合你们的集市,但我想不通,甚至想不通。我过去创建了几个 Azure 数据库,我相信这是我第二个使用 .NET 后端的数据库。我似乎 pulling/inserting 除了浮点变量之外的所有内容都正确。

压缩class客户端:

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

压缩class后端:

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

并且在服务器端,价格列(和 class 的其他浮点数)设置为允许空值的数据类型 "float"。

我正在使用同步表,所以显示错误 运行 这一行:

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

我也尝试过这个:

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

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

该错误与将数据插入 table 时发生的从 varchar 到 float 数据类型的转换失败有关。您必须先验证 "price" 数据,然后才能将其插入 table。如果 TRY_CONVERT returns NULL 您不能插入该记录,因为价格值无效。

预示 在继续搜索我的问题时,我在 SSMS 中查看了我的数据库,发现我的 "float" 占用了 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 字节。