ArcEngine GDBデータベース検索方法まとめ

14723 ワード

オリジナル:  http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=59907は、関係データベースに対して、いくつかのクエリインターフェースを定義している。
  
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システムに詳しいなら、歴史表の記録を修正するタイムスタンプ、ロックの修正などの底のメンテナンスができます。