ASP / Как работают параметризованные запросы? - PullRequest
0 голосов
/ 16 января 2012

В последнее время я пишу параметризованные запросы, как это:

SQL = " INSERT INTO myTable (column1, column2, column3) VALUES (?, ?, ?); "

Set newParameter = cmdConn.CreateParameter("@column1", ad_Integer, ad_ParamInput, Len(input1), input1)
cmdConn.Parameters.Append newParameter
Set newParameter = cmdConn.CreateParameter("@column2", ad_Integer, ad_ParamInput, Len(input2), input2)
cmdConn.Parameters.Append newParameter
Set newParameter = cmdConn.CreateParameter("@column3", ad_Integer, ad_ParamInput, Len(input3), input3)
cmdConn.Parameters.Append newParameter

И я понял, что, когда я использовал @ column1 при добавлении нового параметра, он назначал этот параметр этому конкретному столбцу в запросе ... но недавно мне сообщили об обратном. Это вызвало некоторую путаницу и возникло несколько вопросов.

Возьмите вышеуказанный параметр, @ column1. Откуда этот параметр знает, что он будет использоваться в первом вопросительном знаке (?) Запроса? Нужно ли добавлять параметры в том же порядке, что и знаки вопроса, или не имеет значения, в каком порядке? Кроме того, если я хочу добавить пользовательский ввод в два столбца, использовать ли два параметра или один и тот же?

Любая помощь с благодарностью получена. Это было в моей голове в течение нескольких недель, поэтому очень жду объяснений:)

Ответы [ 4 ]

5 голосов
/ 17 января 2012

В параметризованных запросах база данных заменяет вопросительные знаки параметрами в порядке их добавления.

Таким образом, параметр column1 войдет в вопросительный знак 1, параметр column2 войдет в вопросительный знак 2, а параметр column3 войдет в вопросительный знак 3

Для более отметьте

1 голос
/ 19 января 2012

Когда вы используете следующее, вы не связываете параметры по имени, поэтому они должны быть заполнены их порядковым положением, но, к счастью, вы связали параметры имени в правильном порядке:

SQL = " INSERT INTO myTable (column1, column2, column3) VALUES (?, ?, ?); "

Когда вы связываете параметры по имени, вы можете делать такие хитрые вещи, как их повторное использование, экономя время и память:

SQL = " INSERT INTO myTable (column1, column2, column3) VALUES (@a, @b, @a); "
1 голос
/ 17 января 2012

Также обратите внимание, что вы можете использовать именованные параметры, и в этом случае порядок добавления параметров больше не имеет значения, поскольку они сопоставляются по имени. В ADO.NET с использованием поставщика SQL Server:

Dim CommandText as String = "SELECT * FROM Table WHERE ColumnA = @A AND ColumnB = @B"
Dim command As New SqlCommand(CommandText)

''#Parameters added in reverse order, still works

command.Parameters.Add(new SqlParameter("@B", 42))
command.Parameters.Add(new SqlParameter("@A", "Test"))

Но это не работает с поставщиком OLE DB .NET :

Поставщик OLE DB .NET не поддерживает именованные параметры для передачи. параметры для оператора SQL или хранимой процедуры, вызываемой OleDbCommand, когда CommandType установлен в текст. В этом случае должен использоваться заполнитель вопросительного знака (?).

Следовательно, порядок, в котором объекты OleDbParameter добавляются в OleDbParameterCollection должен напрямую соответствовать положению заполнитель вопросительного знака для параметра в тексте команды.

1 голос
/ 17 января 2012

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

Используйте «Добавить» для добавления других параметров в коллекцию «Параметры» в порядке определения. Источник: Документация ADO коллекций, номер 2

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...