C# 在 INSERT 查询中调用 ST_GeomfromText 函数

Posted

技术标签:

【中文标题】C# 在 INSERT 查询中调用 ST_GeomfromText 函数【英文标题】:C# calling ST_GeomfromText function in INSERT query 【发布时间】:2017-03-10 12:18:38 【问题描述】:

在 C# 中,我试图调用那个 mysql 查询:

INSERT INTO tbl1 (id, maxLat, minLat, minLon, maxLon, geo)
VALUES (149, 43.20, 43.19, 23.574659, 23.579477, ST_GeomfromText('POLYGON((43.20 23.574659, 43.20 23.579477, 43.19 23.579477, 43.19 23.574659, 43.20 23.574659))'));

使用该代码

StringBuilder queryBuilder = new StringBuilder(string.Format(
    "INSERT INTO 0.geo_log_file (log_file_id, maxLat, minLat, minLon, maxLon, geo)\nVALUES ",
    schema
));

int it = 0;

for (int i = 0; i < rects.Count; i++)

    queryBuilder.Append(string.Format("(@log_file_id, @maxLat_0, @minLat_0, @minLon_0, @maxLon_0, ?geo_0)", i));

    if (i < rects.Count - 1)
        queryBuilder.Append(",");
    else
        queryBuilder.Append(";");


using (var cmd = conn.CreateCommand())

    cmd.CommandText = queryBuilder.ToString();
    cmd.Parameters.AddWithValue("@log_file_id", logFileId);

    for (int i = 0; i < rects.Count; i++)
    
        string geo = String.Format(
                "ST_GeomfromText('POLYGON((0 1, 2 3, 4 5, 6 7, 8 9))')",
                rects[i].maxLat,
                rects[i].minLon,

                rects[i].maxLat,
                rects[i].maxLon,

                rects[i].minLat,
                rects[i].maxLon,

                rects[i].minLat,
                rects[i].minLon,

                rects[i].maxLat,
                rects[i].minLon
            );

        cmd.Parameters.AddWithValue(string.Format("@maxLat_0", i), rects[i].maxLat);
        cmd.Parameters.AddWithValue(string.Format("@minLat_0", i), rects[i].minLat);
        cmd.Parameters.AddWithValue(string.Format("@minLon_0", i), rects[i].minLon);
        cmd.Parameters.AddWithValue(string.Format("@maxLon_0", i), rects[i].maxLon);
        cmd.Parameters.AddWithValue(string.Format("?geo_0", i), geo);
    

    try
    
        cmd.ExecuteNonQuery();
    
    catch (Exception err)
    
        string q1 = cmd.CommandText;

        for (int i = cmd.Parameters.Count - 1; i >= 0; i--)
        
            q1 = q1.Replace(cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value == null ? "NULL" : cmd.Parameters[i].Value.ToString());
        
        Console.WriteLine(q1);
    

我得到了那个错误

无法从您发送到 GEOMETRY 字段的数据中获取几何对象

谁能帮帮我,我没主意了!!! 我确信代码给出了正确的查询(最后我在 catch 语句中得到它)。我在 MySQL Workbench 中尝试了它,它在那里工作,但是当我从 C# 调用它时,bam 错误。

【问题讨论】:

什么是异常类型? 异常类型为“MySqlException”。 你检查了吗? ***.com/questions/39832575/… 是的,我告诉过你,C# 尝试执行的查询在 MySQL Workbench 中有效 【参考方案1】:

我发现问题出在哪里,我使用 .NET 4.0,所以当我使用“cmd.Parameters.AddWithValue()”将参数提供给 MySQL 查询时,我认为它不支持 MySQL 的 POLYGON 变量。当我将孔查询作为字符串进行时,一切都找到了。我不确定 .NET 的较新版本,但在 4.0 中,如果参数包含某些“ST_GeomfromText”函数,则无法使用“AddWithValue”方法添加参数。

所以,如果您遇到同样的问题,只需将孔查询构建为字符串,不要使用 'cmd.Parameters.AddWithValue()' 方法。

【讨论】:

以上是关于C# 在 INSERT 查询中调用 ST_GeomfromText 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Microsoft Access 中通过 VBA 设置 INSERT SQL 查询的参数值?

C#程序oracle数据库只能够 Insert into怎样得到返回该条纪录的主键的值

C#中执行insert的SQL语句成功(返回受影响行数为1)却没有在数据库中insert,知道啥原因么?

C# HttpRuntime.Cache.Insert() 不保存缓存值

在SQL Server数据库中执行存储过程很快,在c#中调用很慢的问题

SQL 命名法:INSERT/UPDATE/DELETE 的“查询”或“命令”?