32

在我们的一个应用程序中,参数以这种方式传递给存储过程

Dim parm As New SqlParameter("searchText", SqlDbType.VarChar)
parm.Direction = ParameterDirection.Input
parm.Size = 50
parm.Value="test"

cmd.Parameters.Add(parm)

并且该过程包含一个参数@searchText

即代码传递的参数名是searchText,存储过程中的参数名是@searchText

但它工作正常,我总是得到所需的结果。

所以我的问题是这样的,所以不需要在参数之前指定@?是否会附加@,任何人都可以为此给出答案。

4

5 回答 5

31

根据文档,名称必须以@

ParameterName 以@paramname 的形式指定。

根据源代码(查看SqlCommandSqlParameter.ParameterNameFixed在参考源中)@,如果需要,会自动添加一个。

所以是的,它有效,但它是一个未记录的功能。最佳实践建议您不要依赖此方法,而是手动在参数名称前加上@.

于 2012-04-20T11:43:48.580 回答
2

参考:SqlParameter.ParameterName 属性IDataParameter.ParameterName 属性

ParameterName 以@paramname 的形式指定。您必须在执行依赖参数的 SqlCommand 之前设置 ParameterName。如果您使用 Sql Server 作为数据库,那么您必须在参数名称之前指定 @。

您的参数名称必须与后端相同,例如。那么@searchText在你的参数规范中它必须是SqlParameter("@searchText"..

你的代码应该是这样的

Dim parm As New SqlParameter("@searchText", SqlDbType.VarChar)
parm.Direction = ParameterDirection.Input
parm.Size = 50
parm.Value="test"

cmd.Parameters.Add(parm)

注意:Oracle和 SqLite 使用不同的字符来指定参数,可能有 @ 符号没有使用 ado.net 的规范指定。

编辑:通过评论

当您指定链接时,它也是某种修复,但根据 msdn 文档,无论您使用任何数据提供程序 oledb、sql、odbc,都必须使用“@”指定位置参数。参考

if (0 < parameterName.get_Length() && '@' != parameterName.get_Chars(0))
        {
            parameterName = "@" + parameterName;
        }
于 2012-04-20T11:44:21.343 回答
0

指定@ 不是强制性的。但是,它是最佳实践。

它类似于字符串。在 .NET 中定义这样的字符串当然没有什么坏处:

string s;
//Rest of the code follows;

但同样,将它们定义为:

string s = string.Empty;

你看,这是一个约定和最佳实践的问题!!!

于 2014-06-04T20:22:42.127 回答
0

我建议您在参数名称中使用添加“@”标记。SqlParameter 有助于自动添加,但其他参数可能不会。

于 2015-04-30T19:28:31.983 回答
0

是否需要“@”符号?是和否。当您使用 DbCommand 添加参数时,无论您是否使用 SQL Server,它都是可选的:

// Look Ma no @ required!    
DbCommand command = database.GetStoredProcCommand("StoredProctologistAndGambler");
database.AddInParameter(command, "Bet", DbType.Int32, fromLineNumber);
database.AddOutParameter(command, "Diagnosis", DbType.String, -1);

但是,如果您稍后要引用该命令,则需要“@”前缀。微软认为很难将其转移到 API 的其余部分。

var examResult =  command.Parameters["@Diagnosis"];   // Ma! Microsoft lied! It requires the "@" prefix.
于 2022-01-06T05:51:32.187 回答