ASP /参数化查询如何工作?

时间:2012-01-16 19:57:34

标签: asp.net asp-classic

最近我一直在写这样的参数化查询:

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 个答案:

答案 0 :(得分:5)

在参数化查询中,数据库将问题标记替换为添加顺序的参数。

因此column1参数将进入问号1,column2参数将进入问号2,而column3参数将进入问号3

了解更多check

答案 1 :(得分:1)

如果您使用的是问号,则参数集必须按照您希望在查询中使用的顺序附加到“参数”集合中。

  

使用Append按定义顺序将其他参数添加到Parameters集合中。   资料来源:ADO collections documentation, number 2

查询中的每个参数都需要将一个参数附加到Parameters集合中。在您的示例查询中,查询中的3个参数(无论是否为用户输入)表示参数集合中必须存在3个参数,并且它们必须按照它们在查询字符串中出现的顺序进行追加。

答案 2 :(得分:1)

另请注意,您可以使用命名参数,在这种情况下,附加参数的顺序不再重要,因为它们与名称匹配。在使用SQL Server提供程序的ADO.NET中:

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 Provider

  

OLE DB .NET提供程序不支持传递的命名参数   SQL语句或由a调用的存储过程的参数   CommandType设置为Text时的OleDbCommand。在这种情况下,   必须使用问号(?)占位符。

     

因此,将OleDbParameter对象添加到的顺序   OleDbParameterCollection必须直接对应于的位置   命令文本中参数的问号占位符。

答案 3 :(得分:1)

当您使用以下内容时,您没有按名称绑定参数,因此它们必须按其序号位置填充,但幸运的是,您按正确的顺序绑定了名称参数:

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

当你按名称绑定参数时,你可以做一些棘手的事情,比如重用它们,节省时间和内存:

SQL = " INSERT INTO myTable (column1, column2, column3) VALUES (@a, @b, @a); "