c# - 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",
}
我对如何处理在我的数据库中插入数值有点茫然。任何帮助深表感谢。
解决方案
正如对我的问题的评论所指出的那样,使用参数化查询解决了这个问题,并带来了保护 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;
}
推荐阅读
- c# - 如何在 IQueryable EF 中的 WHERE() 内有条件地添加表达式 ANY()
- mysql - MySQL Batch 语句是否在一个块中执行
- android - 未找到样式属性 attr/@attr/minTextSize
- javascript - 如何将标题文本更改为 iframe 的标题文本?
- python - cv2 轮廓无法检测到某些形状
- javafx - Horizontal and vertical line on mouse move
- javascript - 解决一个缓慢的无头浏览器渲染html,javascript到python中的截图图像?
- stack - 如何在eclipse che中持久化堆栈
- c# - System.Net.Http 的 .NET Framework 版本高于 Project
- python - 如何使用 python 加入多个 .wav 文件