2011-06-29 5 views
5

DataGridViewの列がPRIMARY KEYまたはFOREIGN KEYのときに通知する方法はありますか?DataGridView:SQLのキー値または関係を判別しますか?

DataGridViewDataColumnsReadOnlyに設定したいと思います。

DataTableをロードした後、私はAllowDBNull自動インクリメント、およびユニークのようなSQLのような特性を見ることができます。どの列がキーであるかをどのようにして知ることができますか?

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クエリを書き込む方法を示すポストHow to determine a primary key for a table in SQL Server?が見つかりましたが、DataGridViewに供給しているDataTableを使用して何らかのことを伝えることはできますか?

私もLinq-to-SQLを使ってポストC# Linq-to-SQL: Refectoring this Generic GetByID methodを見ましたが、(私は試しても)私はちょうどそのLinqジバリッシュを理解していません。

キーがサポートされていないと判断した場合は、どのような方法が最適でしょうか?スキーマ用とデータ用の2つのクエリが収集されたスキーマを使用してデータを処理しますか?

EDIT:

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

私はCOLUMN_FLAGS値を返されています:私は、データテーブルのスキーマを見たときは、使用していることに気づきました。私が見ているテーブルは、私のプライマリキーの値が18であることを示しています。それは良いテストですか?

答えて

2

DataTableは、のコレクションであるプロパティPrimaryKeyを持っています。

ExecuteReaderからKeyInfoを呼び出すときにCommandBehaviorパラメータを設定すると、主キーのプロパティから主キーの列情報を取得できます。

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

あなたは、あなたのDataGridView列のReadonlyプロパティを設定することができ、コレクション内の各列のColumnNameプロパティを使用します。

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

が示すように、あなたが結合することができ、また、SchemaOnlyなどCommandBehaviourための他の有用な値、があります。

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

1恐ろしい、氏ホール。私は 'DataTable'の列を見ていましたが、一度は別の列のセットが含まれているとは考えていませんでした。 – jp2code