如何减少这个StringBuilder函数?

时间:2013-11-08 13:33:03

标签: vb.net visual-studio-2010 stringbuilder

我在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.

但是,我觉得这段代码太乱了。我怎么能让它更有效率,或者至少更清洁一点?

3 个答案:

答案 0 :(得分:1)

你有没有使用string.format的原因?所以像这样:

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

有关详细信息,请参阅String.Format() documentation

编辑:正如Jon Skeet在下面指出的那样,以这种方式构建SQL是一个坏主意,让您容易受到SQL注入攻击。有关缓解的详细信息,请参阅http://en.wikipedia.org/wiki/SQL_injection

答案 1 :(得分: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.

答案 2 :(得分:0)

上述代码的更清晰版本以及sql-injection攻击保护:

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

我已经返回了SqlCommand对象以避免sql注入攻击。