【问题标题】:What's the difference with or without the leading (@) for a command parameter in C#C# 中的命令参数带或不带前导 (@) 有什么区别
【发布时间】:2014-04-27 06:05:30
【问题描述】:

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,无论是否使用 :,两者都有效。

那么哪个更好,还是一样?

【问题讨论】:

    标签: c# sql-server sqlcommand oraclecommand


    【解决方案1】:

    @ 在您未指定时会自动添加。在此处查看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 查询字符串时使用的属性。

    【讨论】:

      【解决方案2】:

      参数前的@告诉sql解释器它是一个参数,没有别的。

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

      在你的情况下:

      SELECT * FROM myTable WHERE name = @myName
      

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

      SELECT * FROM myTable WHERE name = myName
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-16
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多