我在我的c#程序中写了一个查询,当我以这种方式键入它时它工作正常:
query = " SELECT sa.f1 sort, fb.f5 dl, fa.f7 sh " +
" FROM TC_OBJ2LINK with (nolock) " +
" join tp_zag with (nolock) on tp_zag.f_key = f_obj_KEY " +
" left join tp_zag_s sa with (nolock) on sa.f_parentkey = tp_zag.f_key and sa.f_row = 1 " +
" left join tp_zag_f fa with (nolock) on fa.f_parentkey = tp_zag.f_key and fa.f_row = 1 " +
" left join tp_zag_f fb with (nolock) on fb.f_parentkey = tp_zag.f_key and fb.f_row = 2 " +
" WHERE F_OBJ_TYPE = 3 ";
但当我以这种方式编写时,它会返回无法与fa.f7
绑定的错误:
query = @"
SELECT sa.f1 sort, fb.f5 dl, fa.f7 sh
FROM TC_OBJ2LINK with (nolock)
join tp_zag with (nolock) on tp_zag.f_key = f_obj_KEY
left join tp_zag_s sa with (nolock) on sa.f_parentkey = tp_zag.f_key and sa.f_row =1
left join tp_zag_f fa with (nolock) on fa.f_parentkey = tp_zag.f_key and fa.f_row = 1
left join tp_zag_f fb with (nolock) on fb.f_parentkey = tp_zag.f_key and fb.f_row = 2
WHERE F_OBJ_TYPE = 3 ";
这2个查询有什么区别?为什么我在第二个查询中出错?
答案 0 :(得分:2)
在第二个查询中,尽管您已经在多行中编写了查询,但它们之间没有任何空格,就像在第一个查询中一样。因此,您在第二个查询中有语法错误。当我们想要逐字编写字符串时,使用运算符@
。
正如here所述:
文字是你如何将字符串硬编码到C#程序中的。那里有两个 C#中的字符串文字类型 - 常规字符串文字和逐字 字符串文字。常规字符串文字类似于许多字符串文字 其他语言,如Java和C - 它们以“,和”开头和结尾 各种字符(特别是“本身,\和回车 (CR)和换行(LF))需要“转义”才能表示出来 串。逐字字符串文字几乎允许任何内容 他们,并在第一个结束时“没有加倍。甚至马车 返回和换行可以出现在文字中!获得“内部 字符串本身,你需要写“”。逐字字符串文字是 在开头报价之前加上@来区分。这里有一些 两种文字的例子,以及它们的含义:
您在代码方面遇到的错误如下:
SELECT sa.f1 sort, fb.f5 dl, fa.f7 sh
FROM TC_OBJ2LINK with (nolock)
将被解释为
SELECT sa.f1 sort, fb.f5 dl, fa.f7 shFROM TC_OBJ2LINK with (nolock)
答案 1 :(得分:0)
你没有直接这样做,但我觉得你在这里问@
。是的,它会为你处理转义,但你改变了整个字符串,并且没有要转义的字符。在这种情况下,尝试在屏幕上打印字符串并查看其实际值以解决这些谜团。