2011-06-29 10 views
5

¿Hay alguna manera de saber cuándo DataGridView columnas es PRIMARY KEY o FOREIGN KEY?DataGridView: ¿Determina los valores o las relaciones clave SQL?

La razón por la que pregunto es porque me gustaría configurar estos DataGridViewDataColumns para ser ReadOnly.

Después de cargar un DataTable, puedo ver propiedades similares a SQL como AllowDBNull, AutoIncrement y único; pero ¿cómo puedo decir qué columnas son claves?

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); 
    } 
} 

La prueba de que la última línea anterior (!tblC.AllowDBNull && tblC.AutoIncrement && tblC.Unique) es un truco, y sé que sólo funciona en algunos casos.

He encontrado el puesto How to determine a primary key for a table in SQL Server? que muestra cómo escribir una consulta SQL para determinar esto, pero puedo saber de alguna manera con el DataTable que yo proporciono a la DataGridView?

También vi la publicación C# Linq-to-SQL: Refectoring this Generic GetByID method usando Linq-to-SQL, pero (aunque lo intento) simplemente no entiendo que Linq jibberish.

Si no es posible determinar la clave, ¿cuál sería el mejor enfoque? Dos consultas, una para el esquema y otra para los datos, luego pasan por los datos usando el esquema recopilado.

EDIT: he notado que cuando se mira en el esquema de la tabla de datos usando:

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

me he vuelto un valor COLUMN_FLAGS. La tabla que estoy viendo muestra un valor de 18 para mi clave principal en esta tabla. ¿Es esa una buena prueba?

Respuesta

2

La DataTable tiene una propiedad PrimaryKey que es una colección de DataColumns.

Si configura el parámetro CommandBehavior cuando llama al ExecuteReader al KeyInfo, puede recuperar la información de la columna de la clave principal desde la propiedad de la clave principal.

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

Utilizando la propiedad ColumnName de cada columna en la colección a continuación, puede establecer la propiedad de sus ReadonlyDataGridView columnas.

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

Existen también otros valores útiles para CommandBehaviour, como SchemaOnly, que se pueden combinar como se muestra:

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

+1 impresionante, señor Hall. Estaba mirando las Columnas 'DataTable' y nunca pensé que podría contener un conjunto separado de columnas. – jp2code

Cuestiones relacionadas