WebHU - Programozási kérdések és válaszok

Elemzési hiba a PostgreSQL parametrizált C# lekérdezésében, de működik a pgAdmin III-ban

Paraméterezett lekérdezést próbálok végrehajtani C#-ból, és ezt a hibát kapom:

HIBA: XX000: elemzési hiba – érvénytelen geometria

az utalással

"POLYGON((:m" ‹ -- elemzési hiba a 11. pozícióban a geometrián belül

De amikor a pgAdmin III-ban futtatom a lekérdezést, és lecserélem a paramétereket az értékükre, a lekérdezés működik. A kód az

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"]);

és a működő lekérdezés az

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'

Mit csinálok rosszul? Hogyan állítsam be a minx, miny, maxx, maxy paramétereket?


Válaszok:


1

A probléma az, hogy szétválasztod a koordinátákat. A paraméterek nem csak az SQL-ben vannak egymáshoz csapva (ez nem csak egy sabloncsere), hanem szintaktikailag érvényes helynek kell lennie egy paraméter elhelyezéséhez. A józanság ellenőrzése az, ha megpróbálja ugyanazt a lekérdezést, de ahelyett, hogy a paramétereket közvetlenül értékekkel cserélné le, használja az eljárási SQL-t és a változókat.

Látni fogja, hogy a probléma az, hogy a ST_GeographyFromText függvény nem bontja ki a paramétereket a bemeneti karakterláncon belül – ez egy elvárt viselkedés. Ha használni akarja ezt a funkciót, nem használhat paramétereket a karakterláncon belül - továbbra is csak az összes értéket fel kell adnia, és át kell adnia őket karakterláncként - ugyanaz, amit a "paraméterek eltávolításakor" tett. A legegyszerűbb megoldás valószínűleg az lenne, ha a teljes karakterláncot paraméterként adnánk át, vagy egyszerűen hozzáadnánk a paramétereket egy karakterlánchoz a lekérdezésben (pl. ST_GeographyFromText('POLYGON((' || cast(:minx ...) || '), ' || ... || ')') stb.)

Úgy tűnik, hogy a régi "egy csomó sztringet összefűzni" SQL-t konvertálsz paraméterezett lekérdezésekkel. Tarts ki, de figyelembe kell venni a szintaxist. Csakúgy, ahogyan nem lehet csak egy segédlekérdezést beilleszteni egy paraméterbe, nem lehet egyszerűen egyetlen értéket két paraméterre szétválasztani.

Tehát vagy jobb típust kell használnod, vagy valamilyen segédkonverziót (például egy függvényt, amely két lebegtetést vesz igénybe, és visszaadja a szükséges típust).

14.01.2015
  • Köszönöm, ennek van értelme. Már kitaláltam egy megoldást, ahol a string.Format segítségével helyezném el a koordináta paramétereket az SQL karakterláncba. Ennek biztonságosnak kell lennie az SQL injekciótól, mivel dupla típusúak, így semmi csúnya nem kerülhet az SQL parancsba. 14.01.2015
  • @AndyNichols Valójában nem kell közvetlenül az SQL-karakterláncba helyeznie – csak adja át a ST_GeographyFromText teljes argumentumát egyetlen karakterlánc-paraméterként. Hacsak a ST_GeographyFromText függvény nem csinál valami igazán furcsát, teljesen biztonságosnak kell lennie, és a végrehajtási terv újrafelhasználható. 14.01.2015

  • 2

    A paraméterezett lekérdezés használatának helyes módja egy olyan függvény használata, amely numerikus paramétereket vesz fel egy boríték létrehozásához, például: ST_MakeEnvelope(xmin, ymin, xmax, ymax).

    SELECT area_code
    FROM area
    WHERE ST_Intersects(ST_MakeEnvelope(:minx, :miny, :maxx, :maxy)::geography, shape)
       AND area_type_code = :typecode;
    

    Más szövegformázási kísérletek (WKT) lassabbak és veszteségesek, mivel a számok formátumra konvertálódnak szöveget, majd visszaelemezte számokká.

    15.01.2015
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..