GetSchemaTable () не возвращает свойство IsKey - PullRequest
0 голосов
/ 26 июня 2018

- Привет, Мир! -

Я работаю над C # с проектом ASP.NET и столкнулся с проблемой. Проект состоит в том, чтобы динамически загружать метаданные и записи из таблиц для их редактирования без статического определения того, какие таблицы можно редактировать. Поэтому мне нужно получить схему / метаданные разных таблиц.

Вот что у меня есть:

// initialize the connection
using (SqlConnection con = new SqlConnection(metadata.DatabaseString))
{
    // open the connection
    con.Open();

    // initialize a new SqlCommand to get the schema
    SqlCommand command = con.CreateCommand();
    command.CommandType = CommandType.Text;

    // 0 = 1 ensures it's always an empty data set
    command.CommandText = "SELECT * FROM " + metadata.TableName + " WHERE 0=1;";

    // set to SchemaOnly to improve performance (i think)
    SqlDataReader reader = command.ExecuteReader(CommandBehavior.SchemaOnly);

    // GetSchemaTable() gets the table's metadata
    DataTable dataTable = reader.GetSchemaTable();

    // loops through all the rows of the data table
    foreach (DataRow row in dataTable.Rows)
    {
        // field names found here: https://msdn.microsoft.com/en-us/library/system.data.datatablereader.getschematable(v=vs.110).aspx#Remarks
        metadata.ColumnMetadata.Add(new ColumnWrapper()
        {
            ColumnType = GetTypeFromSql(row.Field<string>("DataTypeName")),
            ColumnRawType = row.Field<string>("DataTypeName"),
            ColumnName = row.Field<string>("ColumnName"),
            ByteSize = row.Field<int>("ColumnSize"),
            IsKey = row.Field<bool?>("IsKey") ?? false
        });
    }
}

Проблема в том, что поле IsKey всегда пусто. Моя таблица SQL Server была создана с использованием следующего запроса:

CREATE TABLE [dbo].[Dtm_LKUP_Role] (
    [DtmRoleId] INT IDENTITY (1, 1) NOT NULL,
    [RoleName]  VARCHAR(32) NOT NULL,
    [IsActive]  BIT DEFAULT ((1)) NOT NULL,
    PRIMARY KEY CLUSTERED ([DtmRoleId] ASC)
);

Вот что я пробовал до сих пор:

  • Использовать другую таблицу, те же результаты
  • Доступ dataTable.Columns["IsKey"]

Независимо от того, куда я смотрю, я не могу найти нужную мне информацию. У кого-нибудь есть идеи о том, что может вызвать это? В случае, если это уместно, я использую файл MDF и LocalDB для подключения к базе данных, а не живой сервер.

1 Ответ

0 голосов
/ 26 июня 2018

Хьюстон, у нас взлет!

Основываясь на помощи mjwills, мне удалось заставить ее работать, изменив код на следующее:

// initialize the connection
using (SqlConnection con = new SqlConnection(metadata.DatabaseString))
{
    // open the connection
    con.Open();

    // initialize a new SqlCommand to get the schema. 0 = 1 ensures an empty data set
    SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM " + metadata.TableName + " WHERE 0=1", con);

    // GetSchemaTable() gets the table's metadata
    DataTable dataTable = new DataTable();

    // tell the adapater to fill in the missing schema
    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;

    // fill the datatable with the schema
    adapter.FillSchema(dataTable, SchemaType.Mapped);

    // loops through all the rows of the data table
    foreach (DataColumn column in dataTable.Columns)
    {
        // field names found here: https://msdn.microsoft.com/en-us/library/system.data.datatablereader.getschematable(v=vs.110).aspx#Remarks
        metadata.ColumnMetadata.Add(new ColumnWrapper()
        {
            ColumnType = column.DataType,
            ColumnName = column.ColumnName,
            ByteSize = column.MaxLength,
            IsKey = dataTable.PrimaryKey.Contains(column)
        });
    }
}

Я ценю всю помощь тех, кто прокомментировал мой оригинальный вопрос:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...