Есть ли способ определить, когда столбцы 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
для моего Первичного ключа в этой таблице. Это хороший тест?