我有一个激活了地球距离模块的PostgreSQL数据库。 我有一个数据类型设置为earth的列。 有没有办法使用Npgsql插入新记录? 我试图使用ll_to_earth(lat,long)函数但收到错误 " installation_location \"是earth类型,但表达式是text"
int din_id = 5;
using (var cmd = new NpgsqlCommand("INSERT INTO installation_test
(installation_id, installation_location ) " +
"VALUES (@uin_id, @uin_loc ) ", connection))
{
cmd.Parameters.AddWithValue("uin_id", din_id);
cmd.Parameters.AddWithValue("uin_loc",
"ll_to_earth(-23.482409,153.141043)");
cmd.ExecuteNonQuery();
}
谢谢
答案 0 :(得分:2)
不能以这种方式使用参数:您不能在参数数据中放置任意SQL,由数据库执行(在您的情况下,ll_to_earth
函数调用)。数据库不会将参数数据评估为SQL,但需要实际值。您正在寻找的可能是一个没有任何参数的简单INSERT:
using (var cmd = new NpgsqlCommand("INSERT INTO installation_test
(installation_id, installation_location ) " +
"VALUES (@uin_id, ll_to_earth(-23.482409,153.141043)) ", connection))
{
cmd.Parameters.AddWithValue("uin_id", din_id);
cmd.ExecuteNonQuery();
}
但是,您可以参数化传递给ll_to_earth
的点:
using (var cmd = new NpgsqlCommand("INSERT INTO installation_test
(installation_id, installation_location ) " +
"VALUES (@uin_id, ll_to_earth(@x,@y)) ", connection))
{
cmd.Parameters.AddWithValue("uin_id", din_id);
cmd.Parameters.AddWithValue("x", -23.482409);
cmd.Parameters.AddWithValue("y", -23.482409);
cmd.ExecuteNonQuery();
}