`
wodexxh
  • 浏览: 3921 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

实现删除SQL关联表中的内容

阅读更多
namespace DeleteTableInfo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("表名:");
            string talbe = Console.ReadLine();
            Console.WriteLine("列名:");
            string ID = Console.ReadLine();
            Console.WriteLine("列值:");
            string value = Console.ReadLine();
            DeletePK_Table(talbe, ID, value);

        }

        #region  删除带关联的表信息

        /// <summary>
        /// 删除带关联的表信息
        /// </summary>
        /// <param name="table">表名</param>
        /// <param name="param">列</param>
        /// <param name="value">值</param>
        public static void DeletePK_Table(string table, string param, object value)
        {

            // DB.Connection.Open();

            using (SqlConnection conn = new SqlConnection(@"server=.;database=DB;uid=sa;pwd=sa"))
            {
                conn.Open();

                string delsql = delInfo(table, param, value.ToString(), 0, conn);

	//用事务提交
                SqlTransaction tran = conn.BeginTransaction();
                try
                {
                    SqlCommand cmd = new SqlCommand(delsql, conn);
                    cmd.Transaction = tran;
                    cmd.ExecuteNonQuery();
                    tran.Commit();


                }
                catch (Exception e)
                {
                    tran.Rollback();
                    throw new Exception(e.Message);
                }
            }

        }
        /// <summary>
        /// 返回删除关联表的SQL
        /// </summary>
        /// <param name="Ftable">外键表</param>
        /// <param name="FColumn">外键列</param>
        /// <param name="where">条件</param>
        /// <param name="index">层【刚调用时写0】</param>
        /// <param name="conn"></param>
        /// <returns></returns>
        public static string delInfo(string Ftable, string FColumn, string where, int index, SqlConnection conn)
        {

            String sql = "sp_fkeys";
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@PKTABLE_NAME", Ftable));
            SqlDataReader sda = cmd.ExecuteReader();

            List<tableInfo> list = new List<tableInfo>();
            tableInfo table;//= new tableInfo();
            while (sda.Read())//取到所有的子表 ................................
            {
                table = new tableInfo();
                table.PKTABLE_NAME = sda["PKTABLE_NAME"].ToString();
                table.PKCOLUMN_NAME = sda["PKCOLUMN_NAME"].ToString();
                table.FKTABLE_NAME = sda["FKTABLE_NAME"].ToString();
                table.FKCOLUMN_NAME = sda["FKCOLUMN_NAME"].ToString();
                if (index == 0)//如果是第一次
                {
                    table.tempSql = "Left Join [" + table.PKTABLE_NAME + "] as [t0] on [t0].[" + table.PKCOLUMN_NAME + "]= [t1].[" + table.FKCOLUMN_NAME + "] where [t0].[" + FColumn + "]= " + where;
                }
                else
                {
                    table.tempSql = "Left Join [" + table.PKTABLE_NAME + "] as [t" + (index) + "] on [t" + (index) + "].[" + table.PKCOLUMN_NAME + "]= [t" + (index + 1) + "].[" + table.FKCOLUMN_NAME + "] " + where;
                }
                //  Console.WriteLine("删除表格的条件:" + table.tempSql);

                list.Add(table);
            }
            sda.Close();
            StringBuilder resSql = new StringBuilder(); ;
            foreach (var item in list)
            {
                if (item.FKTABLE_NAME == Ftable)
                {
                    SqlCommand cmd2 = new SqlCommand("SELECT count(*) from [" + item.FKTABLE_NAME + "]  AS [t" + (index + 1) + "] " + item.tempSql + "  and  [t" + (index + 1) + "].[" + item.PKCOLUMN_NAME + "] !=  [t" + (index + 1) + "].[" + item.FKCOLUMN_NAME + "] AND  [t" + (index + 1) + "].[" + item.FKCOLUMN_NAME + "]  IS NOT NULL", conn);

                    if (Convert.ToUInt32(cmd2.ExecuteScalar()) == 0)
                    {
                        //resSql.Append(delInfo(item.FKTABLE_NAME, item.FKCOLUMN_NAME, item.tempSql, index + 1, conn));
                    }
                    else
                    {
                        //如呆是内联表........
                    }
                }
                else//从这里递归、  先生成删除子表的SQL
                    resSql.Append(delInfo(item.FKTABLE_NAME, item.FKCOLUMN_NAME, item.tempSql, index + 1, conn));
            }
            return resSql.Append("DELETE [t" + index + "] FROM [" + Ftable + "] as [t" + index + "] " + (index == 0 ? ("Where [t" + index + "].[" + FColumn + "] = " + where) : where) + " ; ").ToString();

        }

        class tableInfo
        {
            /// <summary>
            /// 主键表
            /// </summary>
            public string PKTABLE_NAME { get; set; }
            /// <summary>
            /// 主键列
            /// </summary>
            public string PKCOLUMN_NAME { get; set; }
            /// <summary>
            /// 外键表
            /// </summary>
            public string FKTABLE_NAME { get; set; }
            /// <summary>
            /// 外键列
            /// </summary>
            public string FKCOLUMN_NAME { get; set; }
            /// <summary>
            /// 约束条件
            /// </summary>
            public string tempSql { get; set; }
        }
        #endregion
    }
}

 

分享到:
评论
1 楼 wodexxh 2011-03-31  
不好意思    由于是下班时间发的  可能里面有很多错误没能及时修改   请见谅、、

相关推荐

    Oracle中多表关联批量插入批量更新与批量删除操作

    在Oracle数据库中,进行多表关联的批量插入、批量更新和批量删除操作是常见的数据库管理任务,尤其是在处理大量数据时,这些操作能显著提高效率并减少资源消耗。本文将详细探讨这三个方面,并通过实例代码来展示如何...

    多组关联SQL SERVER 数据表删除功能的设计与实现.pdf

    5. 数据表删除功能的实现思路:文中详细论述了根据每组数据表的特点来实现删除功能的思路。这包括了识别数据表中的关键字段和关联关系,以及删除数据时要避免的潜在问题,如数据完整性破坏和级联删除的影响。 6. ...

    SQL Server数据库中关联数据表的设计方法探讨.pdf

    同理,当需要删除某张表中的记录时,也应使用恰当的方法使得其他关联表中的相关记录一同被删除,或者使其他表中的记录能自动删除,保证数据的完整性不受影响。 在创建数据库和表的过程中,可以使用SQL语句来实现...

    MSserver自关联表的级联删除

    在SQL Server中,自关联表是指一个表中的某一列引用了该表的主键作为外键,形成一种树形结构,常用于表示层次关系的数据,如组织架构、目录树等。在这样的表中,级联删除是确保数据完整性的一个重要功能,即删除某条...

    如何实现多数据表关联呢?Delphi的方法实例..rar

    在多表关联中,可以创建多个TDataSource,一个对应于每个数据表,然后在它们之间建立链接。 7. **数据绑定**:Delphi的数据绑定机制使得界面上的控件可以直接显示和编辑TDataSet中的数据。在多表关联的情况下,通过...

    sql server2005&2008删除某个架构名下的所有表或数据

    在SQL Server 2005和2008中,管理数据库架构以及其中的表和数据是数据库管理员的日常任务之一。有时,由于系统更新、重构或者数据迁移的需求,我们可能需要删除特定架构下的所有表或数据。在这个场景下,掌握如何...

    SQL语言在透视表中的应用

    在其他功能查询中,我们将会学习到如何使用SelectInto和InsertInto命令来创建新表和插入数据、如何通过Update语句更新数据、如何使用DELETE语句删除数据,以及如何生成表查询。 接下来,我们将探讨基于Microsoft ...

    SQL server创建触发器实现级联删除

    当尝试删除 `Category` 表中的某条记录时,触发器会先获取该记录的ID,然后根据此ID删除 `Product` 表中相关联的记录,最后再删除 `Category` 表中的原始记录。 ```sql CREATE TRIGGER tr_...

    maximo删除应用sql

    根据给定的部分内容,我们可以通过一系列SQL命令来实现应用程序的删除。以下是一些关键步骤: 1. **确定目标应用程序**:首先需要明确要删除的应用程序名称,例如“Test”。 2. **执行SQL命令**:通过执行一系列...

    用友软件数据库SQL表之间的关联实用文档.doc

    这种关联关系使得我们可以通过PURBILLVOUCH表中的数据来关联到PO_PODETAILS表中的数据,从而实现数据的关联和整合。 知识点三:SQL语句的应用 在用友软件数据库中,SQL语句是非常重要的工具,它可以帮助我们对数据...

    SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)

    在SQL Server中,批量删除数据库中的指定表是一个常见的任务,特别是在数据清理或系统重构时。T-SQL(Transact-SQL)是SQL Server所使用的扩展SQL语法,它提供了丰富的功能来处理这类操作。本篇文章将深入讲解如何...

    易语言学习进阶SQL创建表

    在易语言学习进阶SQL创建表源码中,你可能会看到这些步骤的实现,包括如何组织代码,如何封装SQL操作函数,以及如何在易语言程序中调用这些函数。源码分析可以帮助我们理解如何在实践中应用理论知识,同时也能加深对...

    主从表关联问题

    一、使用视图meeting将多表关联整合在一起 二、通过Sql语句筛选数据 三、建立和主从表的关联 四、注意在CrystalReport1表中插入子报表的时候,一定要将主从表的关联字段设置好,否则出乱子

    常用sql多表查询

    在SQL中,多表查询是数据管理中非常重要的一个概念,尤其在大型数据库系统中,数据通常分散在多个表中,需要通过特定的查询方法来整合这些信息。本话题主要探讨了如何进行多表查询,以及触发器和外键的概念。 ...

    用Java实现的SQL数据库系统

    Java实现的SQL数据库系统需要提供对SQL的解析和执行能力,包括DML(Data Manipulation Language)用于插入、更新和删除数据,DDL(Data Definition Language)用于创建和修改表结构,以及DCL(Data Control Language...

    magento删除订单sql

    - **批量删除操作**:如果需要批量删除多个订单,可以修改SQL语句中的条件表达式,使用IN关键字或者循环执行上述语句。 - **数据库性能**:频繁执行大量数据的删除操作可能会对数据库性能造成一定影响。建议在非高峰...

    全球大洲国家地区SQL数据表含中英文名称以及地区代码和关联ID

    标题中的“全球大洲国家地区SQL数据表含中英文名称以及地区代码和关联ID”指的是一个包含全球地理信息的数据表,特别适用于构建多级选择(如大洲-国家-地区)的数据库应用。这个数据表可能包含了以下字段: 1. **...

    最新全国地区表SQL一张表

    在数据库设计中,这种层级关系通常会通过树状结构或者关联表来实现,比如每个级别用一个独立的列来存储,或者使用自引用的方式,通过父级ID来链接不同级别的行政区划。"ID为int"说明每个地区都有一个整数标识符作为...

    将sql查询结果保存到数据表

    ### 将SQL查询结果保存到数据表的知识点 ...通过以上内容,我们可以了解到如何有效地将SQL查询结果保存到数据表中,以及在实际操作中需要注意的一些细节问题。这对于数据库管理和开发工作都是非常重要的。

    【SQL】在sql server中 delete时 使用INNER JOIN

    简单地使用 `DELETE` 语句可以删除单个表中的数据,但在多表关联的情况下,这种操作就显得力不从心了。这时,就需要借助 `INNER JOIN` 来实现更为精确的数据删除。 #### SQL Server 中 DELETE 结合 INNER JOIN 的...

Global site tag (gtag.js) - Google Analytics