可以使用 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.Common.DbConnection 类和底层 System.Data.OracleClient 连接的 Oracle 数据库。
对于其他数据库,您可能需要检查 Restrictions 集合以了解可以作为参数传递的内容。GetSchema 限制的文档似乎毫无用处。我发现仅转储 Restrictions 集合的 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);
}
这是我得到的,从中我知道在数组的第一个和第二个位置传递所有者和 indexName 以将其约束到正确的索引。
用户 | 用户名 | 姓名 | 用户名 | 1
表 | 所有者 | 所有者 | 所有者 | 1
表 | 表 | 表名 | 表名 | 2
专栏 | 所有者 | 所有者 | 所有者 | 1
专栏 | 表 | 表名 | 表名 | 2
专栏 | 专栏 | 栏名 | COLUMN_NAME | 3
意见 | 所有者 | 所有者 | 所有者 | 1
意见 | 查看 | 视图名 | VIEW_NAME | 2
同义词 | 所有者 | 所有者 | 所有者 | 1
同义词 | 同义词 | 同义词 | SYNONYM_NAME | 2
序列 | 所有者 | 所有者 | SEQUENCE_OWNER | 1
序列 | 序列 | 序列 | SEQUENCE_NAME | 2
程序参数 | 所有者 | 所有者 | 所有者 | 1
程序参数 | 对象名 | 对象名 | 对象名 | 2
功能 | 所有者 | 所有者 | 所有者 | 1
功能 | 姓名 | 姓名 | 对象名 | 2
索引列 | 所有者 | 所有者 | 索引所有者 | 1
索引列 | 姓名 | 姓名 | 索引名称 | 2
索引列 | 桌主 | 桌主 | 表所有者 | 3
索引列 | 表名 | 表名 | 表名 | 4
索引列 | 专栏 | 栏名 | COLUMN_NAME | 5
索引 | 所有者 | 所有者 | 所有者 | 1
索引 | 姓名 | 姓名 | 索引名称 | 2
索引 | 桌主 | 桌主 | 表所有者 | 3
索引 | 表名 | 表名 | 表名 | 4
包 | 所有者 | 所有者 | 所有者 | 1
包 | 姓名 | 包名 | 对象名 | 2
封装体 | 所有者 | 所有者 | 所有者 | 1
封装体 | 姓名 | 姓名 | 对象名 | 2
论据 | 所有者 | 所有者 | 所有者 | 1
论据 | 包名 | 包名 | 包名 | 2
论据 | 对象名 | 对象名 | 对象名 | 3
论据 | 参数名称 | 参数名称 | ARGUMENT_NAME | 4
程序 | 所有者 | 所有者 | 所有者 | 1
程序 | 姓名 | 姓名 | 对象名 | 2
唯一键 | 所有者 | 所有者 | 所有者 | 1
唯一键 | 表名 | 表名 | 表名 | 2
唯一键 | 约束名称 | 约束名称 | 约束_名称 | 3
主键 | 所有者 | 所有者 | 所有者 | 1
主键 | 表名 | 表名 | 表名 | 2
主键 | 约束名称 | 约束名称 | 约束_名称 | 3
外键 | Foreign_Key_Owner | 所有者 | FKCON.OWNER | 1
外键 | Foreign_Key_Table_Name | 表名 | FKCON.TABLE_NAME | 2
外键 | Foreign_Key_Constraint_Name | 约束名称 | FKCON.CONSTRAINT_NAME | 3
外键列 | 所有者 | 所有者 | FKCOLS.OWNER | 1
外键列 | 表名 | 表名 | FKCOLS.TABLE_NAME | 2
外键列 | 约束名称 | 约束名称 | FKCOLS.CONSTRAINT_NAME | 3