Я пытаюсь выполнить параметрический запрос из C#, и я получаю ошибку:Ошибка синтаксического анализа в PostgreSQL параметрирована запрос из C#, но работает в pgAdmin III
ERROR: XX000: parse error - invalid geometry
с намеком
"POLYGON((:m" <-- parse error at position 11 within geometry
Но когда я запускаю запрос в pgAdmin III, заменяя параметры своими значениями, запрос работает. Код
command.CommandText = "SELECT area_code FROM area WHERE ST_INTERSECTS(ST_GeographyFromText('POLYGON((:minx :miny, :minx :maxy, :maxx :maxy, :maxx :miny, :minx :miny))'), shape) AND area_type_code = :typecode";
command.CommandType = CommandType.Text;
var typeCodeParameter = new NpgsqlParameter
{
DbType = DbType.String,
ParameterName = "typecode",
Value = _typeCode
};
var minxParameter = new NpgsqlParameter
{
DbType = DbType.Double,
ParameterName = "minx",
Value = _minX
};
var minyParameter = new NpgsqlParameter
{
DbType = DbType.Double,
ParameterName = "miny",
Value = _minY
};
var maxxParameter = new NpgsqlParameter
{
DbType = DbType.Double,
ParameterName = "maxx",
Value = _maxX
};
var maxyParameter = new NpgsqlParameter
{
DbType = DbType.Double,
ParameterName = "maxy",
Value = _maxY
};
command.Parameters.Add(typeCodeParameter);
command.Parameters.Add(maxxParameter);
command.Parameters.Add(maxyParameter);
command.Parameters.Add(minxParameter);
command.Parameters.Add(minyParameter);
using (var reader = command.ExecuteReader())
while (reader.Read())
areas.Add((string)reader["area_code"]);
и рабочий запрос
SELECT area_code FROM area WHERE ST_INTERSECTS(ST_GeographyFromText('POLYGON((-1.0042576967558934 50.78431084582985, -1.0042576967558934 51.199216033050647, 1.9400782407441057 51.199216033050647, 1.9400782407441057 50.78431084582985, -1.0042576967558934 50.78431084582985))'), shape) AND area_type_code = 'County'
Что я делаю неправильно? Как установить параметры minx, miny, maxx, maxy?
Спасибо, это имеет смысл. Я уже придумал обходной путь, где я использую string.Format, чтобы поместить параметры координат в строку SQL. Это должно быть безопасно от SQL-инъекции, поскольку они имеют тип double, поэтому ничего не может быть неприятно в команде SQL. –
@ AndyNichols Вам не нужно просто вставлять его в строку SQL - просто передайте весь аргумент 'ST_GeographyFromText' как один строковый параметр. Если функция 'ST_GeographyFromText' не делает что-то действительно странное, она должна быть полностью безопасной, и вы собираетесь использовать повторное использование плана выполнения. – Luaan