てぃぐれのプログラマwiki

ワクワクに従う

sqlparameter Geomertryを使って躓く【C#,Blazor】

経緯

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 + "%") というようなやり方でうまくいったのを覚えていたので、もしかしたらシングルクォーテーションをなくせばうまくいくのではと思ったのがきっかけだ。