如何对数据库进行更改

时间:2019-12-10 01:38:21

标签: c# ms-access

如何更改数据库中的数据表。我可以使用我的代码删除行,并从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;

        }
    }
}

1 个答案:

答案 0 :(得分:0)

鉴于没有其他人对您有所帮助,我很乐意!

首先,我建议在您的FormBindingNavigatorBindingSource中添加两件事。两者都在工具箱的“数据”部分下可用。默认情况下,插入的对象分别称为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()返回受影响的行数。这应该是一个,因为只有当前行被删除。