Проблемы с POST и PUT в таблице с числовыми значениями, разделенными запятыми - PullRequest
0 голосов
/ 29 мая 2019

У меня проблемы с POST и PUT для моего бэкэнда. Соответствующую структуру таблицы можно увидеть здесь

DROP TABLE IF EXISTS coordinate;
CREATE TABLE coordinate
(
   id                    int(10) NOT NULL auto_increment,
   longitude             double(8,4) NOT NULL,
   latitude              double(8,4) NOT NULL,
   measurementId         int(10) default NULL,
   PRIMARY KEY (id),
   FOREIGN KEY (measurementId) 
        REFERENCES measurement (id)
        ON DELETE CASCADE
);

Он имеет соответствующий Model, который выглядит следующим образом

public class Coordinate
{
    public Coordinate()
    {

    }

    public int ID { get; set; }

    public double Latitude { get; set; }

    public double Longitude { get; set; }

    public int MeasurementId { get; set; }

    ...
}

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

sql = "UPDATE coordinate SET longitude = '" + coordinate.Longitude + "," + " latitude = " + coordinate.Latitude + "," + " measurementId = " + coordinate.MeasurementId + "' WHERE id = " + id.ToString();

Обратите внимание на включение одинарной скобки перед двойной скобкой после longitude = '" и + "' WHERE ...

Когда я запускаю это с отладчиком, строка sql выглядит так:

sql = "UPDATE coordinate SET longitude = '55,6, latitude = 70,33, measurementId = 2' WHERE id = 2'

А мой бэкэнд выдает следующую ошибку:

{
 "Message": "An error has occurred.",
 "ExceptionMessage": "Data truncated for column 'longitude' at row 1",
 "ExceptionType": "MySql.Data.MySqlClient.MySqlException",
 ...
}

Я догадываюсь, что строка sql построена неправильно из-за включения одиночной скобки, поэтому я удаляю ее как и создаю новую строку sql следующим образом:

sql = "UPDATE coordinate SET longitude = " + coordinate.Longitude + "," + " latitude = " + coordinate.Latitude + "," + " measurementId = " + coordinate.MeasurementId + " WHERE id = " + id.ToString();

Обратите внимание на снятие одиночной скобки ' в местах, где она была ранее. Теперь в отладчике строка sql построена так:

sql = "UPDATE coordinate SET longitude 55,6 latitude = 70,33, measurementId = 2 WHERE id = 2"

У меня сложилось впечатление, что числовые значения должны быть разделены ., а не ,, что может быть причиной того, что серверная часть теперь выдает эту ошибку:

{
 "Message": "An error has occurred.",
 "ExceptionMessage": "You have an error in your SQL syntax; check the manual 
 that corresponds to your MySQL server version for the right syntax to use 
 near '6, latitude = 70,33, measurementId = 2 WHERE id = 2' at line 1",
}

Я немного растерялся, как потом обрабатывать вставку числовых значений в мою базу данных. Любая помощь очень ценится.

Ответы [ 4 ]

2 голосов
/ 29 мая 2019

Как отмечено в комментариях к моему вопросу, использование параметризованного запроса решило проблему с дополнительным преимуществом защиты SQL-запроса. В то время как ответ DubDub был хорошим решением, следующий код решает его более масштабируемым и безопасным способом.

SQL-запрос теперь выглядит так:

 string sql = "UPDATE coordinate SET longitude = @Longitude, latitude = @Latitude, measurementId = @MeasurementId WHERE id = @ID";

 List<MySqlParameter> parameters = SqlFactory.CreateParametersFor(coordinate);

 cmd = SqlFactory.CreateParameterizedQuery(sql, parameters, conn);

 cmd.Parameters.Add(ID);

 await cmd.ExecuteNonQueryAsync();

Где CreateParametersFor() и CreateParameterizedQuery() реализованы так:

public static MySqlCommand CreateParameterizedQuery(string sql, List<MySqlParameter> parameters, MySqlConnection connection)
    {
        MySqlCommand cmd = new MySqlCommand(sql, connection);
        foreach (MySqlParameter parameter in parameters) cmd.Parameters.Add(parameter);
        return cmd;
    }

    public static List<MySqlParameter> CreateParametersFor(Coordinate coordinate)
    {
        List<MySqlParameter> parameters = new List<MySqlParameter>();

        MySqlParameter latitude = new MySqlParameter()
        {
            ParameterName = "@Latitude",
            Value = coordinate.Latitude
        };

        MySqlParameter longitude = new MySqlParameter()
        {
            ParameterName = "@Longitude",
            Value = coordinate.Longitude
        };

        MySqlParameter measurementId = new MySqlParameter()
        {
            ParameterName = "@MeasurementId",
            Value = coordinate.MeasurementId
        };

        parameters.Add(latitude);
        parameters.Add(longitude);
        parameters.Add(measurementId);

        return parameters;
    }
0 голосов
/ 29 мая 2019

Может быть, дать следующий ход. Я думаю, проблема в том, что вам нужно использовать «.» вместо ',' чтобы сделать десятичные значения понятными для SQL. Помните, что при попытке вернуть долготу / широту она будет возвращена в виде строки.

Я не проверял это, но попробую.

using System.Globalization;
public class Coordinate
{
    NumberFormatInfo nfi = new NumberFormatInfo();

    public Coordinate()
    {
        nfi.NumberDecimalSeparator = ".";
    }

    public int ID { get; set; }

    public double Latitude { get; set; }

    public double Longitude { get; set; }

    public int MeasurementId { get; set; }

    public string GetLatitudeComma()
    {
        return this.Latitude.ToString(nfi);
    }

    public string GetLongitudeComma()
    {
        return this.Longitude.ToString(nfi);
    }
}

И ...

sql = "UPDATE coordinate SET longitude = '" + coordinate.GetLongitudeComma() + "," + " latitude = " + coordinate.GetLatitudeComma()+ "," + " measurementId = " + coordinate.MeasurementId + "' WHERE id = " + id.ToString();
0 голосов
/ 29 мая 2019

заменить "UPDATE координата SET долгота = '55, 6, широта = 70,33, MeasureId = 2 'WHERE id = 2' на" UPDATE координата SET долгота = '55 .6 ', широта = '70 .33', measureId = '2 'WHERE id =' 2 '

заменить "," на "."(От 55,6 до 55,6) sql не читается и не пишется число с ","

0 голосов
/ 29 мая 2019

Попробуйте следующее.

sql = "UPDATE coordinate SET longitude = '" + coordinate.Longitude + "', latitude = '" + coordinate.Latitude + "', measurementId = '" + coordinate.MeasurementId + "' WHERE id = " + id.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...