Как использовать переменные 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
Пара вещей, которые помогут вам в будущем
- использование
Option Explicit
чтобы избежать скрытых проблем, которые вернутся к вам позже - использование
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