首页 > 其他分享 >创建事务批量删除DataGridView数据(含关联表中的数据)

创建事务批量删除DataGridView数据(含关联表中的数据)

时间:2024-05-21 15:10:10浏览次数:14  
标签:string Parameters System DataGridView CommandInfo 表中 using 数据 public

新建一个CommandInfo.cs 类

using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WinStuSystem
{
    public class CommandInfo
    {
        public string CommandText { get; set; }
        public DbParameter[] Parameters { get; set; }
        public bool IsProc { get; set; }
        public CommandInfo() { }

        public CommandInfo(string comText, bool isProc)
        {
            this.CommandText = comText;
            this.IsProc = isProc;
        }
        public CommandInfo(string commandText, DbParameter[] parameters, bool isProc)
        {
            CommandText = commandText;
            Parameters = parameters;
            IsProc = isProc;
        }
    }
}

新建SqlHelper.cs 类,封装事务处理函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
using System.Windows.Forms;

namespace WinStuSystem
{
    public class SqlHelper
    {
        public static string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
        /// <summary>
        /// 执行事务
        /// </summary>
        /// <param name="comList"></param>
        /// <exception cref="Exception"></exception>
        public static bool ExecuteTrans(List<CommandInfo> comList)
        {
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                conn.Open();
                SqlTransaction trans = conn.BeginTransaction();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.Transaction = trans;
                try
                {
                    int count = 0;
                    for (int i=0; i<comList.Count;i++)
                    {
                        cmd.CommandText = comList[i].CommandText;
                        if (comList[i].IsProc)
                        {
                            cmd.CommandType = CommandType.StoredProcedure;
                        }
                        else
                        {
                            cmd.CommandType = CommandType.Text;
                        }
                        if (comList[i].Parameters.Length > 0)
                        {
                            cmd.Parameters.Clear ();
                            cmd.Parameters.AddRange(comList[i].Parameters);
                        }
                        count += cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                    }
                    trans.Commit();
                    return true;
                }catch (Exception ex)
                {
                    trans.Rollback(); //回滚
                    throw new Exception("执行sql错误:"+ex.Message, ex);
                }
            }
        }
    }
}

点击批量删除执行的方法

private void button1_Click(object sender, EventArgs e)
{
    //获取勾选的数据的id
    List<int> ids = new List<int>();
    int count = classTableData.Rows.Count;
    for (int i = 0; i < count; i++)
    {
        if ((bool)classTableData.Rows[i].Cells["checks"].EditedFormattedValue == true)
        {
            int n = int.Parse(classTableData.Rows[i].Cells["ClassId"].Value.ToString());
            ids.Add(n);
        }
    }
    if (ids.Count > 0)
    {
        DialogResult dilr = MessageBox.Show("确定要删除班级及其相关的信息吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.None);
        if (dilr == DialogResult.Yes)
        {
            //先删学生,在删班级,
            string sqlstu = "delete from StuInfo where ClassId=@ClassId";
            string sqlclass = "delete from ClassInfo where ClassId=@ClassId";
            List<CommandInfo> comlists = new List<CommandInfo>();

            foreach (int id in ids)
            {
                SqlParameter[] pars =
                {
                    new SqlParameter("@ClassId",id)
                };
                CommandInfo coms = new CommandInfo()
                {
                    CommandText = sqlstu,
                    IsProc = false,
                    Parameters = pars
                };
                comlists.Add(coms);

                CommandInfo comc = new CommandInfo()
                {
                    CommandText = sqlclass,
                    IsProc = false,
                    Parameters = pars
                };
                comlists.Add(comc);
            }

            bool bl = SqlHelper.ExecuteTrans(comlists);
            if (bl)
            {
                DataTable dt = classTableData.DataSource as DataTable;
                string idStr = string.Join(",", ids);
                DataRow[] rows = dt.Select("ClassId in (" + idStr + ")");
                foreach (DataRow row in rows)
                {
                    dt.Rows.Remove(row);
                }
                classTableData.DataSource = dt;
                MessageBox.Show("批量删除成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.None);
                return;
            }
            else
            {
                MessageBox.Show("删除失败", "提示", MessageBoxButtons.OK);
            }
        }
    }
    else
    {
        MessageBox.Show("请选择要删除的班级信息", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        return;
    }
}

界面效果

 

标签:string,Parameters,System,DataGridView,CommandInfo,表中,using,数据,public
From: https://www.cnblogs.com/tlfe/p/18204070

相关文章

  • Kubernetes 数据存储:从理论到实践的全面指南
    本文深入解析Kubernetes(K8S)数据存储机制,探讨其架构、管理策略及最佳实践。文章详细介绍了K8S数据存储的基础、架构组成、存储卷管理技巧,并通过具体案例阐述如何高效、安全地管理数据存储,同时展望了未来技术趋势。关注【TechLeadCloud】,分享互联网架构、云服务技术的全......
  • .NET中特性+反射 实现数据校验
    .NET中特性+反射实现数据校验在.NET中,我们可以使用特性+反射来实现数据校验。特性是一种用于为程序中的代码添加元数据的机制。元数据是与程序中的代码相关联的数据,但不直接成为代码的一部分。通过特性,我们可以为类、方法、属性等添加额外的信息,这些信息可以在运行时通过反射获取......
  • 在机器学习项目中,将原始数据集划分为训练数据集和测试数据集划分比例的确定
    在机器学习项目中,将原始数据集划分为训练数据集和测试数据集是非常重要的一步。这个划分比例会影响模型的训练效果和对未来数据的泛化能力。虽然没有固定的规则,但有一些建议和常见做法可以参考:常见的划分比例70%训练/30%测试:这是一个较为传统的划分比例,被广泛应用于各种机器......
  • C#连接Access数据库 查询和新增 示例
    C#连接Access数据库查询和新增示例项目中需要做一个写程序操作日志的需求,仅本机使用。这时Access数据库就是一个非常好的选择,简单,好用。下面仅仅是一个示例,简单写出查询和新增等C#操作Access数据库的代码效果图 clsDBHelperAccess.csusingSystem;usingSystem......
  • C#在DataGridView表格中操作Access数据库
    C#在DataGridView表格中直接添加修改删除数据 效果图 Form1.cs完整代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Dat......
  • PySpark-大数据分析实用指南-全-
    PySpark大数据分析实用指南(全)原文:zh.annas-archive.org/md5/62C4D847CB664AD1379DE037B94D0AE5译者:飞龙协议:CCBY-NC-SA4.0前言ApacheSpark是一个开源的并行处理框架,已经存在了相当长的时间。ApacheSpark的许多用途之一是在集群计算机上进行数据分析应用程序。本书......
  • 创建你的-Mysql-数据库-全-
    创建你的Mysql数据库(全)原文:zh.annas-archive.org/md5/853FEC9D976A75004408D5A9A661EDD8译者:飞龙协议:CCBY-NC-SA4.0前言1995年发布的MySQL已成为最受欢迎的开源数据库系统。MySQL和phpMyAdmin的普及使得许多非IT专家能够使用MySQL后端构建动态网站。本书是一......
  • 解锁你的数据库:JPA和Hibernate的乐观锁与悲观锁
    哈喽,大家好,我是木头左!引言在当今的软件开发领域,数据库操作是不可或缺的一部分。然而,随着并发操作的增加,如何正确地处理并发问题是每个开发者都需要面对的挑战。本文将深入探讨JPA(JavaPersistenceAPI)和Hibernate这两种ORM(对象关系映射)工具中的乐观锁和悲观锁的使用及其适用场......
  • .net8 winform程序使用EntityFrameworkCore连接数据库
    在.NET8WinForms应用程序中使用EntityFramework(EF)Core,你需要按照以下步骤操作:1.添加EntityFrameworkCoreNuGet包。2.定义你的数据模型。3.创建数据库上下文(DbContext)。4.在数据库上下文中配置EntityFramework。5.使用EntityFrameworkCore的API来执行数据库操作。......
  • 如何通过数据下发平台,实现总分支机构间数据安全流转?
    随着企业业务的快速发展,不少大型企业会在全国乃至全球,设立总部-分部-办事处/网点等多层级的结构。在日常经营中,总部与分支之间存在着较为频繁的数据互动关系,经常会存在文件数据下发的场景。数据下发平台是专门设计管理和下发大量文件的系统,它能够将文件从中心服务器传输到不同的客......