区分C#SqlConnection中具有相同名称的2个SQL列名

我在SQL查询中使用不同的别名两次加入相同的2个表,使我能够选择2个(可能但不总是)不同的地址ID,然后链接到地址表。

SELECT C.court_id, C.court_name, CA.court_address, CA2.court_address... FROM court C " + JOIN court_addr CA ON C.court_addr_id = CA.court_addr_id " + JOIN court_addr CA2 ON C.court_postal_addr_id = CA2.court_addr_id " + ... 

现在,当尝试使用ASP.NET C#输出此查询的结果时,我不确定如何指定Response.Write中的两个地址中的哪一个。 将别名放在列名称前面(如下面的第4个字符串值)不起作用并引发错误。 有没有办法区分C#中的两个地址,尽管它们在数据库中都有相同的列名?

 while (myDataReader.Read()) { string court_id = myDataReader["court_id"].ToString(); string court_name = myDataReader["court_name"].ToString(); string court_address = myDataReader["court_address"].ToString(); string court_postal_address = myDataReader["CA2.court_address"].ToString(); etc..... 

提前感谢你

您应该在sql中使用别名来区分它们,然后您将能够返回正确的值:

 SELECT C.court_id, C.court_name, CA.court_address as CACourtAddress, CA2.court_address as CA2CourtAddress FROM court C " + JOIN court_addr CA ON C.court_addr_id = CA.court_addr_id " + JOIN court_addr CA2 ON C.court_postal_addr_id = CA2.court_addr_id " + ... 

您应该使用别名来区分具有相同名称的两个列,如:

 SELECT C.court_id, C.court_name, CA.court_address CourtAddress, CA2.court_address CourtPostalAddress FROM court C JOIN court_addr CA ON C.court_addr_id = CA.court_addr_id JOIN court_addr CA2 ON C.court_postal_addr_id = CA2.court_addr_id 

然后在C#中,您可以非常轻松地访问它们:

  string court_id = myDataReader["court_id"].ToString(); string court_name = myDataReader["court_name"].ToString(); string court_address = myDataReader["CourtAddress"].ToString(); string court_postal_address = myDataReader["CourtPostalAddress"].ToString(); 

我希望这有助于解决你的问题:)

如果无法修改查询,则可以通过索引访问列。

 var foo = MyDataReader[0].ToString(); 

或者您可以在sql语句中使用AS关键字修改查询。

 SELECT foo AS bar FROM Baz 

除了提供bluefeet建议的列名别名外,另一种方法是通过索引而不是按C#中的名称访问值。

 string theValue = myReader[0] as string ?? String.Empty; 

然而,这要求列的顺序永远不会改变,因此要小心使用。 此外,这仅适用于您在SQL语句中按给定顺序按名称专门选择列。

这可能不适用于SELECT * ,因为返回列的顺序未在SELECT *修复。