Azure SQL C# Бэкэнд-запрос с плавающей точкой Причины «Внутренняя ошибка сервера» - PullRequest
0 голосов
/ 20 марта 2020

У меня есть довольно базарный для вас, ребята, которого я просто не могу понять или даже обернуть голову вокруг. В прошлом я создал несколько 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" с допустимыми значениями null.

Я использую таблицы syn c, поэтому ошибка отображается как запущенная эта строка:

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

Я также попробовал это, черт возьми:

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

Все работает, когда я закомментирую переменные с плавающей запятой на клиенте и на сервере. Я провел много времени на этом и, похоже, не могу понять это. Благодарим за любую идею! Спасибо!

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Эта ошибка связана с неудачным преобразованием данных типа varchar в тип float, которое происходит при вставке данных в таблицу. Вам нужно будет проверить данные «цены», прежде чем вы сможете вставить их в таблицу. Если TRY_CONVERT возвращает NULL, вы не можете вставить эту запись, поскольку значение цены недопустимо.

0 голосов
/ 21 марта 2020

Предвидение Продолжая искать свою проблему, я посмотрел на свою базу данных в 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]

, но все равно ничего не получил. Наконец-то у меня появилась возможность поместить это утверждение в попытку и зафиксировать там ошибку. Он выплюнул следующее:

"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# - 8 байтов.

...