LoadFromOracle 解析邏輯
- 查詢
COL 視圖取得表名、欄位名、型別、長度。
- 建立基本表/欄位物件樹。
- 查詢
user_ind_columns 視圖取得索引欄位,索引名以 PK 開頭者視為主鍵。
完整代碼
public int LoadFromOracle(IDbConnection conn)
{
FillStyle = FillStyleConst.Oracle;
int count = 0;
string sql = "SELECT TName, CName, coltype, width FROM Col ORDER BY TName, CName";
Tables.Clear();
if (conn is OleDbConnection)
Name = ((OleDbConnection)conn).DataSource + " - " + conn.Database;
else
Name = conn.Database;
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
using (IDataReader rd = cmd.ExecuteReader(CommandBehavior.SingleResult))
{
TableInfo last = null;
while (rd.Read())
{
string tn = rd.GetString(0).Trim();
if (last == null || last.Name != tn)
{
last = new TableInfo();
Tables.Add(last);
last.Name = tn;
}
FieldInfo f = new FieldInfo();
last.Fields.Add(f);
f.Name = rd.GetString(1);
f.FieldType = rd.GetString(2);
f.FieldWidth = rd[3].ToString();
count++;
}
}
cmd.CommandText = @"SELECT table_name, column_name, index_name
FROM user_ind_columns
ORDER BY table_name, column_name";
using (IDataReader rd = cmd.ExecuteReader(CommandBehavior.SingleResult))
{
while (rd.Read())
{
var t = Tables[rd.GetString(0)];
if (t != null)
{
string idx = rd.GetString(2);
string fn = rd.GetString(1);
var f = t.Fields[fn];
if (f != null)
{
f.Indexed = true;
if (idx.StartsWith("PK")) f.PrimaryKey = true;
}
}
}
}
}
return count;
}