在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错误。
答案 0 :(得分:0)
我发现问题是什么,我使用.NET 4.0,所以我认为它不支持MySQL的POLYGON变量,当我用'cmd.Parameters.AddWithValue()'给MySQL查询提供参数时。当我将孔查询作为字符串进行查找时,一切都会找到。我不确定.NET的较新版本,但是如果参数包含一些'ST_GeomfromText'函数,那么使用4.0时你无法使用'AddWithValue'方法添加参数。
所以,如果您遇到同样的问题,只需将孔查询构建为字符串,不要使用'cmd.Parameters.AddWithValue()'方法。