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

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

于 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 回答