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



我有一个漂亮的集市给你们,我就是想不出来,甚至都想不起来。我过去创建过一些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列(以及类的其他浮点值(被设置为允许为null的数据类型"float"。

我使用的是同步表,所以错误显示为运行以下行:

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

我也试过这个:

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

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

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

Foreshadowing在继续搜索我的问题时,我查看了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中寻找了一个双列类型。找不到一个,我决定在后台应用程序上将我的float改为doubles。神奇的是,这似乎奏效了。

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

相关内容

最新更新