Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 参数名称前面的@是做什么的?_C#_Sql_Winforms_Visual Studio - Fatal编程技术网

C# 参数名称前面的@是做什么的?

C# 参数名称前面的@是做什么的?,c#,sql,winforms,visual-studio,C#,Sql,Winforms,Visual Studio,在参数SQL查询前面插入@符号时做什么 例如: using (SqlCommand cmd = new SqlCommand("INSERT INTO [User] values (@Forename, @Surname, @Username, @Password)", con)) { cmd.Parameters.AddWithValue("@Forename", txtForename.Text); cmd.Parameters.AddWithValue("@Surname"

在参数SQL查询前面插入@符号时做什么

例如:

using (SqlCommand cmd = new SqlCommand("INSERT INTO [User] values (@Forename, @Surname, @Username, @Password)", con))
{
    cmd.Parameters.AddWithValue("@Forename", txtForename.Text);
    cmd.Parameters.AddWithValue("@Surname", txtSurname.Text);
    cmd.Parameters.AddWithValue("@UserName", txtUsername.Text);
    cmd.Parameters.AddWithValue("@Password", txtPassword.Text);

    cmd.ExecuteNonQuery();
}

没什么神奇的-它只是SQL用来表示参数和局部变量的语法。它与告诉编译器不要处理字符串文本中的转义序列的C@字符不同:

string stringWithSlashes = @"Use '\n' to add a new line";
或者使用保留字作为变量名:

string @class = "Geometry";

这恰恰表明它是查询中的参数名,而不是试图使用列中的字段

Parameters

parameterName
Type: System.String

The name of the parameter.
不清楚在构造SqlParameter对象时是否严格需要它,但我认为保持一致是有意义的:

@表示它是一个输入/输出参数,其值可以从脚本外部传递。

@符号表示参数的名称。使用列中的字段

Parameters

parameterName
Type: System.String

The name of the parameter.

在这种情况下,@是一个SQL Server构造。SQL Server查询的参数使用@符号指定,因为T-SQL Server编程语言使用@符号作为变量

与其他人在这里所说的相反,@角色本身什么都不做。您可以使用

.AddWithValue("ParaName",value);

它们都将与数据库端名为@ParamName的参数匹配。因此,这不是必需的


话虽如此,始终在参数前面使用@是一种非常标准的做法,因为这正是它在数据库端的命名方式。

也可以是一个输出参数:注意:参数名称不需要@,只需要sql语句。是的,我在编程时也这么想,但有人告诉我,如果参数不带@,则意味着我的代码更容易受到SQL注入的攻击,这是真的还是…@Banda根本不是,至少在这种情况下不是!您使用的是参数,它们不容易受到SQL注入攻击。@Banda:SQL注入威胁主要与非参数化查询有关。例如:从表1中选择col1,其中x='+txtName.Text+'。在这里,txtName.Text可以是任何内容,如果查询中也包含了,它可能会中断查询……Oracle使用:并在参数名称中添加:时失败。