【发布时间】:2015-06-08 08:15:42
【问题描述】:
我已经使用了这个字符串并用字符串连接对其进行了测试。但是你知道用它来格式化一个 sql 命令是不安全的。
SqlCommand param = new SqlCommand();
param.CommandText = "INSERT INTO Circle (Center_Point, Circle_Data) VALUES (geometry::STGeomFromText('POINT(@center_lat @center_lng)',0),geometry::STGeomFromText('POLYGON((@polygon))',0));";
param.Parameters.Add(new SqlParameter("@center_lat", center_lat));
param.Parameters.Add(new SqlParameter("@center_lng", center_lng));
param.Parameters.Add(new SqlParameter("@polygon", polygon));
我去参数化字符串并得到以下错误:
System.Data.SqlClient.SqlException (0x80131904):一个 .NET 框架 在执行用户定义的例程或聚合期间发生错误 “几何”:System.FormatException:24141:一个数字应该在 输入的第 17 位。输入有@center_lat。
看起来它没有将值放入字符串中。但是当我单步执行代码时,它确实保留了该值。
可能是什么问题?
谢谢
【问题讨论】:
-
'之间的所有内容都被视为字符串值的一部分,因此参数不会被给定值替换。 -
关于如何解决这个问题的任何建议?我现在正在尝试方法..
-
不确定是否有更聪明的方法,但要在保持参数不变的情况下使用 sql,您可以执行
... select 'POINT(' + cast(@center_lat as varchar) + ' ' + .....之类的操作(注意,使用的参数类型决定了将包含的位数) -
我可以很好地连接字符串并且它可以工作,但是从 SQL 注入的角度来看,这不被认为是不安全的吗?这就是我参数化它的原因。
-
如果您连接参数而不是值,则不会。我认为第一个版本使用了原始值,换句话说,连接发生在创建 sql 字符串时。 (例如
" 'Point(" + center_lat。通过在字符串中使用'POINT(' + @center_lat etc,您可以在sql 命令中进行连接,仍然使用参数化值。请注意,就Visual Studio 而言,您仍然使用一个字符串值并且不要连接任何东西。
标签: c# sql asp.net spatial-query