PrimaryKeysコレクションを使用して、特定のテーブルの主キーを判別し、対応するインデックス名を取得して、IndexColumnsコレクションからインデックスと主キーを構成する列を取得することができます。
String pkIndxNm = null;
List<String> lstPkColNms = new List<String>();
DataTable dt = dbConn.GetSchema("PrimaryKeys", new[] { owner, tblNm });
if (dt.Rows.Count == 1) {
DataRow pkRow = dt.Rows[0];
pkIndxNm = pkRow["INDEX_NAME"] as String;
// Now use the IndexColumns collection to pick up the names of the
// columns which constitute the primary key.
//
dt = dbConn.GetSchema("IndexColumns", new[] { owner, pkIndxNm });
foreach (DataRow icRow in dt.Rows) {
String colNm = icRow["COLUMN_NAME"] as String;
lstPkColNms.Add(colNm);
}
}
これは、基礎となるSystem.Data.OracleClient接続でSystem.Data.Common.DbConnectionクラスを使用するOracleデータベースに対して機能しました。
他のデータベースの場合、引数として渡すことができるものについて、Restrictionsコレクションを調べる必要がある場合があります。GetSchemaの制限に関するドキュメントはかなり役に立たないようです。制限コレクションのDataTableをダンプするだけで、各コレクションを最適に照会する方法を理解できることがわかりました。
DataTable dt = dbConn.GetSchema("Restrictions");
AppLog.Log.Info("CollectionName | RestrictionName | ParameterName | " +
"RestrictionDefault | RestrictionNumber");
AppLog.Log.Info(" ");
foreach (DataRow r in dt.Rows) {
String s = r["CollectionName"] as String;
s += " | " + r["RestrictionName"] as String;
s += " | " + r["ParameterName"] as String;
s += " | " + r["RestrictionDefault"] as String;
s += " | " + r["RestrictionNumber"].ToString();
AppLog.Log.Info(s);
}
これが私が得たものであり、そこから、配列の1番目と2番目の位置にownerとindexNameを渡して、適切なインデックスに制約することがわかりました。
ユーザー| ユーザー名| 名前| ユーザー名| 1
テーブル| 所有者| 所有者| 所有者| 1
テーブル| テーブル| テーブル名| TABLE_NAME | 2
列| 所有者| 所有者| 所有者| 1
列| テーブル| テーブル名| TABLE_NAME | 2
列| コラム| COLUMNNAME | COLUMN_NAME | 3
ビュー| 所有者| 所有者| 所有者| 1
ビュー| 表示| ビューネーム| VIEW_NAME | 2
同義語| 所有者| 所有者| 所有者| 1
同義語| 同義語| SYNONYMNAME | SYNONYM_NAME | 2
シーケンス| 所有者| 所有者| SEQUENCE_OWNER | 1
シーケンス| シーケンス| シーケンス| SEQUENCE_NAME | 2
ProcedureParameters | 所有者| 所有者| 所有者| 1
ProcedureParameters | ObjectName | オブジェクト名| OBJECT_NAME | 2
関数| 所有者| 所有者| 所有者| 1
関数| 名前| 名前| OBJECT_NAME | 2
IndexColumns | 所有者| 所有者| INDEX_OWNER | 1
IndexColumns | 名前| 名前| INDEX_NAME | 2
IndexColumns | TableOwner | TABLEOWNER | TABLE_OWNER | 3
IndexColumns | TableName | テーブル名| TABLE_NAME | 4
IndexColumns | コラム| COLUMNNAME | COLUMN_NAME | 5
インデックス| 所有者| 所有者| 所有者| 1
インデックス| 名前| 名前| INDEX_NAME | 2
インデックス| TableOwner | TABLEOWNER | TABLE_OWNER | 3
インデックス| TableName | テーブル名| TABLE_NAME | 4
パッケージ| 所有者| 所有者| 所有者| 1
パッケージ| 名前| パッケージ名| OBJECT_NAME | 2
PackageBodies | 所有者| 所有者| 所有者| 1
PackageBodies | 名前| 名前| OBJECT_NAME | 2
引数| 所有者| 所有者| 所有者| 1
引数| PackageName | パッケージ名| PACKAGE_NAME | 2
引数| ObjectName | オブジェクト名| OBJECT_NAME | 3
引数| ArgumentName | ARGUMENTNAME | ARGUMENT_NAME | 4
手順| 所有者| 所有者| 所有者| 1
手順| 名前| 名前| OBJECT_NAME | 2
UniqueKeys | 所有者| 所有者| 所有者| 1
UniqueKeys | Table_Name | テーブル名| TABLE_NAME | 2
UniqueKeys | Constraint_Name | CONSTRAINTNAME | CONSTRAINT_NAME | 3
PrimaryKeys | 所有者| 所有者| 所有者| 1
PrimaryKeys | Table_Name | テーブル名| TABLE_NAME | 2
PrimaryKeys | Constraint_Name | CONSTRAINTNAME | CONSTRAINT_NAME | 3
ForeignKeys | Foreign_Key_Owner | 所有者| FKCON.OWNER | 1
ForeignKeys | Foreign_Key_Table_Name | テーブル名| FKCON.TABLE_NAME | 2
ForeignKeys | Foreign_Key_Constraint_Name | CONSTRAINTNAME | FKCON.CONSTRAINT_NAME | 3
ForeignKeyColumns | 所有者| 所有者| FKCOLS.OWNER | 1
ForeignKeyColumns | Table_Name | テーブル名| FKCOLS.TABLE_NAME | 2
ForeignKeyColumns | Constraint_Name | CONSTRAINTNAME | FKCOLS.CONSTRAINT_NAME | 3