为什么地址符号@用于构建SQL命令?

时间:2011-09-02 19:16:30

标签: c# string verbatim-string

  

可能重复:
  What's the @ in front of a string for .NET?

这个SQL命令中的@是做什么的?它的第一次和第二次出现是否有同样的目的?

static DataTable StaffsGetProjectIDHRCoordinators(SqlConnection conn, string targetDatabase)
{
    try
    {
        SqlCommand cmd = new SqlCommand(@"
            SELECT DISTINCT Staff.*
            FROM Staff
            INNER JOIN " + targetDatabase.Replace("'", "''") + @".dbo.ProjectHRCoordinator ProjectHRCoordinator
            ON Staff.StaffID = ProjectHRCoordinator.HRCoordinatorStaffID
            ORDER BY Staff.FName, Staff.LName", conn);

            return ExecuteDataTable(cmd);
    }
    finally
    {
        if (conn.State != ConnectionState.Closed) conn.Close();
    }
}

在声明存储过程的参数时,我只熟悉@符号。

1 个答案:

答案 0 :(得分:12)

这意味着字符串是逐字字符串文字。 \将不会以特殊方式处理。 \n不是新行,而是斜线和n。对路径非常有用。

通常要包含一个包含C:\Windows\myfile.txt的字符串,您需要使用逐字字符串文字"C:\\Windows\\myfile.txt"来编写@"C:\Windows\myfile.txt"或。

这涵盖在C#规范的2.4.4.5 String literals中:

  
    

逐字字符串文字由@字符后跟双引号字符,零个或多个字符以及结束双引号字符组成。一个简单的例子就是@“你好”。在逐字字符串文字中,分隔符之间的字符是逐字解释的,唯一的例外是quote-escape-sequence。特别是,简单的转义序列和十六进制和Unicode转义序列不会在逐字字符串文字中处理。逐字字符串文字可能跨越多行。

  

我将在你引用的SQL块中添加它,它用于能够在多行中编写脚本而不关闭字符串的每一行。

string str = "A " + 
    "B " + 
    "C";

你可以写

string str = @"A
    B
    C";

请注意,这两个字符串非常不同!第二个包含行尾和对齐空格,但在SQL中这不是问题(SQL中的许多地方都会忽略空格。)

您有可能在单行中编写SQL命令。然后@完全无用,但是许多程序员采用“比安慰更好的安全”并且非常自由地使用它,特别是当它们从其他可能包含\ escapes的地方粘贴文本时: - )