SqlException 无法绑定 multi-part 标识符 "A.Column"

SqlException The multi-part identifier "A.Column" could not be bound

我正在使用 SqlDataReader 和 SqlCommand 将以下查询传递到我的数据库

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();

conncomandoconexionString 的初始声明之前已声明,我只是不将它们包括在这里。)

查询可以在 SQL Server Management Studio 中成功执行,并产生预期的结果。

但是在我的 C# 程序中,在尝试执行它时,行 reader = comando.ExecuteReader():

引发了 SqlException

The multi-part identifier "A.Codigo" could not be bound

(对于 select 中的每个 A 列,而不仅仅是 Codigo)

我一直在阅读关于这个问题的其他类似标题的问题,他们中的大多数人说这是 JOIN 缺少对表的引用的问题,但正如您所看到的,JOIN 中使用的两个表被正确引用和别名。此外,正如我所说,查询在 DBMS 中成功执行。

您在查询中的串联之间缺少空格,试试这个:

"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"

如@goldow 所述,您的 SQL 格式错误。在 INNER 之前没有 space 并且它变为 AINNER 因此错误。

                " FROM BuenPrecio.DBO.Producto A" +
                "INNER JOIN BuenPrecio.DBO.Categoria B " +

要消除这些类型的问题,最好使用 string literals。您只需在字符串前加上 @ 符号。它允许你使用 multi-lines 并且你可以更清楚地看到你的查询(但是如果你需要在你的查询中使用任何双引号 " ,请确保你用另一个双引号转义,即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# 中字符串文字的更多信息 Multiline string literal in C#

奖励:与您的问题无关,但切勿在构建 SQL 字符串的动态查询中使用来自不可信来源的输入(例如来自应用程序的数据输入表单)。很难清理这些输入,因此使用参数化查询总是更好。否则,这可能会导致您的应用程序中出现 SQL 注入漏洞。

有关参数化查询的更多信息,请参阅此处: