【问题标题】:Inserting geography type into SQL Server database将地理类型插入 SQL Server 数据库
【发布时间】:2022-01-17 17:54:24
【问题描述】:

我想通过 python/将 (MULTI)Polygons 写入 SSMS 数据库

insert_query  = f"""INSERT INTO [dbo].[{table_name}] ({column_names[0]}, {column_names[1]})
                VALUES (?, ?)"""

val = (postal_code, f'geography::STGeomFromText({geovlak} ,4326)')

cursor.execute(insert_query, val)
conn.commit()

如果我打印 f'geography::STGeomFromText({geovlak} ,4326)' 的 1 个实例,我会得到:

geography::STGeomFromText(POLYGON ((4.90638 52.3781, 4.90677 52.378, 4.90643 52.3771, 4.90642 52.3771, 4.90557 52.3772, 4.90549 52.3772, 4.90469 52.3774, 4.90435 52.3775, 4.90432 52.3775, 4.90423 52.3775, 4.90425 52.3776, 4.90427 52.3776, 4.9043 52.3776, 4.90437 52.3777, 4.90438 52.3777, 4.90438 52.3777, 4.90447 52.3778, 4.90448 52.3778, 4.90452 52.3778, 4.90452 52.3778, 4.9046 52.3778, 4.90472 52.3779, 4.9049 52.378, 4.905 52.3781, 4.90502 52.3781, 4.90504 52.3782, 4.90505 52.3782, 4.90509 52.3783, 4.90516 52.3783, 4.90521 52.3782, 4.90523 52.3782, 4.90618 52.3781, 4.90637 52.3781, 4.90638 52.3781)))

这对我来说似乎不错,但随后出现以下错误。

'42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]


A .NET Framework error occurred during execution of user-defined routine or aggregate 
    "geography": \r\nSystem.FormatException: 24114: The label geography::STGeomFro in the 
    input well-known text (WKT) is not valid. Valid labels are POINT, LINESTRING, POLYGON, 
    MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION, CIRCULARSTRING, 
    COMPOUNDCURVE, CURVEPOLYGON and FULLGLOBE (geography Data Type 
    only).\r\nSystem.FormatException: \r\n   at 
   Microsoft.SqlServer.Types.OpenGisTypes.ParseLabel(String input)\r\n   at 
   Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType type)\r\n   at 
   Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType type, Int32 srid)\r\n   at 
   Microsoft.SqlServer.Types.SqlGeography.ParseText(OpenGisType type, SqlChars taggedText, 
   Int32 srid)\r\n   at Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType 
   type, SqlChars taggedText, Int32 srid)\r\n   at 
   Microsoft.SqlServer.Types.SqlGeography.Parse(SqlString s)\r\n. (6522) (SQLExecDirectW); 
   [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The statement has been 
   terminated. (3621)'

【问题讨论】:

  • 没有在 SSMS (SQL Server Management Studio) 中插入您正在插入到 SQL Server 数据库。代码[dbo].[{table_name}] ({column_names[0]}, {column_names[1]}) 看起来也可以注入。为什么你有动态对象名称?如果您也没有转义所有需要的字符,则将注入的值包装在定界标识符中不会停止注入。

标签: python sql sql-server pyodbc


【解决方案1】:

您将在参数值中包含STGeomFromText 函数调用。如果要在 geovlak 文本上调用函数,则需要在命令文本中包含函数调用,例如,

insert_query  = f"""INSERT INTO [dbo].[{table_name}] ( … )
                VALUES (?, geography::STGeomFromText(? ,4326))"""

val = (postal_code, geovlak)

cursor.execute(insert_query, val)
conn.commit()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多