0

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,并且无论是否使用:.

那么哪个更好,或者它们是一样的?

4

2 回答 2

3

@不指定时会自动添加。在此处查看源代码

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 查询字符串时使用的属性。

于 2014-04-27T06:16:51.787 回答
0

before 参数告诉 sql 解释器它是一个参数,仅此@而已。

如果您省略它,它可能会起作用,因为列名和参数名之间可能存在歧义。

在你的情况下:

SELECT * FROM myTable WHERE name = @myName

即使您有一个名为 的列,也可以正常工作myName,但是:

SELECT * FROM myTable WHERE name = myName

不起作用,因为无论您是指的是 columnmyName还是 parameter ,sql 解释器都会感到困惑myName

于 2014-04-27T06:12:25.020 回答