DataGridView: определить значения ключа SQL или отношения? - PullRequest
5 голосов
/ 29 июня 2011

Есть ли способ определить, когда столбцы DataGridView являются PRIMARY KEY или FOREIGN KEY?

Причина, по которой я спрашиваю, состоит в том, что я хотел бы установить эти DataGridViewDataColumns равными ReadOnly.

После загрузки DataTable я вижу SQL-подобные свойства, такие как AllowDBNull , AutoIncrement и Unique ; но как мне узнать, какие столбцы являются ключами?

private void GetData(string tableName, SqlConnection con) {
  bool wasOpen = (con.State == ConnectionState.Open);
  DataTable table = new DataTable(tableName);
  string sqlText = string.Format(SQL_SELECT_COMMAND, tableName);
  SqlCommand cmd = new SqlCommand(sqlText, con);
  if (!wasOpen) {
    con.Open();
  }
  table.Load(cmd.ExecuteReader());
  if (!wasOpen) {
    con.Close();
  }
  dataGridView1.DataSource = table.DefaultView;
  for (int i = 0; i < table.Columns.Count; i++) {
    DataColumn tblC = table.Columns[i];
    DataGridViewColumn dgvC = dataGridView1.Columns[i];
    dgvC.ReadOnly = (!tblC.AllowDBNull && tblC.AutoIncrement && tblC.Unique);
  }
}

Тест в последней строке выше (!tblC.AllowDBNull && tblC.AutoIncrement && tblC.Unique) является хаком, и я знаю, что он работает только в некоторых случаях.

Я нашел сообщение Как определить первичный ключ для таблицы в SQL Server? , показывающий, как написать SQL-запрос, чтобы определить это, но могу ли я как-то сказать, используя DataTable, который я предоставляю к DataGridView?

Я также видел сообщение C # Linq-to-SQL: рефракторинг этого общего метода GetByID с использованием Linq-to-SQL, но (хотя я и пытаюсь), я просто не понимаю, что Linq - бред.

Если определение ключа не поддерживается, каков будет наилучший подход? Два запроса, один для схемы, другой для данных, затем обрабатывают данные, используя собранную схему?

РЕДАКТИРОВАТЬ: Я заметил, что при просмотре схемы таблицы данных с помощью:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Table1'

Мне возвращается значение COLUMN_FLAGS. Таблица, на которую я смотрю, показывает значение 18 для моего Первичного ключа в этой таблице. Это хороший тест?

1 Ответ

2 голосов
/ 29 июня 2011

У DataTable есть свойство PrimaryKey, которое является набором DataColumns.

Если вы установите параметр CommandBehavior при вызове ExecuteReader в KeyInfo, затем вы можете получить информацию о столбце первичного ключа из свойства первичного ключа.

table.Load(cmd.ExecuteReader(CommandBehavior.KeyInfo));

Используя свойство ColumnName каждого столбца в коллекции, вы можете установить свойство Readonly вашего DataGridView столбцов.

foreach (DataColumn d in dt.PrimaryKey)
{
    if (dataGridView1.Columns[d.ColumnName] != null)
    {
        dataGridView1.Columns[d.ColumnName].ReadOnly = true;
    }
}

Есть и другие полезные значения для CommandBehaviour, такие как SchemaOnly, которые можно комбинировать, как показано:

table.Load(cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehaviour.SchemaOnly));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...