読者です 読者をやめる 読者になる 読者になる

誤解されたままはつらいので

埋め込みクエリには System.Text.StringBuilder を活用すべし - 憂国なプログラマ - Yahoo!ブログで、
「StringBuilder は不要じゃ?」と指摘を入れたところ、ちょっとした誤解を与えてしまったようで、誤解を解こうとしたものの、なにやらブロックされてしまった・・・?
ので、ここを読んでくれることを期待してちょっと言い訳 (?) をさせてください。


まず、こちらの主張は、
SQL を分かりやすく整形するのに StringBuilder を持ち出すまでもない」
というものです。
元のエントリで、

Dim query As New System.Text.StringBuilder()
With query
    .AppendLine("-- CompanyName.TechnologyName.FeatureName.ClassName.MethodName")
    .AppendLine("SELECT ")
    .AppendLine("   c.id, ")
    .AppendLine("   c.code, ")
    .AppendLine("   c.name, ")
    .AppendLine("   c.zipcode, ")
    .AppendLine("   c.address, ")
    .AppendLine("   c.telphone ")
    .AppendLine("FROM ")
    .AppendLine("   customer ")
    .AppendLine("WHERE c.id = @id ")
    .AppendLine("AND   c.name LIKE CONCAT( '%', @name, '%' ))
    ・・・・
End With

Dim command As New SqlCommand(query.ToString())
With command.Parameters
    .Add(New SqlParameter("id", id))
    .Add(New SqlParameter("name", name))
End With

となっている部分を、

Dim query As String = "-- CompanyName.TechnologyName.FeatureName.ClassName.MethodName" & vbCrLf _
                    & "SELECT " & vbCrLf _
                    & "   c.id, " & vbCrLf _
                    & "   c.code, " & vbCrLf _
                    & "   c.name, " & vbCrLf _
                    & "   c.zipcode, " & vbCrLf _
                    & "   c.address, " & vbCrLf _
                    & "   c.telphone " & vbCrLf _
                    & "FROM " & vbCrLf _
                    & "   customer " & vbCrLf _
                    & "WHERE c.id = @id " & vbCrLf _
                    & "AND   c.name LIKE CONCAT( '%', @name, '%' ))" & vbCrLf _
                    ・・・・
End With

Dim command As New SqlCommand(query)
With command.Parameters
    .Add(New SqlParameter("id", id))
    .Add(New SqlParameter("name", name))
End With

でもいいよね?と、まとめればこの一点に尽きます。
しかし、最初無精してしまったんですよね・・・

Dim query As String = "SELECT " & vbCrLf _
& " c.id, " & vbCrLf ...

埋め込みクエリには System.Text.StringBuilder を活用すべし - 憂国なプログラマ - Yahoo!ブログ

これだけのコード片だけでは伝わらなかったようで、それでは SQL インジェクションに対して脆弱だ、と返されました。
でも、言いたかったコードを見てもらえば分かるとおり、SQL の組み立てに文字列連結を使用するか、StringBuilder を使用するかというのは無関係です。
また、可読性・・・そもそも SQL を他言語に直接埋め込むことの是非を置いておいたとして、そんなに可読性は変わらないですよね?


また、

普通に ManagimentStudio や NaviCat でクエリ書いて、
構文や性能をチェックした後に
「.AppnedLine("」と「")」でサンドしてやるだけです。


この方がよっぽど作業が速いし、サーバーチームからも
綺麗に改行&インデントが入っているので喜ばれます。(^ω^)v

埋め込みクエリには System.Text.StringBuilder を活用すべし - 憂国なプログラマ - Yahoo!ブログ

とあるように、文字列組み立てでは改行とインデントがあたかも入れられないような誤解をしていると感じたため、

・vbCrLf の意味は分かっていますか?
・パラメータの SQL へのバインドに文字列結合を使用すると誤読していませんか?

埋め込みクエリには System.Text.StringBuilder を活用すべし - 憂国なプログラマ - Yahoo!ブログ

と確認を入れたのですが、

> ・vbCrLf の意味は分かっていますか?
言わずもがな。でもわたし嫌いなんですw


> ・パラメータの SQL へのバインドに文字列結合を使用すると誤読していませんか?
読み方によってはそう取れますよ。

埋め込みクエリには System.Text.StringBuilder を活用すべし - 憂国なプログラマ - Yahoo!ブログ

うーん、vbCrLf が分かっているなら、これまでのやりとりは一体何だったんだ?
嫌いなら嫌いだと言えばいいと思うんですが・・・
嫌いなことを理由に、文字列結合でもできることをあたかもできないかのように書くのはだめだと思います。


また、「読み方によってはそう取れます」とのことですが、なんど読み返してもさすがにそう誤読するような書き方ではないと (自分では) 思うんですよね・・・
例えば、もし誤読していたとしても、以下のコメントを読めばその誤解は解けると思うんですよね。

もしや、文字列連結では SQL インジェクション対策にならない・・・と?
もう一度、よく考えてみてください。
SQL インジェクションに対策している部分は、StringBuilder を使用している部分ではなく、SqlParameter を使用している部分です。
これは、文字列結合であるかどうかは全く関係ありません。

埋め込みクエリには System.Text.StringBuilder を活用すべし - 憂国なプログラマ - Yahoo!ブログ


まとまらない・・・
なんか後で追記するかも。