如何更改数据库中的数据表。我可以使用我的代码删除行,并从datagridview中看到它,但是我需要放入什么才能将其从数据库本身中删除。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Diagnostics;
namespace merge
{
public partial class Form1 : Form
{
private OleDbConnection connection = new OleDbConnection();//setting connection
public Form1()
{
InitializeComponent();
connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\ascrfp04\common\General\Interns\Ng Meng Yee Darren\Workorder tracking\workorder tracking\project.accdb;
Persist Security Info=False;";// connection string from file
}
private DataTable GetData4()
{
DataTable dt4 = new DataTable();
OleDbDataAdapter da = new OleDbDataAdapter("Select * from [tuas barcode]", connection);
da.Fill(dt4);
return dt4;
}
private void clear_Click(object sender, EventArgs e)
{
DataTable dt4 = GetData4();
foreach (DataRow row in dt4.Rows)
{
row.Delete();
}
dataGridView1.DataSource = dt4;
}
}
}
答案 0 :(得分:0)
鉴于没有其他人对您有所帮助,我很乐意!
首先,我建议在您的Form
和BindingNavigator
和BindingSource
中添加两件事。两者都在工具箱的“数据”部分下可用。默认情况下,插入的对象分别称为bindingNavigator1和bindingSource1。我将在此处使用默认名称。
下一步,突出显示表单上的导航器,并在属性窗口中的“项目”下将DeleteItem设置为none。这很重要,因为我们将覆盖标准的删除行为。
现在,在导航器本身中,您将看到一个看起来像要删除的十字(或x)的图标。双击以生成单击方法。
您没有显示所有代码,因此在这里我要做一些假设。首先,我假设在构造函数中调用了GetData4。如果没有在此添加。
现在将GetData4方法更改为如下形式:
private DataTable GetData4()
{
DataTable dt4 = new DataTable();
OleDbDataAdapter da = new OleDbDataAdapter("Select * from WorkTimes", connection);
da.Fill(dt4);
bindingSource1.DataSource = dt4;
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = bindingSource1;
return dt4;
}
为了使我的代码正常工作,这可能是一个void方法,因为我忽略了返回值,但是您可能希望进行一些数据验证,因此我将签名保留为“原样”。
现在转到bindingNavigatorDeleteItem_Click的生成方法,并对其进行更改:
private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
{
DataRowView dRV = (DataRowView)bindingSource1.Current;
DateTime myDate = (DateTime)dRV["MyDate"];
string myName = (string)dRV["MyName"];
if (DeleteRow(myDate, myName))
{
GetData4();
}
}
出于说明目的,我将主键与两个字段MyDate和MyName分别用于DateTime和string。您可能只有一个字段作为主键,在这种情况下,您的任务会更简单。显而易见,您只需要标识所单击行中的主键并将该值传递给DeleteRow()。
最后DeleteRow()应该看起来像这样:
private bool DeleteRow(DateTime myDate, string myName)
{
bool ret = false;
connection.Open();
using (var cmd = new OleDbCommand("DELETE * FROM YourTable WHERE MyDate = ? AND MyName = ?", connection))
{
cmd.Parameters.Add(new OleDbParameter
{
ParameterName = "@MyDate",
DbType = DbType.DateTime,
Value = myDate
});
cmd.Parameters.Add(new OleDbParameter
{
ParameterName = "@MyName",
DbType = DbType.String,
Value = myName
});
ret = (cmd.ExecuteNonQuery() == 1);
}
connection.Close();
return ret;
}
通过解释的方式:1)注意我正在使用参数将主键传递给Command;这是推荐的方法。顺带一提,使用OleDb
时参数的命名是不相关的:我正在使用?作为占位符-我可以使用@myDate和@MyName代替。所有重要的id都会使参数顺序正确无误。 2)ExecuteNonQuery()返回受影响的行数。这应该是一个,因为只有当前行被删除。