sql server-What';s C#中命令参数带或不带前导(@)的区别

本文关键字:区别 参数 server-What 命令 sql | 更新日期: 2023-09-27 18:00:25

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

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

sql server-What';s C#中命令参数带或不带前导(@)的区别

@在您未指定时会自动添加。请查看此处的源代码:

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

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

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

在您的情况下:

SELECT * FROM myTable WHERE name = @myName

即使您有一个名为myName的列,也能正常工作,但这个:

SELECT * FROM myTable WHERE name = myName

将不起作用,因为sql解释器会混淆您是指列myName还是指参数myName