微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检索SQL表中所有列的所有约束名称

如何解决如何检索SQL表中所有列的所有约束名称

我在sql数据库的表中添加了许多列。

现在,当我尝试对表中的DROP列进行编码时,收到一个错误,我必须首先DROP the constraints才能尝试访问DROP的实际列。

所以我的问题是如何为以下表格中的列返回所有约束名称
表:DateTimes(在数据库中:DatabaseTest)。

我已经用谷歌搜索了,但是还没有找到一个直接的代码示例。
我可以找到的行是:
"show table status from " + databaseName + " where name = '" + datatableName + "';";

下面的代码不起作用,但是我想知道是否有可能完成此代码以返回表constraint names中所有列的DateTimes吗?

谢谢!

    void showContstraintsForTable()
    {
        String databaseName = "DatabaseTest";
        String datatableName = "DateTimes";


        using (sqlConnection conn = new sqlConnection(GetConnectionString()))
        {
            conn.open();
            String cmdstring = "show table status from " + databaseName + " where name = '" + datatableName + "';";
            using (sqlCommand comm = new sqlCommand(cmdstring))
            {
                try
                {
                    comm.Connection = conn;

                    //How to return all CONSTRAINTS for all columns in this table?

                }
                catch (sqlException ex) { MessageBox.Show(ex.ToString()); }
            }
        }
    }
    static private string GetConnectionString()
    {
        return "Data Source=(LocalDB)\\MSsqlLocalDB;AttachDbFilename=C:\\Users\\andre\\source\\repos\\TestDatabaseCreation\\DatabaseTest.mdf;Integrated Security=True;Connect Timeout=30";
    }

解决方法

以下获取外键约束,其中一种方法一次获取所有表,而第二种仅获取一个表。

希望这不是一个确切的解决方案,您可以通过一些代码或sql修改提供另一个思路来使用。

原始SQL出现了from this post

我使用Windows窗体应用程序进行视觉效果,但不需要用户界面。

约束信息容器

public class Constraints
{
    public string TableName { get; set; }
    public string ConstraintName { get; set; }
    public string ColumnName { get; set; }
    public string ReferencedTable { get; set; }
    public string ReferencedColumn { get; set; }
    public override string ToString() => TableName;
}

SQL语句

    public class QueryStatements
    {
        /// <summary>
        /// Get all tables with foreign keys
        /// </summary>
        /// <returns></returns>
        public static string ForeignKeysAllTables() =>
            @"
SELECT 
TableName = t.Name,constr.name AS ConstraintName,cols.name AS ColumnName,t2.name AS ReferencedTable,c2.name AS ReferencedColumn
FROM sys.tables t
     INNER JOIN sys.foreign_keys constr ON constr.parent_object_id = t.object_id
     INNER JOIN sys.tables t2 ON t2.object_id = constr.referenced_object_id
     INNER JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = constr.object_id
     INNER JOIN sys.columns cols ON cols.object_id = fkc.parent_object_id AND cols.column_id = fkc.parent_column_id
     INNER JOIN sys.columns c2 ON c2.object_id = fkc.referenced_object_id AND c2.column_id = fkc.referenced_column_id
ORDER BY t.Name,cols.name;

";

        /// <summary>
        /// Get foreign keys for a single table
        /// </summary>
        /// <returns></returns>
        public static string ForeignKeysForSingleTable() =>
            @"
SELECT 
TableName = t.Name,c2.name AS ReferencedColumn
FROM sys.tables t
     INNER JOIN sys.foreign_keys constr ON constr.parent_object_id = t.object_id
     INNER JOIN sys.tables t2 ON t2.object_id = constr.referenced_object_id
     INNER JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = constr.object_id
     INNER JOIN sys.columns cols ON cols.object_id = fkc.parent_object_id AND cols.column_id = fkc.parent_column_id
     INNER JOIN sys.columns c2 ON c2.object_id = fkc.referenced_object_id AND c2.column_id = fkc.referenced_column_id 
WHERE t.name = @TableName
ORDER BY t.Name,cols.name;

";
        /// <summary>
        /// Get all table names in a database
        /// </summary>
        /// <param name="databaseName"></param>
        /// <returns></returns>
        public static string GetTableNames(string databaseName) =>
            $"SELECT TABLE_NAME FROM [{databaseName}].INFORMATION_SCHEMA.TABLES " + 
            "WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME <> 'sysdiagrams' ORDER BY TABLE_NAME";
    }

数据类

public class Informational
{
    /// <summary>
    /// For a real app the connection string could come
    /// from app.config,adjust as needed
    /// </summary>
    private static string _databaseName = "NorthWind2020";

    private static string _connectionString = 
        "Data Source=.\\SQLEXPRESS;" +
        $"Initial Catalog={_databaseName};" +
        "Integrated Security=True";

    public static List<Constraints> GetAllTablesForeignConstraints() 
    {
        var results = new List<Constraints>();

        using (var cn = new SqlConnection {ConnectionString = _connectionString})
        {

            using (var cmd = new SqlCommand {Connection = cn})
            {
                cmd.CommandText = QueryStatements.ForeignKeysAllTables();
                cn.Open();

                var reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    results.Add(new Constraints()
                    {
                        TableName = reader.GetString(0),ConstraintName = reader.GetString(1),ColumnName = reader.GetString(2),ReferencedTable = reader.GetString(3),ReferencedColumn = reader.GetString(4)
                    });
                }
            }
        }

        return results;

    }
    public static List<Constraints> GetTableForeignConstraints(string tableName)
    {
        var results = new List<Constraints>();

        using (var cn = new SqlConnection { ConnectionString = _connectionString })
        {

            using (var cmd = new SqlCommand { Connection = cn })
            {
                cmd.CommandText = QueryStatements.ForeignKeysForSingleTable();
                cmd.Parameters.AddWithValue("@TableName",tableName);

                cn.Open();

                var reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    results.Add(new Constraints()
                    {
                        TableName = reader.GetString(0),ReferencedColumn = reader.GetString(4)
                    });
                }
            }
        }

        return results;

    }

    public static List<string> GetTableNameList()
    {
        var results = new List<string>();

        using (var cn = new SqlConnection {ConnectionString = _connectionString})
        {
            using (var cmd = new SqlCommand {Connection = cn})
            {
                cmd.CommandText = QueryStatements.GetTableNames(_databaseName);
                cn.Open();

                var reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    results.Add(reader.GetString(0));
                }
            }
        }

        return results;
    }
}

在表单中,一个ListBox装载了表名(并不意味着它们具有约束)和一个TextBox来显示信息。在选择具有表名的ListBox时,通过Button Click事件检索约束或为一张表硬编码示例。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SqlServerUtilities;

namespace SqlServerUtilitiesFrontEnd
{
    public partial class Form1 : Form
    {
        private List<Constraints> _constraints;
        public Form1()
        {
            InitializeComponent();

            Shown += Form1_Shown;
        }

        private void Form1_Shown(object sender,EventArgs e)
        {
            _constraints = Informational.GetAllTablesForeignConstraints();

            TableNameListBox.DataSource = Informational.GetTableNameList();
            DisplayForeignConstraintNames();

            TableNameListBox.SelectedIndexChanged += TableNameListBox_SelectedIndexChanged;
        }

        private void TableNameListBox_SelectedIndexChanged(object sender,EventArgs e)
        {
            DisplayForeignConstraintNames();
        }

        private void DisplayForeignConstraintNames()
        {
            var constraints = _constraints
                .Where(item => item.TableName == TableNameListBox.Text).ToList();

            var sb = new StringBuilder();

            foreach (var constraint in constraints)
            {
                sb.AppendLine($"{constraint.ConstraintName},{constraint.ReferencedColumn}");
            }

            ResultsTextBox.Text = sb.Length == 0 ? "None" : sb.ToString();
            
        }

        private void GetCustomersForeignConstraintsButton_Click(object sender,EventArgs e)
        {

            var constraints = Informational.GetTableForeignConstraints("Customers");
            var sb = new StringBuilder();

            foreach (var constraint in constraints)
            {
                sb.AppendLine($"{constraint.ConstraintName},{constraint.ReferencedColumn}");
            }

            ResultsTextBox.Text = sb.Length == 0 ? "None" : sb.ToString();
        }
    }
}

我将所有类放在一个类项目中,因为Windows窗体项目是出于演示目的,而该类项目包含所需的内容。

enter image description here

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?