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

标签 c# mysql stored-functions

在 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);
    }
}

我得到了这个错误

Cannot get geometry object from data you send to the GEOMETRY field

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

最佳答案

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

因此,如果您遇到同样的问题,只需将洞查询构建为字符串,不要使用“cmd.Parameters.AddWithValue()”方法。

关于C# 在 INSERT 查询中调用 ST_GeomfromText 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42718277/

相关文章:

c# - 访问静态数据的设计模式

c# - 如何获得在集合数量中找到的最长匹配项,顺序很重要

mysql - MySQL存储函数中IF语句出错

sql - 如何从postgres的文本列中获取第n行

mysql - 如何获取 MySQL 服务器上每个数据库的空值计数?

c# - 当我尝试展开模型属性时,为什么 Visual Studio 2013 调试器关闭时没有错误?

c# - 正则表达式匹配以某个字符结尾但不以另一个字符开头且中间有空格的字符串

mysql - 我如何计算sql中零的数量?

mysql - 如何从 Laravel 中的关系中获取 Sum

javascript - 尝试使用 Node Express 发送 POST 响应,错误无效状态代码