我在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.
但是,我觉得这段代码太乱了。我怎么能让它更有效率,或者至少更清洁一点?
答案 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注入攻击。