C'è un modo per dire quando una colonna DataGridView
è una PRIMARY KEY
o una FOREIGN KEY
?DataGridView: determina i valori chiave o le relazioni SQL?
Il motivo per cui lo chiedo è perché mi piacerebbe impostare questi DataGridViewDataColumns
per essere ReadOnly
.
Dopo aver caricato un DataTable
, posso vedere le proprietà SQL-like come AllowDBNull, AutoIncrement, e unico; ma come faccio a sapere quali colonne sono le chiavi?
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);
}
}
Il test in questa ultima riga sopra (!tblC.AllowDBNull && tblC.AutoIncrement && tblC.Unique
) è un hack, e so che funziona solo in alcuni casi.
Ho trovato il post How to determine a primary key for a table in SQL Server? che mostra come scrivere una query SQL per determinarlo, ma posso dire in qualche modo di utilizzare lo DataTable
che fornisco allo DataGridView
?
Ho visto anche il post C# Linq-to-SQL: Refectoring this Generic GetByID method utilizzando Linq-to-SQL, ma (anche se ci provo) non capisco proprio Linq jibberish.
Se la chiave non è supportata, quale sarebbe l'approccio migliore? Due query, una per lo schema e l'altra per i dati, quindi passare attraverso i dati utilizzando lo schema raccolto?
EDIT: Ho notato che quando guardando schema della tabella dati utilizzando:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Table1'
sto restituito un valore di COLUMN_FLAGS
. La tabella che sto osservando mostra un valore di 18
per la mia chiave primaria su questa tabella. E 'un buon test?
+1 Impressionante, signor Hall. Stavo osservando le colonne di 'DataTable' e mai una volta ho pensato che potesse contenere un insieme separato di colonne. – jp2code