Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从DataGridView中删除行并更新数据库_C#_Database_Datagridview_Rows - Fatal编程技术网

C#从DataGridView中删除行并更新数据库

C#从DataGridView中删除行并更新数据库,c#,database,datagridview,rows,C#,Database,Datagridview,Rows,我正在尝试创建一个包含DataGridView的应用程序,其中数据绑定到数据源。我在Form_Load上使用fill方法,我想知道如何删除一个或多个复选框行,不仅从表中,而且同时从数据库/数据源中删除 我在“删除”按钮上使用此代码,但它不会永久删除所选行。有什么帮助吗 for (int i = 0; i < Products.Rows.Count; i++) { DataGridViewRow dr = Products.Rows[i]; if (dr.Selected =

我正在尝试创建一个包含DataGridView的应用程序,其中数据绑定到数据源。我在Form_Load上使用fill方法,我想知道如何删除一个或多个复选框行,不仅从表中,而且同时从数据库/数据源中删除

我在“删除”按钮上使用此代码,但它不会永久删除所选行。有什么帮助吗

for (int i = 0; i < Products.Rows.Count; i++)
{
    DataGridViewRow dr = Products.Rows[i];
    if (dr.Selected == true)
    {
        Products.Rows.RemoveAt(i); 
    }
}
for(int i=0;i
您必须编写必要的呼叫给DB经理。如果您使用的是MYSQL,那么您可以使用:

for (int i = 0; i < Products.Rows.Count; i++)
{
    DataGridViewRow dr = Products.Rows[i];
    if (dr.Selected == true)
    {
        Products.Rows.RemoveAt(i);
        // CODE ADDED
        MySqlCommand cmd = sql.CreateCommand(); // creates the MySQL object needed for queries (I think there's another way also, but I use this)
        cmd.CommandText = "DELETE FROM table WHERE id = 1"; // sets the query

        try
        {
            cmd.ExecuteNonQuery(); // executes the query
        }
        catch( MySqlException e )
        {
            sql.Close();
            Console.WriteLine( e.Message );
        }
        sql.Close();
        // CODE ADDED
    }
}

您所做的是仅从
DataGridView
中删除所选行

您没有进行任何数据库调用来删除行

我假设您使用的是Microsoft SQL server

在这种情况下,您需要获得唯一标识产品的东西。例如,产品Id

假设您已将数据库中的
ProductId
列绑定到
DataGridView
中的某个列

您的代码应该如下所示

//string variable to capture product Ids for selected products
System.Text.StringBuilder productIds = new System.Text.StringBuilder(string.empty);

for (int i = 0; i < Products.Rows.Count; i++)
{
    DataGridViewRow dr = Products.Rows[i];

    if (dr.Selected == true)
    {
        Products.Rows.RemoveAt(i);

        productIds.Append(productIds.length > 0 ? "," + Convert.ToString(dr["ProductId"]) : Convert.ToString(dr["ProductId"]));
    }
}

DeleteProducts(productIds.ToString());
您的存储过程应该如下所示(假设是MS SQL Server)


您需要进行数据库调用以删除所选行。该数据库已存在,并在应用程序运行时加载。问题是,当通过“删除”按钮删除1个或多个复选框行时,这些行将消失,但如果我重新启动程序,这些行将再次出现。你知道如何更新数据库中的更改吗?你能指定你正在使用的数据库吗。MS SQL Server、MySQL或Oracle等。?
if (MessageBox.Show("Confirm ?","DELETE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
    string name = dataGridView1.Rows[e.RowIndex].Cells[WHEREINDEX].Value.ToString();
    sql = "DELETE FROM [TABLE] WHERE [id] = " + dataGridView1.Rows[e.RowIndex].Cells[WHEREINDEX].Value.ToString();

    if (db.Exec(sql) > 0)
    {
        MessageBox.Show(name + " deleted");
        dtSummary.Rows.Find(dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString()).Delete();
        dataGridView1.Refresh();
    }
    else 
    {
        MessageBox.Show("error while deleting") 
    }
}
//string variable to capture product Ids for selected products
System.Text.StringBuilder productIds = new System.Text.StringBuilder(string.empty);

for (int i = 0; i < Products.Rows.Count; i++)
{
    DataGridViewRow dr = Products.Rows[i];

    if (dr.Selected == true)
    {
        Products.Rows.RemoveAt(i);

        productIds.Append(productIds.length > 0 ? "," + Convert.ToString(dr["ProductId"]) : Convert.ToString(dr["ProductId"]));
    }
}

DeleteProducts(productIds.ToString());
private int DeleteProducts(string productIds)
{
    int recordsDeleted = 0;

    using (SqlConnection conn = new SqlConnection("Your connection string here"))
    {
        try
        {
            using (SqlCommand cmd = new SqlCommand("Your SQL Stored Procedure name here", conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;

                SqlParameter paramProductIds = new SqlParameter("@productIds", varchar(2000));
                paramProductIds.Value = productIds;

                cmd.Parameters.Add(paramProductIds);

                conn.Open();

                recordsDeleted = cmd.ExecuteNonQuery();
            }
        }
        finally { conn.Close(); }

    }

    return recordsDeleted;
}
CREATE PROCEDURE DeleteProducts
    @productIds VARCHAR(2000)
AS
BEGIN
    DELETE FROM Products WHERE ProductId IN (SELECT item FROM dbo.Split(',', @productIds))
END