【问题标题】:Ambigous column name?列名不明确?
【发布时间】:2015-01-13 18:09:05
【问题描述】:

好吧..我真的找不到问题,所以我在这里发帖。附言我是 MSSQL 的新手,所以请温柔 xD

我得到不明确的列名“名称”

我有两张表:Cardiology 和 Cardio_Schedule。我想从两者中选择一些列并将它们显示为网格视图中的结果。我已经查询了..是这样的:

string str = @"
SELECT Cardiology.CID,
       Cardiology.Name,
       Cardiology.Designation,
       Cardiology.Qualification,
       Cardiology.Shift,
       Cardiology.Appointment_Timings,
       Cardio_schedule.Ward_rounds,
       Cardio_schedule.Slot1,
       Cardio_schedule.Slot2,
       Cardio_schedule.Slot3,
       Cardio_schedule.Slot4,
       Cardio_schedule.BreakTime,
       Cardio_schedule.Slot5,
       Cardio_schedule.Slot6,
       Cardio_schedule.Slot7,
       Cardio_schedule.Slot8
FROM   Cardiology
       CROSS JOIN Cardio_schedule
WHERE  Cardiology.Name = Cardio_schedule.Name
       AND Name = '" + TextBox1.Text + "'";
            cmd = new SqlCommand(str, con);
            con.Open();
            SqlDataAdapter adp = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            adp.Fill(dt);
            GridView1.DataSource = dt;
            GridView1.DataBind();
            con.Close();

IDK 是什么问题。 我确实用 ON 尝试过,但它在“ON”附近说语法不正确。任何形式的帮助将不胜感激。 谢谢!

【问题讨论】:

  • AND Name = '" 中添加一个TheTableName. 限定符到Name,就像在SELECT 列表中一样。
  • 你应该参数化这个,在TextBox1.Text 中添加一个',看看当你运行查询时会发生什么
  • 也使用INNER JOIN ... ON 而不是CROSS JOIN ... WHERE。语义相同,但更容易理解。
  • 如果你真的很害怕,把' --输入你的文本框看看会发生什么。
  • 非常感谢@AlexK。你能把它作为一个正确的答案,以便我可以选择它作为答案吗?再次感谢!

标签: c# asp.net sql-server


【解决方案1】:

您的问题出在过滤器中:-

AND Name = '" + TextBox1.Text + "'";
            cmd = new SqlCommand(str, con);

根据您要引用的表更改它:-

AND Cardiology.Name = '" + TextBox1.Text + "'";
            cmd = new SqlCommand(str, con);

请注意,您的查询对SQL Injection attack 开放,因此您应该使用参数化查询,如下所示:-

string str = "Cardiology.CID,Cardiology.Name, .....WHERE  
              Cardiology.Name = Cardio_schedule.Name
              AND Cardiology.Name = @Name";
cmd = new SqlCommand(str, con);
cmd.Parameters.Add("@Name",DbType.NVarChar,20).Value = TextBox1.Text;
.....and so on

请注意这里我认为你的数据类型是 NVarchar(20),你需要相应地改变它。

【讨论】:

  • 非常感谢@Rahul Singh!
【解决方案2】:

你最后错过了。

SELECT Cardiology.CID,
       Cardiology.NAME,
       Cardiology.Designation,
       Cardiology.Qualification,
       Cardiology.Shift,
       Cardiology.Appointment_Timings,
       Cardio_schedule.Ward_rounds,
       Cardio_schedule.Slot1,
       Cardio_schedule.Slot2,
       Cardio_schedule.Slot3,
       Cardio_schedule.Slot4,
       Cardio_schedule.BreakTime,
       Cardio_schedule.Slot5,
       Cardio_schedule.Slot6,
       Cardio_schedule.Slot7,
       Cardio_schedule.Slot8
FROM   Cardiology
       CROSS JOIN Cardio_schedule
WHERE  Cardiology.NAME = Cardio_schedule.NAME
       AND Cardiology.NAME = 'as'  -- `Cardiology` alias Missed

【讨论】:

  • 谢谢,我明白了。感谢您的帮助!
【解决方案3】:

在查询的末尾应该有:

WHERE Cardiology.Name = Cardio_schedule.Name AND Cardio_schedule.Name = '"

WHERE Cardiology.Name = Cardio_schedule.Name AND Cardiology.Name = '"

仅写 Name 属性会使其模棱两可。

【讨论】:

  • 谢谢,我明白了。感谢您的帮助!
猜你喜欢
  • 2014-05-03
  • 2018-01-21
  • 2020-11-28
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 2016-12-30
  • 2018-10-23
相关资源
最近更新 更多