2012-01-16 99 views
0

最近我一直在写参数化查询是这样的:ASP /参数化查询如何工作?

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。该参数如何知道它将在查询的第一个问号(?)中使用?我是否必须以与问号相同的顺序追加参数,或者它与哪个订单无关?另外,如果我想将用户输入添加到两列,我使用两个参数还是可以使用同一个参数?

任何帮助感激地收到。这已经在我脑海里数周了,所以真的很期待解释:)

回答

5

在参数化查询中,数据库用它们添加顺序中的参数替换问号。

所以COLUMN1参数将进入问号1,列2参数将进入问号2和栏3参数将进入问号3

更多check

+0

对,所以附加在同一顺序的新参数查询是必要的。谢谢澄清。所以这意味着我最后一个问题,我可以使用两列相同的参数,是否为假? – TheCarver 2012-01-16 20:10:01

+0

你可以,但你必须追加两次 – 2012-01-16 20:11:35

+0

我现在明白了参数,谢谢。 – TheCarver 2012-01-16 20:14:25

1

如果使用的是问号, parameters参数必须按照您希望在查询中使用它们的顺序追加到Parameters集合中。

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

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

+0

再次感谢您的意见。不幸的是,和你的答案一样好,伊曼纽尔先到了那里。我现在完全了解参数如何工作:) – TheCarver 2012-01-16 20:13:37

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语句或当CommandType设置为Text时由 OleDbCommand调用的存储过程。在这种情况下,必须使用 问号(?)占位符。

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

+0

感谢您的输入。你说我不能在OLE DB.NET中使用命名参数。这是否意味着我可以在所有Classic ASP方案中使用命名参数? – TheCarver 2012-01-16 21:13:40

+0

不是100%肯定的,我几年以来没有做过Classic ASP,但我相信如果你在SQL Server中使用存储过程,那么是的。您可能必须将命令的NamedParameters设置为True。请参阅MSDN上的[(旧)文章](http://msdn.microsoft.com/zh-cn/library/aa496035) – 2012-01-16 21:22:27

1

当您使用以下,你有没有约束的名字的参数,因此他们必须通过自己的顺序位置来填充,但是,它是幸运的,你按照正确的顺序绑定的名称参数:

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

当您绑定的名字参数,你可以不喜欢重复使用它们,从而节省时间和内存调皮的事情:

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