C# POST和PUT in表格的问题,以逗号分隔的数值

C# POST和PUT in表格的问题,以逗号分隔的数值,c#,mysql,rest,asp.net-web-api,C#,Mysql,Rest,Asp.net Web Api,我遇到了我的后端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, m

我遇到了我的后端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
);
它有一个相应的
模型
,如下所示

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; }

    ...
}
我正在尝试将数值插入坐标中,如下所示:

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'
sql = "UPDATE coordinate SET longitude 55,6 latitude = 70,33, measurementId = 2 WHERE id = 2"
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;
    }
我的后端抛出以下错误:

{
 "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'
sql = "UPDATE coordinate SET longitude 55,6 latitude = 70,33, measurementId = 2 WHERE id = 2"
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;
    }
我的印象是,数字值应该用
分隔,而不是用
分隔,这可能是后端现在抛出此错误的原因:

{
 "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",
}
我有点不知所措,不知如何在数据库中插入数值。非常感谢您的帮助。

请尝试以下方法

sql = "UPDATE coordinate SET longitude = '" + coordinate.Longitude + "', latitude = '" + coordinate.Latitude + "', measurementId = '" + coordinate.MeasurementId + "' WHERE id = " + id.ToString();
尝试以下方法

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

也许可以试试下面的。我认为问题在于,您需要使用“.”而不是“,”来让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();

也许可以试试下面的。我认为问题在于,您需要使用“.”而不是“,”来让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();
替换 “更新坐标集经度='55,6,纬度=70,33,度量值=2',其中id=2' 到 更新坐标集经度='55.6',纬度='70.33',度量值='2',其中id='2'

替换“至”。(55,6至55.6) sql不能读写带有“,”的数字替换 “更新坐标集经度='55,6,纬度=70,33,度量值=2',其中id=2' 到 更新坐标集经度='55.6',纬度='70.33',度量值='2',其中id='2'

替换“至”。(55,6至55.6)
sql不能读写带有“,”的数字。

正如在对我的问题的评论中所指出的,使用参数化查询解决了这个问题,并增加了保护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();

正如在对我的问题的评论中所指出的,使用参数化查询解决了这个问题,同时还带来了保护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();


您需要将其重写为参数化查询,以修复SQL注入漏洞,然后您将不需要任何字符串连接,从而避免不平衡的引号、缺少符号等。它还将修复一些格式问题。请使用参数。你没有语法problems@AlexK. 好的,我会调查的。表明MySql不支持
INSERT
语句中的非英语小数点。参数化查询可能会解决这个问题,比如@AlexK。建议-绝对值得一试,因为理论上参数消除了链接答案中描述的歧义(您在这里看到),您需要将其重写为参数化查询,以修复SQL注入漏洞,然后您将不需要任何字符串连接,从而避免不平衡的引号,缺少符号等。它还将修复几个格式问题。请使用参数。你没有语法problems@AlexK. 好的,我会调查的。表明MySql不支持
INSERT
语句中的非英语小数点。参数化查询可能会解决这个问题,比如@AlexK。建议-绝对值得一试,因为理论上参数消除了链接答案中描述的模糊性(你在这里看到)@shyamvula否,数据被截断(我在问题中强调的第一个错误)@shyamvula数据截断错误意味着执行了查询,如果出现语法错误,则不会这样做。经度和纬度列的
数据类型是什么?@shyamvula
double
,如我在顶部的问题中所述。@shyamvula我知道它们是
double
,不,我没有通过
55,6
-转换正在链的某个地方发生。数据需要以正确的数值存储在数据库中,而不是
char
@shyamvula否,数据被截断(我在问题中突出显示的第一个错误)@shyamvula数据截断错误表示执行查询,如果出现语法错误,则不会这样做。经度和纬度列的
数据类型是什么?@shyamvula
double
,如我在顶部的问题中所述。@shyamvula我知道它们是
double
,不,我没有通过
55,6
-转换正在链的某个地方发生。数据需要以正确的数值形式存储在数据库中,而不是
char
。是否从键入为
double
的属性返回字符串?还有一个stackoverflow条件。好的,做了一些更改,所以它将实际编译,问题只是逗号,删除它们,你就成功了。您也可以使用“coordinate.Latitude.ToString().Replace(“,”,“)”)以另一种方式进行替换,但可能会导致代码混乱。@DubDub有点粗俗,但效果不错:-)谢谢