"?"之间的区别和" @ NAME"何时指定参数占位符?

时间:2014-08-22 18:22:05

标签: sql asp.net commandparameter

如果有,下列传递参数的方法有什么区别。

SQLStr = "SELECT * FROM TABLE_NAME WHERE ID = ? "
command = new oleDbCommand(SQLStr, conn)
Command.Parameters.AddWithValue("@ID", Request.Querystring("ID"))

Vs以上。

SQLStr = "SELECT * FROM TABLE_NAME WHERE ID = @ID "
Command = new oleDbCommand(SQLStr, conn)
Command.Parameters.AddWithValue("@ID", Request.Querystring("ID"))

也许不是在这个例子中,但这两种方法有不同的含义吗?也许当我需要两次传递相同的值时,我很想使用相同的变量名?

感谢。

1 个答案:

答案 0 :(得分:3)

OleDbCommand不支持命名参数。即使您在当前查询中使用带有@的命名参数,他们的订单重要。目前您只有一个参数,因此您赢了“t = t看到差异。

请参阅:OleDbCommand.Parameters Property

  

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

SELECT * FROM Customers WHERE CustomerID = ?
  

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

请考虑以下具有多个参数的示例:

SQLStr = "SELECT * FROM TABLE_NAME WHERE ID = @ID  AND NAME = @Name";
Command = new oleDbCommand(SQLStr, conn);
Command.Parameters.AddWithValue("@Name", "ABC");
Command.Parameters.AddWithValue("@ID", Request.Querystring("ID")); //'A1'

由于@Name在参数集合中的@ID之前添加,因此查询将如下所示:

SELECT * FROM TABLE_NAME WHERE ID = 'ABC' AND NAME = 'A1`; //assuming ID is A1

请注意,ID获取了NAME参数的值,因此NAME获取了ID的值,这是错误的。