Как решить проблему преобразования типов данных на сервере sql? - PullRequest
0 голосов
/ 06 августа 2020

У меня проблемы с добавлением данных в мою базу данных. Я создал веб-api в Visual Studio со следующей моделью данных

public long ProductId { get; set; }
public string ProductName { get; set; }
public double Price { get; set; }
public string Url { get; set; }

Я тестирую с помощью почтальона со следующим почтовым запросом

{
    "ProductID": null,
    "ProductName": "ProductA",
    "Price": 100.1,
    "Url":"https://productA.com"
}

И при отладке я получаю error converting data type varchar to float . Это можно увидеть на изображении ниже. Я не знаю, как это исправить, я думаю, проблема в строке 74

введите описание изображения здесь

Я создал базу данных, выполнив следующий запрос

CREATE TABLE dbo.ProductInfo 
(
    ProductID bigint IDENTITY(1,1) NOT NULL,
    ProductName varchar(1000), 
    Price float,
    Url varchar (1000)
)

1 Ответ

1 голос
/ 06 августа 2020

Вы не используете параметры. Вы просто вставляете переменные в строку.

В своих значениях вы фактически вставляете их как varchar, поскольку вы строите запрос через

... '" + prod.Price + "' ...

, что приводит к фактическому строка запроса должна стать

Values('ProductA', '100.1', 'https://productA.com')

Итак, SQL Сервер теперь пытается преобразовать эти значения за вас, преобразовывая varchar в float. Что он должен делать.

Вы получаете ошибку, что он не может этого сделать. Я заметил, что вы также вставляете prod.Price вместо переменной var Price. Вы уверены, что prod.Price правильно отформатирован?

Потому что здесь на экране показано, что цена var должна работать из-за автоматического преобразования. Я предполагаю, что prod.Price, возможно, является десятичным разделителем запятой, а не точкой. Это приведет к тому, что SQL Server выдаст ошибку.

SQL Пример на стороне сервера, демонстрирующий ошибку:

DECLARE @floatVariable FLOAT = 100.1 
/* Proper float value, so no problems */
SELECT @floatVariable

DECLARE @floatVariable2 FLOAT = '100.1' 
/* A valid float, but as varchar so autocasted */
SELECT @floatVariable2

DECLARE @floatVariable3 FLOAT = '100,1' 
/* A varchar with improper float values, autocasted but doesn't succeed */
SELECT @floatVariable3

Или просто используйте правильную SQL параметризацию для ваших запросов. Вместо того, чтобы объединять все вместе в одну строку (всегда интересно получить SQL, введенное таким образом).

Изменить:

Итак, протестировав преобразование в приложении. В простом консольном приложении C# с языковым стандартом / культурой, в которых в качестве условного обозначения используются десятичные дроби, разделенные запятыми, при «добавлении» его в строку двойное значение автоматически преобразуется в запятую.

Пример кода:

static void Main(string[] args)
    {

        double a = 10.1;

        Console.WriteLine(@"Double value: " + a + " .");


        Console.ReadLine();
    }

Выходное значение:

Двойное значение: 10,1.

...