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

时间:2013-01-02 16:13:17

标签: c# asp.net sql-server

我在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.....

提前感谢你

4 个答案:

答案 0 :(得分:32)

您应该在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 " + ...

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

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

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

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

SELECT foo AS bar FROM Baz

答案 3 :(得分:0)

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

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

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

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