Npgsql在PostgreSQL数据库中插入地球数据

时间:2018-01-30 04:41:03

标签: postgresql npgsql

我有一个激活了地球距离模块的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();
}

谢谢

1 个答案:

答案 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();
}