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();
(conn
、comando
和 conexionString
的初始声明之前已声明,我只是不将它们包括在这里。)
查询可以在 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 注入漏洞。
有关参数化查询的更多信息,请参阅此处:
我正在使用 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();
(conn
、comando
和 conexionString
的初始声明之前已声明,我只是不将它们包括在这里。)
查询可以在 SQL Server Management Studio 中成功执行,并产生预期的结果。
但是在我的 C# 程序中,在尝试执行它时,行 reader = comando.ExecuteReader()
:
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 注入漏洞。
有关参数化查询的更多信息,请参阅此处: