我正在使用SqlDataReader和SqlCommand将以下查询传递给我的DB
query = "SELECT A.Codigo, A.Descripcion, A.Precio, " +
"A.Cantidad, B.Codigo AS [Código de Categoría], B.Descripcion AS [Descripción de Categoría]" +
" FROM BuenPrecio.DBO.Producto A" +
"INNER JOIN BuenPrecio.DBO.Categoria B " +
"ON A.CodigoCategoria = B.Codigo " +
"ORDER BY A.CodigoCategoria";
SqlDataReader reader;
conn = new SqlConnection(conexionString);
comando.CommandType = CommandType.Text;
comando.CommandText = query;
comando.Connection = conn;
conn.Open();
reader = comando.ExecuteReader();
(conn
、comando
和conexionString
的初始声明是以前声明的,我只是不在这里包括它们。(
该查询可以在SQLServerManagementStudio中成功执行,并产生预期的结果。
但在我的C#程序中,在尝试执行它时,reader = comando.ExecuteReader()
:行引发了SqlException
多部分标识符"A.Codigo";无法绑定
(对于select中的每个A列,而不仅仅是Codigo(
我已经阅读了关于这个问题的其他类似标题的问题,其中大多数都说JOIN缺少对表的引用是个问题,但正如你所看到的,JOIN中使用的两个表都被正确地引用和别名了。此外,正如我所说,查询在DBMS中成功执行。
正如@goldow所提到的,您的SQL格式不正确。在CCD_ 5之前没有空间,它变成CCD_。
" FROM BuenPrecio.DBO.Producto A" +
"INNER JOIN BuenPrecio.DBO.Categoria B " +
要消除这些类型的问题,请使用string literals
。您只需在字符串前面加上@
号。它可以使用多行,您可以更清楚地看到查询(但如果您需要在查询中使用任何双引号"
,请确保使用另一个双引号转义,即2个双引号""
(。
query = @"
SELECT A.Codigo, A.Descripcion, A.Precio,
A.Cantidad, B.Codigo AS [Código de Categoría], B.Descripcion AS [Descripción de Categoría]
FROM BuenPrecio.DBO.Producto A
INNER JOIN BuenPrecio.DBO.Categoria B
ON A.CodigoCategoria = B.Codigo
ORDER BY A.CodigoCategoria
";
有关C中字符串文字的更多信息,请参阅此处#C#中的多行字符串文字
好处:与您的问题无关,但永远不要使用动态查询,在动态查询中,您使用不可靠来源(如应用程序的数据输入表单(的输入构建SQL字符串。清理这些输入非常困难,所以使用参数化查询会更好。否则,这可能会导致应用程序中存在SQL注入漏洞。
有关参数化查询的更多信息,请参阅此处:
如何将SqlDataReader与c#中的参数化查询一起使用?
如果查询中的串联之间缺少空格,请尝试以下操作:
"SELECT A.Codigo, A.Descripcion, A.Precio," +
" A.Cantidad, B.Codigo AS [Código de Categoría], B.Descripcion AS [Descripción de Categoría]" +
" FROM BuenPrecio.DBO.Producto A" +
" INNER JOIN BuenPrecio.DBO.Categoria B" +
" ON A.CodigoCategoria = B.Codigo " +
" ORDER BY A.CodigoCategoria"