В asp classic можно ли передать параметр в простой sql? - PullRequest
0 голосов
/ 02 августа 2011

Я видел другие вопросы ...

Возможно ли это

    SQLStmt.CommandText = "select * from table where id=@id"
     SQLStmt.Parameters.Append SQLStmt.CreateParameter("id", adInteger, _
      adParamReturnValue)
     ' Set value of Param1 of the default collection to 22
     SQLStmt("id") = 22

Set SQLStmt.ActiveConnection = PropConnection
RSProp.Open SQLStmt

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Подход Я рекомендовал перед объявить переменные и связать их с параметрами, а затем обратиться к переменным в фактическом операторе SQL.

DECLARE @id = ?;
select * from table where id=@id

Вы все еще должны привязывать параметры позиционно, но вы можете продолжать использовать именованные переменные в своих инструкциях SQL, и, как плюс, если вы используете одну и ту же переменную более одного раза, вам нужно связать ее только один раз.

0 голосов
/ 03 августа 2011

Ответ НЕТ . Как обычно глупый старый школьный VB и asp полны дыр, глюков и бессмысленности.

Таким образом, я включил этот маленький класс в качестве оболочки и позволил мне передавать простые строки с @ префиксными именами переменных и генерировать неименованный параметр sql для отправки обратно на сервер sql.

Это может показаться глупым, но для меня то, что я могу написать свои SQL-отчеты просто, такие как Select field1,field2,field3 from table where field1 =@field1 and field2 = @field2, было для меня чрезвычайно ценно. Я включил пример использования этого кода внизу.

Может быть, я даю себе ложное чувство безопасности, но мне кажется, что я не только блокировал атаки с использованием SQL-инъекций с помощью параметризованных запросов, я также добавил еще один уровень блокировки, так как у меня установлены строки SQL как постоянные.

Class SQLBuilder

Private Sub Class_Initialize(  )
    Set internal_commandObject = Server.CreateObject("ADODB.Command")
End Sub

Private internal_sql
Private internal_parameters
private internal_commandObject

Public Property Let CommandType(ByVal value)
    internal_commandObject.CommandType = value
End Property

Public Property Get CommandType
    CommandType = internal_commandObject.CommandType
End Property

Public Property Let Prepared(ByVal value)
    internal_commandObject.Prepared = value
End Property

Public Property Get Prepared
    Prepared = internal_commandObject.Prepared
End Property

Public Property Get SQLCommandObject
Set SQLCommandObject = internal_commandObject
End Property

Public Property Let SQLCommandObject(ByVal value)
Set internal_commandObject = value
End Property

Public Property Get CommandText
    CommandText = internal_commandObject.CommandText
End Property

Public Property Let CommandText(ByVal sqlStatement)
    GetSQLParameters sqlStatement
    internal_commandObject.CommandText =  internal_sql
End Property

Public Property Get Parameters
    Set Parameters = internal_parameters
End Property

Private matches

Public Function SetParameter(name,datatype,direction,size,value)
 internal_commandObject.Parameters.Append internal_commandObject.CreateParameter(name,datatype,direction,size,value)
End Function 

Private Sub GetSQLParameters(sql)

    Set RegExObj = New RegExp

    With RegExObj
        .Global = true
        .Multiline = true
        .Pattern = "@\S+"
        .IgnoreCase = true
    End With

    Set internal_parameters =  CreateObject("Scripting.Dictionary")

    set matches = RegExObj.Execute(sql)

    With internal_parameters
        For each item in matches
        if Not .Exists(item.value) then  
            .Add item.value,item.value
        end if
        Next

    End With
    internal_sql = RegExObj.Replace(sql,"?")
End Sub
End Class

Public Const GET_PROPERTY_INFO = "select AccountNumber, ParcelID, UserAccount, LocationLookup, StreetNumber, Unit, OwnerLookup, LUC, NBC, isnull(TotalLand,0) as TotalLand, UpdtDate from STAGE.DataProperty where FISCAL_YEAR = @FISCAL_YEAR AND AccountNumber = @ACCOUNT_NUMBER"
Dim Temp
Dim mySqlBuilder
set mySqlBuilder = new SQLBuilder

With mySqlBuilder
    set .SQLCommandObject.ActiveConnection = PropConnection
    .CommandType = adCmdText
    .CommandText = GET_PROPERTY_INFO
    .Prepared = true
    .SetParameter "@FISCAL_YEAR",adInteger,adParamInput,4,Cint(Year)
    .SetParameter "@ACCOUNT_NUMBER",adVarChar,adParamInput,13,AccountNumber
End With

    RSProp.Open mySqlBuilder.SQLCommandObject
...