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

C# 如何检索SQL表中所有列的所有约束名称,c#,sql,datatable,constraints,C#,Sql,Datatable,Constraints,我在SQL数据库的表中添加了许多列。 现在,当我尝试使用代码从此表中删除列时,我收到一个错误,我必须首先删除我尝试删除的实际列的约束 因此,我的问题是如何返回:表:DateTimes(在数据库:DatabaseTest)中列的所有约束名称。 我已经在谷歌上搜索过了,但还没有找到一个简单的代码示例来说明如何做到这一点。我能找到的一行是: “显示来自“+databaseName+”的表状态,其中name=”+datatableName+“;” 下面的代码不起作用,但我想知道是否可以完成此代码以返回表

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

现在,当我尝试使用代码从此表中删除列时,我收到一个错误,我必须首先删除我尝试删除的实际列的约束

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

我已经在谷歌上搜索过了,但还没有找到一个简单的代码示例来说明如何做到这一点。
我能找到的一行是:
“显示来自“+databaseName+”的表状态,其中name=”+datatableName+“;”

下面的代码不起作用,但我想知道是否可以完成此代码以返回表中所有列的
约束名称

谢谢大家!

    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出现了

我使用了一个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,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 
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";
    }
公共类查询语句
{
/// 
///使用外键获取所有表
/// 
/// 
公共静态字符串ForeignKeysAllTables()=>
@"
挑选
TableName=t.Name,constr.Name作为ConstraintName,cols.Name作为ColumnName,t2.Name作为ReferencedTable,c2.Name作为ReferencedColumn
从sys.t表
内部连接sys.foreign\u key constr ON constr.parent\u object\u id=t.object\u id
t2.object\u id=constr.referenced\u object\u id上的内部联接sys.tables t2
内部联接sys.foreign\u key\u列fkc ON fkc.constraint\u object\u id=constr.object\u id
内部联接sys.columns colls ON cols.object\u id=fkc.parent\u object\u id和cols.column\u id=fkc.parent\u column\u id
c2.object\u id=fkc.referenced\u object\u id和c2.column\u id=fkc.referenced\u column\u id上的内部联接sys.columns c2
按t.名称、cols.名称排序;
";
/// 
///获取单个表的外键
/// 
/// 
公共静态字符串ForeignKeysForSingleTable()=>
@"
挑选
TableName=t.Name,constr.Name作为ConstraintName,cols.Name作为ColumnName,t2.Name作为ReferencedTable,c2.Name作为ReferencedColumn
从sys.t表
内部连接sys.foreign\u key constr ON constr.parent\u object\u id=t.object\u id
t2.object\u id=constr.referenced\u object\u id上的内部联接sys.tables t2
内部联接sys.foreign\u key\u列fkc ON fkc.constraint\u object\u id=constr.object\u id
内部联接sys.columns colls ON cols.object\u id=fkc.parent\u object\u id和cols.column\u id=fkc.parent\u column\u id
c2.object\u id=fkc.referenced\u object\u id和c2.column\u id=fkc.referenced\u column\u id上的内部联接sys.columns c2
其中t.name=@TableName
按t.名称、cols.名称排序;
";
/// 
///获取数据库中的所有表名
/// 
/// 
/// 
公共静态字符串getTableName(字符串数据库名)=>
$“从[{databaseName}中选择表\名称”。信息\ SCHEMA.TABLES”+
“其中,表类型=‘基本表’和表名称‘系统图’按表名称排序”;
}
数据类

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),
                        ConstraintName = reader.GetString(1),
                        ColumnName = reader.GetString(2),
                        ReferencedTable = reader.GetString(3),
                        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;
    }
}
公共类信息
{
/// 
///对于真正的应用程序,连接字符串可能会出现
///从app.config,根据需要进行调整
/// 
专用静态字符串_databaseName=“NorthWind2020”;
私有静态字符串_connectionString=
“数据源=。\\SQLEXPRESS;”+
$“初始目录={U databaseName};”+
“综合安全=真实”;
公共静态列表GetAllTablesForeignConstraints()
{
var results=新列表();
使用(var cn=new SqlConnection{ConnectionString=\u ConnectionString})
{
使用(var cmd=new SqlCommand{Connection=cn})
{
cmd.CommandText=QueryStatements.ForeignKeysAllTables();
cn.Open();
var reader=cmd.ExecuteReader();
while(reader.Read())
{
结果.添加(新约束()
{
TableName=reader.GetString(0),
ConstraintName=reader.GetString(1),
ColumnName=reader.GetString(2),
ReferencedTable=reader.GetString(3),
ReferencedColumn=reader.GetString(4)
});
}
}
}
返回结果;
}
公共静态列表GetTableForeignConstraints(字符串表名)
{
var results=新列表();
使用(var cn=new SqlConnection{ConnectionString=\u ConnectionString})
{
使用(var cmd=new SqlCommand{Connection=cn})
{
cmd.CommandText=QueryStatements.ForeignKeysForSingleTable();
cmd.Parameters.AddWithValue(“@TableName”,TableName);
cn.Open();
var reader=cmd.ExecuteReader();
while(reader.Read())
{
结果.添加(新约束()
{
TableName=reader.GetString(0),
ConstraintName=reader.GetString(1),
ColumnName=reader.GetString(2),
ReferencedTable=reader.GetString(3),
ReferencedColumn=reader.GetString(4)
});
}
}
}
返回结果;
}
公共静态列表GetTableNameList()
{
var results=新列表();
使用(var cn=new SqlConnection{ConnectionString=\u ConnectionString})
{
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();
        }
    }
}