【问题标题】:How to do Automatic synchronize between database access and DatagridView in c#如何在c#中在数据库访问和DatagridView之间进行自动同步
【发布时间】:2017-08-16 23:56:00
【问题描述】:

在我的程序中,当我删除一条记录时,它从数据库访问和 DataGridView 中删除,但是当我关闭窗口并再次打开它时,记录再次出现在 DataGridView 中,虽然它从数据库访问中删除,这是我的代码:

private void button1_Click(object sender, EventArgs e)
{
    connection.Open();
    command.Connection = connection;
    string query = " delete from Hoteldb where ID= " +textBox0.Text + "";
    MessageBox.Show(query);
    command.CommandText = query;
    command.ExecuteNonQuery();
    MessageBox.Show("Guest Checked Out succesfly");
    BindGridView();
}

public void BindGridView()
{
    string strSQL = "SELECT * FROM Hoteldb";  
    OleDbCommand cmd = new OleDbCommand(strSQL, connection);
    DataTable table = new DataTable();
    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    da.Fill(table);
    dataGridView1.DataSource = table;

    connection.Close();
}

【问题讨论】:

  • 不要使用串联,除非您希望有人输入1 or 1=1 并删除整个表。这正是 SQL 注入的工作原理。使用参数化查询并且不要使用全局连接对象。您最终只会阻止您自己的应用程序。有 很多 教程展示了如何将数据绑定到网格并更新数据库以响应 UI 命令
  • 至于实际问题,要么键不存在,要么文本包含意外字符,要么您的目标是错误数据库。您是否正在使用用户实例 SQL Server 数据库?还是访问文件?每次调试应用程序时,数据库文件都会被替换
  • 我正在使用 Access 文件
  • 那就是问题所在。 Content 文件总是在您开始调试时复制到Debug 文件夹。无论如何,您不应该将用户数据存储在程序的文件夹中。 Program Files 文件夹是只读的。您应该将数据存储在用户的 Documents 文件夹或特殊的 %ApplicationData% 文件夹中
  • 我做了,同样的问题

标签: c#


【解决方案1】:

试试这个:

private void button1_Click(object sender, EventArgs e)
{
    int RowsAffected = 0;

    connection.Open();
    string query = "DELETE FROM Hoteldb WHERE ID=@ID";
    command = new OleDBCommand(query);
    command.Connection = connection;

    cmd.Parameters.Add(new OleDbParameter("@ID", OleDbType.WChar, 150, "ID"));
    cmd.Parameters["@ID"].Value = textBox0.Text.Trim()
    RowsAffected = command.ExecuteNonQuery();
    if(RowsAffected > 0)
    {
        MessageBox.Show("Guest Checked Out succesfly");
        BindGridView();
    }
    else
    {
        MessageBox.Show("There was nothing to be deleted");
    }
}

public void BindGridView()
{
    connection.Open();
    string strSQL = "SELECT * FROM Hoteldb";  
    cmd = new OleDbCommand(strSQL);
    cmd.Connection = connection;

    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    DataSet ds = new DataSet();
    da.Fill(ds, "Hoteldb");
    dataGridView1.DataSource = ds.Tables["Hoteldb"].DefaultView

    connection.Close();
}

【讨论】:

  • 这是一个经典的 SQL 注入场景。如果身份证不是数字怎么办?如果它包含'"" 字符怎么办?如果有人输入1 or 1=1 怎么办?添加单引号不会解决任何问题
  • 是的。你应该使用参数。我会更新遮阳篷@MahMSL
  • 同样的问题,记录被删除,但是当我关闭窗口并打开它时,它又回来了
  • 完整代码很长,我可以通过电子邮件发送给您吗?
  • 如果它不起作用,这可能与您与数据库@MahMSL 的连接有关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多