我想根据“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中的数据库视图:
更新
以下是视图数据库的代码:
如果我在[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
可见。
我的问题是:
如何使用ID
删除数据库,但在ID
ViewDatabase()
列中,用户无法看到ID
列,只要我点击Print Preview
,ID
也不会被看见。 ID
仅对系统可见(ID
上的DeleteDatabase()
将会运行,ID
PrintPreview() and ViewDatabase()
将对用户不可见)
有任何帮助吗?谢谢!
答案 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>