Как использовать переменные ASP в выражении SQL

<%
postit = request.querystring("thispost")
response.write(postit)
%> 

postit переменная response.write работает, и это все выше оператора SQL ниже.

Это SQL, однако, когда я добавляю postit Переменная я получаю это сообщение об ошибке:

delCmd.CommandText="DELETE * FROM post WHERE (pos_ID = postit )"
Microsoft Access Database Engine error '80040e10'
No value given for one or more required parameters. 
/student/s0190204/wip/deleterecord.asp, line 32

6 ответов

Решение

Добавьте параметр в SQL:

delCmd.CommandText="DELETE * FROM post WHERE (pos_ID = ?)"
delCmd.Parameters.Append delCmd.CreateParameter("posid", adInteger, adParamInput)   ' input parameter
delCmd.Parameters("posid").Value = postit

Пара вещей, которые помогут вам в будущем

  1. использование Option Explicit чтобы избежать скрытых проблем, которые вернутся к вам позже
  2. использование ADODB.Command объект, который является очень универсальным, позволяющим выполнять различные вызовы базы данных, от простых динамических операторов SQL до хранимых процедур без риска внедрения SQL.

Есть несколько советов, которые могут ускорить процесс при использовании ADODB.Command объект в вашем коде, который будет продемонстрирован в примере ниже (предполагается, что у вас уже есть строка подключения, сохраненная в вызове глобальной конфигурации gs_connstr);

<%
Option Explicit

Dim postit
postit = Request.QueryString("thispost")
'Always do some basic validation of your Request variables
If Len(postit) > 0 And IsNumeric(postit) Then CLng(postit) Else postit = 0

Dim o_cmd, o_rs, a_rs, i_row, i_rows, l_affected
Dim SQL

'SQL statement to be executed. For CommandType adCmdText this can be any dynamic
'statement, but adCmdText also gives you an added bonus - Parameterised Queries
'instead of concatenating values into your SQL you can specify placeholders (?)
'that you will define values for that will get passed to the provider in the order
'they are defined in the SQL statement.
SQL = "DELETE * FROM post WHERE (pos_ID = ?)"

Set o_cmd = Server.CreateObject("ADODB.Command")
With o_cmd
  'ActiveConnection will accept a Connection String so there is no need
  'to instantiate a separate ADODB.Connection object the ADODB.Command object
  'will handle this and also open the connection ready.
  .ActiveConnection = gs_connstr
  .CommandType = adCmdText
  .CommandText = SQL
  'When using Parameters the most important thing to remember is the order you
  'appended your parameters to the Parameters collection as this will determine
  'the order in which they are applied to your SQL query at execution. Because
  'of this the name you give to your parameters is not important in terms of
  'execution but I find specifying a meaningful name is best (especially when
  'revisiting some code a few years down the line).
  Call .Parameters.Append(.CreateParameter("@pos_ID", adInteger, adParamInput, 4))
  'Parameter values can be passed in via the Execute() method using an Array
  'without having to define the parameter values explicitly. You can also specify
  'the records affected value to return number of rows affected by a DELETE,
  'INSERT or UPDATE statement.
  .Execute(l_affected, Array(postit))
End With
'Always tidy up after yourself, by releasing your object from memory, this will
'also tidy up your connection as it was created by the ADODB.Command object.
Set o_cmd = Nothing
%>

Здесь я пытаюсь получить автомобиль, используя idиз машины. Теперь я могу использовать car_colorзапись установлена ​​в моем коде. Я бы также рекомендовал использовать CLngпри передаче значений это предотвратит инъекции sql.

Если carIDне является числом, вы получите следующую ошибку:

«500 ответ от сервера. Не забудьте открыть и закрыть соединение sql».

Вот код:

      sql = "Select * from Cars Where ID = " & clng(carID)
    rs.open
    if not rs.eof then
      carID = rs("car_ID")
      carColor = rs("car_color")
    end if
    rs.close

Попробуйте этот код:

<% Dim postit, stringSQL, objectCon
   postit = request.querystring("thispost")

   Set objectCon = Server.CreateObject("ADODB.Connection")
   objectCon.ConnectionString  "Driver={SQL SERVER};Server=server_name;UID=user_name;PWD=password;Database=database_name" 'SET CONNECTION STRING OF YOUR DATABASE
   stringSQL = "DELETE FROM post WHERE pos_id='" & postit & "'"

   objectCon.Open
   objectCon.Execute(stringSQL)
   objectCon.Close() %>

Вы не передаете значение postit для доступа; вместо этого вы говорите Access найти и использовать переменную с именем postit, Конечно, указанная переменная не существует в Access - она ​​существует только в вашем коде. Исправление - это всего лишь пара кавычек и пара амперсандов.

delCmd.CommandText="DELETE * FROM post WHERE (pos_ID = " & postit & " )"

(Естественно, вы должны проверить postit прежде чем отправлять его в свою базу данных. Просто CDbl() может сделать трюк, предполагая, что это числовое значение.)

Этот способ удобнее удалять, когда он не нужен для проверки набора записей:

cn.open "yourconnectionstring"
cn.execute "DELETE * FROM post WHERE pos_ID = " & request.querystring("thispost")
cn.close
Другие вопросы по тегам