首页 > 解决方案 > POST 和 PUT 在表中使用逗号分隔的数值的问题

问题描述

我在后端遇到了 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"

我的印象是数值应该由 a.而不是 a分隔,,这可能是后端现在抛出此错误的原因:

{
 "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",
}

我对如何处理在我的数据库中插入数值有点茫然。任何帮助深表感谢。

标签: c#mysqlrestasp.net-web-api

解决方案


正如对我的问题的评论所指出的那样,使用参数化查询解决了这个问题,并带来了保护 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;
    }

推荐阅读