2015-05-20 3 views
-1

Im имея вопрос получает строку правильно отформатированную для команды SQL У меня есть три переменных, которые устанавливаются:Правильной ASP конкатенации строк для ASP Классического

Dim pastMonth, currentMonth, futureMonth 
currentMonth = Month(Date()) 
pastMonth = currentMonth-1 
futureMonth = currentMonth+1 

и струна им пытается установить это:

strSQL="SELECT * FROM Project WHERE P_MONTH BETWEEN " & pastMonth &" AND " & futureMonth 

на основе других ресурсов представляется, что & символ является правильное использование для конкатенации переменных, но ошибки указано иначе:

[Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria expression. 

Мысли? Благодарим вас за помощь и помощь.

+1

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

+0

Большой вопрос Martin, в данном конкретном экземпляре, который создает «виды» для сортировки конкретной информации, которая находится в форме выпадающего меню, так что пользователи могут выбирать строковые значения «новые», «удерживаемые», а также назначать запись для конкретный месяц. С помощью этого сочетания я думал, что наиболее подходящим способом будет использование строковых значений. Разве не было бы лучшего способа сделать это? – hexobolic

+0

Я не уверен на 100%, но я думаю, что большинство типов данных могут быть объединены в sql, используя апострофы. Например, целое число может быть помещено в оператор sql следующим образом: '... '" & intValue & "' ...', то же, что и '... '" & strValue & "' ...' и '... '" & dateValue & "' ...'. –

ответ

3

Да, использование амперсанда - способ соединить строки.

Это может быть, что даты требуют апострофа, например:

strSQL="SELECT * FROM Project WHERE P_MONTH BETWEEN '" & pastMonth &"' AND '" & futureMonth & "'" 

Но я настоятельно рекомендую вам изменить подход и использовать параметризованный запрос для выполнения этой операции.

Я использую подобный код в классической осине:

public function select_rst(sql, parameterArray) 
    dim cnx, cmd, i 
    Set cnx=CreateObject("ADODB.Connection") 
    cnx.Open wfDataConnection  
    Set cmd = CreateObject("ADODB.Command") 
    With cmd  
     .CommandText = sql 
     .CommandType = adCmdText 
     .ActiveConnection = cnx 
     if isArray(parameterArray) then    
      for each i in parameterArray 
       .Parameters.Append .CreateParameter(i(0), i(1), i(2), i(3), i(4)) 
      next 
     end if 
    end with 
    Set select_rst = CreateObject("ADODB.Recordset") 
    With select_rst 
     .CursorLocation = adUseClient 
     .Open cmd 
     Set .ActiveConnection = Nothing 
    End With    
    Set cmd = Nothing 
    cnx.close 
    set cnx=nothing  
end function 

Назвать это так:

dim sql, parameterArray 
sql = "SELECT * FROM Project WHERE P_MONTH BETWEEN ? AND ?" 
parameterArray = Array(_ 
        Array("@p1", adInteger, adParamInput, , pastMonth)_ 
        , Array("@p2", adInteger, adParamInput, , futureMonth)_ 
       ) 

set rst = select_rst(sql, parameterArray) 

    '....do stuff with rst... 

set rst = nothing 

Я не слишком уверен, что имена переменных (@ p1, p2 @, и т. д.) при создании параметров. Кажется, не имеет значения, что вы называете переменными, но для этого требуется какое-то имя.

+0

Я очень ценю вашу помощь и благодарю вас за дополнительную информацию о создании параметризованного запроса! Я начну применять этот метод, как только проведу дополнительное тестирование с помощью моего существующего кода. – hexobolic

+0

Этот подход требует, чтобы вы знали тип данных параметра - adInteger, adDbTimestamp, adVarChar и т. Д. –

Смежные вопросы