ArcEngine GDBデータベース検索方法まとめ
14723 ワード
オリジナル: http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=59907は、関係データベースに対して、いくつかのクエリインターフェースを定義している。
1.従来のITable、IretureClassインターフェースは私たちが一番よく使うもので、同じテーブル内のデータ検索、更新操作を完成します。
2.IWorkspace.ExecuteSQLは、関係データベースのすべてのDDLとDMLのSQL文を実行することができます。この関数でSQL文を実行するとArcEngineのストレージ機構をバイパスしてしまいますので、SDEデータの整合性(主にSDEのシステムテーブル記録を更新する場合)が損なわれる可能性がありますので、注意が必要です。また、この関数は実行後に結果を返さないため、この関数でクエリー文を実行できないことを決定しました。
1.従来のITable、IretureClassインターフェースは私たちが一番よく使うもので、同じテーブル内のデータ検索、更新操作を完成します。
1
//
IFeaturWorkspace pFWork, ITablepTab=pFWork.OpenTable("DLTB");
2
IQueryFilter pqf
=
new
QueryFilterClass();
3
pqf.WhereClause
=
"
DLBM like '01_'
"
;
4
ICursor pCur
=
pTab.Search(pqf,
true
);
2.IWorkspace.ExecuteSQLは、関係データベースのすべてのDDLとDMLのSQL文を実行することができます。この関数でSQL文を実行するとArcEngineのストレージ機構をバイパスしてしまいますので、SDEデータの整合性(主にSDEのシステムテーブル記録を更新する場合)が損なわれる可能性がありますので、注意が必要です。また、この関数は実行後に結果を返さないため、この関数でクエリー文を実行できないことを決定しました。
// DLJX (SqlServer )。
// : 2009-7-13 2009-1-1
// IWorkspace pWork,
pWork.ExecuteSQL("update DLJX_H set GDB_
FROM_DATE='2009-1-1' whereobjectid=2andGDB_
FROM_DATE>'2009-7-13' and GDB_TO_DATE<'9999-12-31' ");
// pWork.ExecuteSQL("CREATE TABLE IDS(ID BIGINT NOT NULL, BINDTYPE VARCHAR(20))");
3.IQueryDefインターフェースで各種クエリを実行し、IQueryDefを通じてSQLデータベースエンジンでサポートされているすべてのクエリを実行できます。また、クエリのテーブルが要素クラスであれば、要素クラスの最新データを正しく返します。また、いくつかの有用なクエリが実行されます。以下の例を示します
1
//
2
//
IWorkspace pWork,
3
IQueryDef pQDef
=
pFWork.CreateQueryDef();
4
pQDef.Tables
=
"
DLJX
"
;
5
pQDef.WhereClause
=
"
JXLX='97'
"
;
6
ICursor pCur
=
pQDef.Evaluate();
7
//
( GeometryTable, IWorkspace2.NameExists )
8
pQDef.SubFields
=
"
id
"
;
9
pQDef.Tables
=
"
sysobjects
"
;
10
pQDef.WhereClause
=
"
id = object_id(N'IDS') and OBJECTPROPERTY(id, N'IsUserTable') = 1
"
; ICursor pCur
=
pQDef.Evaluate();
11
IRow pRow
=
pCur.NextRow();
12
if
(pRow
!=
null
) {bExist
=
true
;}
13
//
14
//
: , ArcEngine SubFields ,
//
, , ,
15
pQDef.SubFields
=
"
count(*),sum(TDZMJ),sum(KZZMJ),left(ZLDWDM,6)
"
;
16
pQDef.Tables
=
"
DLTB group by left(ZLDWDM,6)
"
;ICursor pCur
=
pQDef.Evaluate();
上記のICursorに対して、実際に記録されているのは4つのフィールドだけですが、ICursor.Fieldsには5つの要素があります。各フィールド名は、count(*)、sum(TDZMJ)、sum(KZZZMJ)、left(ZLDWDM、6)です。したがって、4番目のフィールドの値を取る必要があります。
1
int
iInx
=
pCur.FindField(
"
left(ZLDWDM
"
);
2
IRow pRow
=
pCur.NextRow();
3
string
sDM
=
pRow.get_Value(iInx).ToString();
4
//
5
pQDef.Tables
=
"
DLTB a left join XZQ b on
6
a.ZLDWDM
=
b.XZQDM
"
7
ICursor pCur
=
pQDef.Evaluate();
4.ArcEngineを使った統計類(IDaStatisticsインターフェースを実現しました)
1
//
IFeaturWorkspace pFWork,
2
ITable pTab
=
pFWork.OpenTable(
"
DLTB
"
);
3
ICursor pCur
=
pDLTBTable.Search(
null
,
false
);
4
I D a t a S t a t i s t i c s p D a t a S t a t
=
n e w
5
DataStatisticsClass();
6
pDataStat.Field
=
"
MJ
"
;
7
pDataStat.Cursor
=
pCur;
8
IStatisticsResults pRes
=
dataStatistics.
9
Statistics;
10
//
, :pRes.Sum
実用的なアプリケーションでは、第1および第3の方法が最も多く使われており、ほとんどのデータクエリのニーズを満たすことができます。第4の方法は完全に第3の方法を使用していますが、複数のデータベースタイプに適応する必要があるなら、第4の方法を使用したほうが便利ですが、性能は第3の方法ほど高くないはずです。個人的には、唯一の値を取得する以外に、他の状況は第3の方法で解決できます。もし異なるデータベースタイプがあれば、クエリの文法フォーマットが一致しない場合、動的にデータベースタイプを判断して分岐を実現して複数のバージョンを実現することができます。第2の方法は、一般的には推奨されません。その理由は、戻り値がないため、主にデータベースのメンテナンスや記録更新操作に使われます。これはSDEシステムの外で行われた操作で、誤ってSDEデータ構造の完全性、整合性が破壊されます。しかし、この方法は無駄とは言えません。他の方法の補足として、保存プロセス、ビュー、SDEシステム以外の自定表の作成にも使えます。また、SDEシステムに詳しいなら、歴史表の記録を修正するタイムスタンプ、ロックの修正などの底のメンテナンスができます。