【问题标题】:Deleting column causes column does not exist in table error删除列导致表中不存在列错误
【发布时间】:2011-02-24 03:00:04
【问题描述】:

我正在从 Sql 查询填充数据集。我在查询中获取了一些额外的列,因为我需要它们来进行进一步的查询。我在处理完这些列后删除了这些列,但是当我尝试将 DataSet 绑定到 GridView 时,我得到 Column "columnname" doesn't exist in "dataset" 错误。

任何想法可能是什么原因?

编辑:这是代码 实际错误消息:“列 'BID' 不属于表格结果。

String command = "SELECT B.BID, B.NAME 'Name', B.FARE 'Fare', B.DEPARTURE 'Departure', B.MAX_SEATS 'MAX', NULL 'Seats Available' "+
                 "FROM ROUTE R, BUS B "+
                 "WHERE R.FROM_LOCATION = @from AND R.TO_LOCATION = @to ";
if(_ac) command += "AND B.AC = @ac ";
if(_volvo) command += "AND B.VOLVO = @volvo ";
if(_sleeper) command += "AND B.SLEEPER = @sleeper ";
command += "AND B.RUNS_ON LIKE '%"+day+"%' AND R.RID = B.RID";
SqlCommand cmd = new SqlCommand(command, con);

cmd.Parameters.AddWithValue("@from", fromValue);
cmd.Parameters.AddWithValue("@to", destValue);
if(_ac) cmd.Parameters.AddWithValue("@ac", _ac);
if(_volvo) cmd.Parameters.AddWithValue("@volvo", _volvo);
if(_sleeper) cmd.Parameters.AddWithValue("@sleeper", _sleeper);

SqlDataAdapter adapter = new SqlDataAdapter(cmd);
_results = new DataSet();

con.Open();
adapter.Fill(_results, "results");

DataTable dt = _results.Tables["results"];
if(dt.Rows.Count > 0 ) {
    for(int i = 0; i < dt.Rows.Count; i++) {
        DataRow row = dt.Rows[i];
        int max = Int32.Parse(row["MAX"].ToString());
        String bid = row["BID"].ToString();
        cmd.CommandText = "SELECT B.MAX_SEATS-SUM(RS.SEATS_BOOKED) 'REMAIN', RS.BID "+
                          "FROM RESERVATION RS, BUS B "+
                          "WHERE RS.DATE_JOURNEY = @date AND RS.BID = @bid AND B.BID = RS.BID "+
                          "GROUP BY B.MAX_SEATS, RS.BID";
        cmd.Parameters.AddWithValue("@date", dateValue);
        cmd.Parameters.AddWithValue("@bid", bid);

        SqlDataReader reader = cmd.ExecuteReader();
        if(reader.Read()) {
            max = Int32.Parse(reader["REMAIN"].ToString());
        }

        // If all seats are booked, remove the row from the table.
        if(max == 0) { dt.Rows.Remove(row); }
        else {
            row["Seats Available"] = max;
        }

        reader.Close();
        cmd.Parameters.Clear();
        dt.AcceptChanges();
    }

    if(dt.Columns.CanRemove(dt.Columns["BID"]))
        dt.Columns.Remove("BID");
    if(dt.Columns.CanRemove(dt.Columns["MAX"]))
        dt.Columns.Remove("MAX");

    dt.AcceptChanges();
    _results.AcceptChanges();

    // Bind the results to a GridView
    GridView1.DataSource = _results;
    GridView1.DataBind();

    // Dispaly Results Panel
    results.Visible = true;
}
else {
    message.Text = "No bus found";
    message.Visible = true;
}

}

GridView1 标记:

<asp:GridView ID="GridView1" runat="server" onrowcreated="GridView1_RowCreated" EnableViewState="False" GridLines="Horizontal">
    <Columns>
    <asp:TemplateField>
        <ItemTemplate>
            <asp:Literal ID="RadioButtonMarkup" runat="server"></asp:Literal>
        </ItemTemplate>
    </asp:TemplateField>
    </Columns>
</asp:GridView>

数据库列:
ROUTE: RID、FROM_LOCATION、TO_LOCATION
BUS: RID、BID、NAME、AC、VOLVO、SLEEPER、FARE、MAX_SEATS , RUNS_ON, DEPARTURE
预订: TID, PID, BID, SEATS_BOOKED, DATE_BOOKED, DATE_JOURNEY

编辑:刚刚注意到,如果我只删除“MAX”列,它可以工作,我看到没有该列的 GridView,但删除“BID”以某种方式给了我这个错误。

编辑:已解决!试图访问 RowCreated 方法中的 BID 列,这导致了这种情况。感谢所有帮助过的人。

【问题讨论】:

  • 如果您可以分享您的实际代码,这将大大提高这里有人可以提供帮助的可能性。
  • 并确认,错误是在GridView1.DataBind()处引起的;正确的?如果是这样,构建数据网格的 asp 代码是什么?
  • 是的!这就是它引发异常的地方。你想要 GridView1 的标记吗?
  • 请这样做,这将是一个很大的帮助。
  • 我只是想知道您为什么要从 DataTable 中删除列?

标签: c# asp.net


【解决方案1】:

我建议在您的第一个 sql 语句中将别名“BID”添加到 B.BID。也许这就是它要寻找的东西。

【讨论】:

    【解决方案2】:

    好的,我写了一个很长的回复,但只是删除了它。您确定将正确的数据源绑定到您的网格吗?

    也许:

    GridView1.DataSource = _results.Tables["results"];
    

    GridView1.DataSource = dt;
    

    会工作的。

    【讨论】:

    • 我已经将 GridView1 数据源绑定到 _results(数据集),而不是 dt(数据表)。但是,我尝试将它绑定到 dt,但我得到了同样的错误。
    • 如果可能,您能否添加网格和数据源的列名?
    • 因为您在数据集中漏掉了一个。
    • 我不会错过的。我已将其删除。因为我不希望它显示在 GridView 中。
    • 您将其从数据集中删除,但如果您的网格中有一个列名称已删除,则会导致此错误。
    【解决方案3】:

    如果这是您网格的标记,我建议您修改网格以专门显示您需要的列。

    【讨论】:

      猜你喜欢
      • 2022-06-11
      • 2014-04-05
      • 2021-07-25
      • 2021-11-14
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多