2011-06-29 9 views
5

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?

risposta

2

Il DataTable ha una proprietà PrimaryKey che è una raccolta di DataColumns.

Se si imposta il parametro quando si chiama ExecuteReader su KeyInfo, è possibile recuperare le informazioni della colonna chiave primaria dalla proprietà chiave primaria.

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

Usando la proprietà ColumnName di ogni colonna della collezione è possibile quindi impostare la proprietà Readonly dei tuoi DataGridView colonne.

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

ci sono anche altri valori utili per CommandBehaviour, come schemaonly, che si possono combinare come mostrato:

table.Load(cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehaviour.SchemaOnly)); 
+0

+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

Problemi correlati