C#中命令参数的前导(@)与否的区别是什么?

时间:2014-04-27 06:05:30

标签: c# sql-server sqlcommand oraclecommand

C#中SqlCommand的参数名称中是否有前导字符(@:)有什么区别?

command.CommandText = "SELECT * FROM myTable WHERE name = @myName";
command.Parameters.Add(new SqlParameter("@myName", "bob"));

但这没关系

command.Parameters.Add(new SqlParameter("myName", "bob"));

即使这样也可以

command.Parameters.Add("myName", "bob");

我没有测试第二个,但我可以在互联网上看到所有这些。

我已经尝试过反对Oracle,无论是否有:都可以使用。

哪个更好,还是一样?

2 个答案:

答案 0 :(得分:3)

如果不指定,则会自动添加

@。检查source code此处:

internal string ParameterNameFixed {
    get {
        string parameterName = ParameterName;
        if ((0 < parameterName.Length) && ('@' != parameterName[0])) {
            parameterName = "@" + parameterName;
        }
        Debug.Assert(parameterName.Length <= TdsEnums.MAX_PARAMETER_NAME_LENGTH, "parameter name too long");
        return parameterName;
    }
}

这是为您的命令生成SQL查询字符串时使用的属性。

答案 1 :(得分:0)

参数之前的@告诉sql解释器它是一个参数而不是别的。

如果省略,可能有效,因为列名和参数名之间可能存在歧义。

在你的情况下:

SELECT * FROM myTable WHERE name = @myName
即使您有一个名为myName的列,

也能正常工作,但是:

SELECT * FROM myTable WHERE name = myName

工作,因为无论您是引用列myName还是参数myName,sql解释器都会感到困惑。