C# POST和PUT in表格的问题,以逗号分隔的数值
我遇到了我的后端POST和PUT的问题。相关的表格结构可以在这里看到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
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数据截断错误意味着执行了查询,如果出现语法错误,则不会这样做。经度和纬度列的数据类型是什么?@shyamvuladouble
,如我在顶部的问题中所述。@shyamvula我知道它们是double
,不,我没有通过55,6
-转换正在链的某个地方发生。数据需要以正确的数值存储在数据库中,而不是char
@shyamvula否,数据被截断(我在问题中突出显示的第一个错误)@shyamvula数据截断错误表示执行查询,如果出现语法错误,则不会这样做。经度和纬度列的数据类型是什么?@shyamvuladouble
,如我在顶部的问题中所述。@shyamvula我知道它们是double
,不,我没有通过55,6
-转换正在链的某个地方发生。数据需要以正确的数值形式存储在数据库中,而不是char
。是否从键入为double
的属性返回字符串?还有一个stackoverflow条件。好的,做了一些更改,所以它将实际编译,问题只是逗号,删除它们,你就成功了。您也可以使用“coordinate.Latitude.ToString().Replace(“,”,“)”)以另一种方式进行替换,但可能会导致代码混乱。@DubDub有点粗俗,但效果不错:-)谢谢