経緯
rawsqlを使い、sqlinjectionを避けるためにsqlparameterを使って値を渡してあげる。しかし、geometryのカラムを使っていて、そこに値を渡すのに、躓いた話をしたい。
問題
Parametrizing geometry sql command c# in ASP.NET, not working - Stack Overflow
ここのサイトで同じように躓いている人を見つけたが、解決方法がなんかいまいちで対応できなかった。そして、この人の気持ちめっちゃわかるわーってなっていた。
最終的に下記のようなsqlを作るとする。
INSERT INTO spot (spot_id , latlon )
VALUES (1, GeomFromText('POINT(137.10 35.20)'));
そのためにまず、このようなsqlを用意する。
string sql = @"
INSERT INTO spot (spot_id , latlon )
VALUES (@SpotId, GeomFromText('POINT(@Lat @Lng)'));"
下記のようなsqlparameterを用意してbindしてあげた。
new sqlparameter(@SpotId,1)
new sqlparameter(@Lat,137.10)
new sqlparameter(@Lng,35.20)
そして、めっちゃエラーが出るわけです。
大体、シングルクォーテーションがあると怪しい。
解決
なんどもやり方を調べて、見つからず、たどり着いた方法がこちら
string sql = @"
INSERT INTO spot (spot_id , latlon )
VALUES (@SpotId, GeomFromText('POINT(@Lat @Lng)'));"
下記のようなsqlparameterを用意してbindしてあげた。
new sqlparameter(@SpotId,1)
new sqlparameter(@LatLng,"POINT" + 137.10 + " " + 35.20 + ")")
というやりかた。あくまでPOINTを一つのパラメータもしくわシングルクォーテーションの中を一つのパラメータとして渡してあげるのがコツ。
おまけ
これを閃いたのでは、あいまい検索のときに like '% @text %' というようなところでうまくできなかったのを、
new sqlparameter(@text,"%" + xxx + "%") というようなやり方でうまくいったのを覚えていたので、もしかしたらシングルクォーテーションをなくせばうまくいくのではと思ったのがきっかけだ。