ID既不是DataColumn,也不是Table的DataRelation

时间:2014-02-20 07:28:46

标签: c# winforms datagridview ms-access-2010

我想根据“ID”(自动编号)删除数据库中的单个数据。但是,当我想删除时,这是我得到的错误:

  

发生了'System.ArgumentException'类型的未处理异常   System.Data.dll中

附加信息:ID既不是DataColumn,也不是Table Table的DataRelation。“

以下是我正在使用的代码:

private void DeleteDatabase(object sender, EventArgs e)
        {
            DataTable _dt = (DataTable)dataGridView1.DataSource;

            if (_dt.DefaultView.Count > 0)
            {
                int rowNum = dataGridView1.CurrentRow.Index;
                int id = Convert.ToInt32(_dt.DefaultView[rowNum]["ID"]);
                _dt.DefaultView[rowNum].Delete();

                using (OleDbConnection conn = new OleDbConnection(connectionString))
                {
                    string query = "DELETE FROM [Table] WHERE [ID] = @ID";
                    conn.Open();

                    using (OleDbCommand cmd = new OleDbCommand(query, conn))
                    {
                        cmd.Parameters.AddWithValue("@ID", id);
                        cmd.ExecuteNonQuery();
                    }

                    conn.Close();
                }
            }

            else
            {
                if (_choice.comboBox1.Text == "English")
                {
                    System.Media.SoundPlayer _sounds = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Exclamation.wav");
                    _sounds.Play();
                    MessageBox.Show("There is no Data in the Selected Row!", "Error");
                    return;
                }
            }

            if (_choice.comboBox1.Text == "English")
            {
                System.Media.SoundPlayer _sounds = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Exclamation.wav");
                _sounds.Play();
                MessageBox.Show("Deleted Successfully!", "Deleted");
            }
        }

以下是我系统上datagridview中的数据库视图:

enter image description here

更新

以下是视图数据库的代码:

如果我在[ID]的{​​{1}}查询中未包含SELECT,则会出错,但如果我包含该内容,并且当我点击ViewDatabase()时,它会将Print Preview列显示为下图。

ID

我知道如果我选择private void ViewDatabase(object sender, EventArgs e) { using (OleDbConnection conn = new OleDbConnection(connectionString)) { string query = "SELECT * FROM [Table]"; conn.Open(); using (OleDbDataAdapter _adapter = new OleDbDataAdapter(query, conn)) { _ds.Clear(); _adapter.Fill(_ds, "Table"); dataGridView1.DataSource = null; dataGridView1.Refresh(); } dataGridView1.DataSource = _ds.Tables[0]; this.dataGridView1.Columns["ID"].Visible = false; conn.Close(); } } 而不是Product Code来删除数据,那么它将更有可能,但如果让我们说有2个相同的ID,那么当我点击删除,两个数据都将被删除,因为它是相同的Product Code

但是,每当我点击Product Code时,我也想隐藏ID,当我点击Print Preview时,我不想显示任何ID。下面的图片显示了Print Preview获得Print Preview列,系统中的视图数据库中没有ID可见。

enter image description here

我的问题是: 如何使用ID删除数据库,但在ID ViewDatabase()列中,用户无法看到ID列,只要我点击Print PreviewID也不会被看见。 ID仅对系统可见(ID上的DeleteDatabase()将会运行,ID PrintPreview() and ViewDatabase()将对用户不可见)

如果我让你感到困惑,我道歉。

有任何帮助吗?谢谢!

3 个答案:

答案 0 :(得分:3)

没有ID。您需要根据表格中的特定数据进行删除。 ProductCode看起来更合理。

修改

根据您对问题的更新,似乎实际上有一个ID列。我猜它正在爆炸这条线:

int id = Convert.ToInt32(_dt.DefaultView[rowNum]["ID"]);

这可能是因为您限制了SELECT查询并且未抓取ID。这解释了您未显示ID列的原始图片。您无法获取未包含在SELECT中的列的数据。

如果你真的不希望向用户显示ID,但仍然需要删除它,那么你将不得不做一些腿部工作并修改显示{{{ 1}}。基本上,您将不得不修改它以不显示特定列,但也要跟踪它。这更像是一个设计/实现问题,您需要首先尝试自行解决。

答案 1 :(得分:2)

如果您没有ID列,请获取下面的ProductCode

int rowNum = dataGridView1.CurrentRow.Index;

string code = _dt.DefaultView[rowNum]["ProductCode"].ToString();

dt.DefaultView[rowNum].Delete();

现在您可以通过ProductCode删除

string query = "DELETE FROM [Table] WHERE [ProductCode] = @ProductCode";
conn.Open();

using (OleDbCommand cmd = new OleDbCommand(query, conn))
{
    cmd.Parameters.AddWithValue("@ProductCode", code);
    cmd.ExecuteNonQuery();
}

答案 2 :(得分:0)

我知道这已经得到回答,并且我的解决方案并不完全适用于此问题,但适用于相同的错误。我只想在这里将修复程序发布给可能有相同问题的其他任何人。这是我以前的经历,并且抛出了相同的错误:

 <telerik:GridTemplateColumn DataField="uppeASSET_DESC" HeaderStyle-HorizontalAlign="Center" HeaderText="Asset Description" ItemStyle-HorizontalAlign="Center" AutoPostBackOnFilter="true" UniqueName="ASSET_DESC" ItemStyle-Width="150px" HeaderStyle-Width="150px">
      <ItemTemplate>
           <telerik:RadLabel ID="lblASSET_DESC" runat="server" Text='<%# Eval("ASSET_DESC") %>' />
      </ItemTemplate>
 </telerik:GridTemplateColumn>

由于DataField="uppeASSET_DESC"标签中的telerik:GridTemplateColumn字段而导致错误。我没有意识到这是一个数据绑定(我想我想它是某种名称),所以我的网格正在存储过程中寻找列uppeASSET_DESC,但没有找到它,所以它抛出一个错误。我删除了它,然后它起作用了。这是工作版本:

<telerik:GridTemplateColumn HeaderStyle-HorizontalAlign="Center" HeaderText="Asset Description" ItemStyle-HorizontalAlign="Center" AutoPostBackOnFilter="true" UniqueName="ASSET_DESC" ItemStyle-Width="150px" HeaderStyle-Width="150px">
      <ItemTemplate>
           <telerik:RadLabel ID="lblASSET_DESC" runat="server" Text='<%# Eval("ASSET_DESC") %>' />
      </ItemTemplate>
 </telerik:GridTemplateColumn>