Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET中参数化几何体sql命令c,不起作用_C#_Sql_Asp.net_Spatial Query - Fatal编程技术网

C# 在ASP.NET中参数化几何体sql命令c,不起作用

C# 在ASP.NET中参数化几何体sql命令c,不起作用,c#,sql,asp.net,spatial-query,C#,Sql,Asp.net,Spatial Query,我已经使用了这个字符串,并用字符串连接对它进行了测试。但正如您所知,使用这个字符串格式化sql命令是不安全的 SqlCommand param = new SqlCommand(); param.CommandText = "INSERT INTO Circle (Center_Point, Circle_Data) VALUES (geometry::STGeomFromText('POINT(@center_lat @center_lng)',0),geometry::ST

我已经使用了这个字符串,并用字符串连接对它进行了测试。但正如您所知,使用这个字符串格式化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\u lat

看起来它没有将值放入字符串中。但当我一步一步地浏览代码时,它确实保存了值

有什么问题吗

谢谢你。我必须将添加到ASP.net项目中,这使我能够正确设置UDT类型。更新代码如下

SqlCommand param = new SqlCommand();
        SqlGeometry point = SqlGeometry.Point(center_lat,center_lng,0);
        SqlGeometry poly = SqlGeometry.STPolyFromText(new SqlChars(new SqlString(polygon)),0);
        param.CommandText = "INSERT INTO Circle (Center_Point, Circle_Data) VALUES (@point,@poly);";
        param.Parameters.Add(new SqlParameter("@point", SqlDbType.Udt));
        param.Parameters.Add(new SqlParameter("@poly", SqlDbType.Udt));
        param.Parameters["@point"].UdtTypeName = "geometry";
        param.Parameters["@poly"].UdtTypeName = "geometry";
        param.Parameters["@point"].Value = point;
        param.Parameters["@poly"].Value = poly;

对于我来说,使用MySQL几何体,我必须使用MySqlGeometry类,而不是@SammyG的答案中的SqlGeometry

parameters.Add(new
{
   ...
   MyGeometryObject = MySqlGeometry.Parse($"POINT({point.WGS84Lon} {point.WGS84Lat})").Value,
});

'之间的所有内容都被视为字符串值的一部分,因此参数不会被给定的值替换。有没有关于如何解决此问题的建议?。我现在正在尝试一些方法。不确定是否有更聪明的方法,但要在保持参数不变的情况下使用sql,您可以执行以下操作。。。选择“点”+cast@center_lat作为varchar+“”+。。。。。注意,所使用的参数类型决定了将包含的位数。我可以很好地连接字符串,并且可以正常工作,但是从SQL注入的角度来看,这不被认为是不安全的吗?这就是我将其参数化的原因。如果您连接参数而不是值,则不会。我估计第一个版本使用了原始值,换句话说,连接是在创建sql字符串时发生的。e、 g'Point+center\u lat。通过在字符串中使用'Point'+@center\u lat等,可以在sql命令中连接,仍然使用参数化值。请注意,就VisualStudio而言,您仍然使用一个字符串值,并且根本不连接任何内容。