0

Visual Basic .net プログラムに、いくつかのパラメーターを取り、それらを追加して文字列を形成する関数があります。結果は、メイン プログラムに返される有効な SQL コマンドです。

問題のコード:

Private Function StringBuilderCommand(Field, Table, CurrentCellValue, SearchParameter)
    'Creates a suitable SQL string.
    Dim MyStringBuilder As New StringBuilder("SELECT ")
    MyStringBuilder.Append(Field) ' Append the parameter 'Field'.
    MyStringBuilder.Append(" FROM ") ' Append the SQL command 'FROM'.
    MyStringBuilder.Append(Table) ' Append the parameter 'Table'.
    MyStringBuilder.Append(" WHERE ") ' Append the SQL command 'WHERE'.
    MyStringBuilder.Append(SearchParameter) ' Append the parameter 'SearchParameter'.
    MyStringBuilder.Append("=""")
    MyStringBuilder.Append(CurrentCellValue) ' Append the parameter 'CurrentCellValue', representing the cell selected.
    MyStringBuilder.Append("""") 'Append a quotation mark.

    Return MyStringBuilder.ToString() ' Return it to the main program.

しかし、このコードはごちゃごちゃしすぎているように感じます。どうすればより効率的に、または少なくとも見やすくすることができますか?

4

3 に答える 3

1

string.format を使用しない理由はありますか? だから、このようなもの:

String.Format("SELECT {0}  FROM {1} WHERE {2} = {3}", _
              field, table, searchparameter, currentcellvalue)

詳細については、 String.Format() のドキュメントを参照してください。

編集: Jon Skeet が以下で指摘しているように、この方法で SQL を構築することは悪い考えであり、SQL インジェクション攻撃に対して脆弱になります。軽減策の詳細を含む詳細については、http://en.wikipedia.org/wiki/SQL_injectionを参照してください。

于 2013-11-08T13:36:49.513 に答える
0

上記のコードのよりクリーンなバージョンと、SQL インジェクション攻撃からの保護:

Private Function StringBuilderCommand(Field, Table, CurrentCellValue, SearchParameter) 'Creates a suitable SQL string.
    Dim MySqlCommand As New SqlCommand()
    Dim MyStringBuilder As New StringBuilder("")
    MyStringBuilder.Append("SELECT @Field FROM @Table WHERE @SearchParameter = @CurrentCellValue")

    MySqlCommand.CommandText = MyStringBuilder.ToString()
    MySqlCommand.Parameters.Add("@Field", Field)
    MySqlCommand.Parameters.Add("@Table", Table)
    MySqlCommand.Parameters.Add("@SearchParameter", SearchParameter)
    MySqlCommand.Parameters.Add("@CurrentCellValue", CurrentCellValue)

    Return MySqlCommand

SQL インジェクション攻撃を避けるために、SqlCommand オブジェクトを返しました。

于 2013-11-10T07:51:17.240 に答える
0

これにより、少なくともタイピングと混乱が少なくなります。

    'Creates a suitable SQL string.
    Dim MyStringBuilder As New StringBuilder("SELECT ")
    With MyStringBuilder
        .Append(Field)    ' Append the parameter 'Field'.
        .Append(" FROM ") ' Append the SQL command 'FROM'.
        .Append(Table)    ' Append the parameter 'Table'.
        .Append(" WHERE ") ' Append the SQL command 'WHERE'.
        .Append(SearchParameter) ' Append the parameter 'SearchParameter'.
        .Append("=""")
        .Append(CurrentCellValue) ' Append the parameter 'CurrentCellValue'
        .Append("""")    'Append a quotation mark.
    End With
    Return MyStringBuilder.ToString() ' Return it to the main program.
于 2013-11-08T13:36:30.017 に答える