Как получить пользовательские таблицы - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь сузить, какие таблицы я получаю от запроса схемы.Хотя я могу вернуть все таблицы, я видел другие вопросы здесь , но у них нет информации о том, как вернуть пользователю обратно определяемые пользователем таблицы , я хотел бы запросить и

  1. возврат, пользовательские таблицы
  2. возврат таблиц на основе некоторых критериев, например, для таблицы с tenantId col

    public static List<string> GetUserCreatedTables(string connectionString = null)
    {
        if (string.IsNullOrEmpty(connectionString))
            connectionString = Settings.Default.ConnectionString;
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            DataTable schema = connection.GetSchema("Tables");
            List<string> TableNames = new List<string>();
            foreach (DataRow row in schema.Rows)
            {
                TableNames.Add(row[2].ToString().Trim());
            }
            return TableNames;
        }
    }
    

Я знаком с этим методом, где я могу напрямую запрашивать.SELECT Name from Sysobjects where xtype = 'u', но я бы хотел использовать предыдущий метод, чтобы использовать его для запроса других.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Вы можете использовать SMO объекты, чтобы проверить, является ли таблица созданной пользователем таблицей, а также именами столбцов.Как отмечено ниже, свойство IsSystemObject возвращает true для системных объектов.Contains метод Columns может использоваться для проверки имени столбца.Ссылки на Microsoft.SqlServer.ConnectionInfo и Microsoft.SqlServer.SMO необходимо будет добавить в проект со ссылкой на пространство имен Microsoft.SqlServer.Management.Smo.Для просмотра представлений измените объект Table на View в первом цикле foreach.

using Microsoft.SqlServer.Management.Smo;

            Server serv = new Server(@"YourServer");

            //for Windows authentication
            serv.ConnectionContext.LoginSecure = true;
            serv.ConnectionContext.StatementTimeout = 600;
            Database db = serv.Databases["YourDatabase"];

            List<string> TableNames = new List<string>();

            foreach (Table t in db.Tables)
            {
                //check for system objects
                if (!t.IsSystemObject && t.Columns.Contains("tenantId"))
                {
                    //use the Name property to return the table name
                    TableNames.Add(t.Name);
                }
            }
0 голосов
/ 28 декабря 2018

Если вы передадите StructuredTypeMembers вместо Таблицы в GetSchema(), он вернет определенные пользователем типы таблиц и их столбцы.

Чтобы получить отфильтрованный список,Вы можете передать ограничение на GetSchema().Ограничения для StructuredTypeMembers : Каталог , Владелец , Таблица и Столбец .Они передаются в массиве в указанном порядке второму параметру GetSchema().

Чтобы получить пользовательские таблицы со столбцом tenantId , вы можете вызвать GetSchema() следующим образом:

connection.GetSchema("StructuredTypeMembers", (new[] { null, null, null, "tenantId"}));
...