FAQ
既存のフィーチャクラスにフィールドを追加する方法

ナレッジ番号:5321 | 登録日:2023/07/26 | 更新日:2024/11/21

概要

既存のフィーチャクラスに対してフィールドを追加するには、IFeatureClass::AddField メソッドを使用します。

この時、発生する可能性のあるエラー コードは以下の通りです。

  • FDO_E_TABLE_DUPLICATE_COLUMN:
    指定の名称のフィールドがもうすでにテーブルに存在している。
  • FDO_E_NO_SCHEMA_LICENSE:
    フィーチャクラスのスキ-マを変更するライセンスがない。例えば Desktop の Basic ライセンスでジオメトリックネットワーク、トポロジ、(フィーチャリンク アノテーションのような)コンポジット リレーションシップクラスに参加しているフィーチャクラスにフィールドを追加しようとした場合等。また、ライセンスは保有していてもライセンシングが適切になされなかった場合。

フィーチャクラスに新しくフィールドを追加する前には、ISchemaLock インタフェースを利用して排他的スキーマロックを取得するようにします。

Image

サンプル コード

protected override void OnClick()
{
   //最上位のレイヤーのフィーチャクラスを取得
   IMxDocument pMxDocument = ArcMap.Document;
   IMap pMap = pMxDocument.FocusMap;
   ILayer pLayer = pMap.get_Layer(0);
   IFeatureLayer pFeatureLayer = (IFeatureLayer)pLayer;
   IFeatureClass pFeatureClass = (IFeatureClass)pFeatureLayer.FeatureClass;

   //フィールドの新規作成とプロパティの設定
   IFieldEdit pField = new FieldClass();
   pField.Name_2 = "Sample";
   pField.AliasName_2 = "サンプル";
   pField.Type_2 = esriFieldType.esriFieldTypeString;
   pField.Length_2 = 16;

   ISchemaLock schemaLock = (ISchemaLock)pFeatureClass;
   try
   {
      // 排他ロックが取得できない可能性もあるため、try ブロックは必要です。
      schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
      // フィールドを追加します。
      pFeatureClass.AddField(pField);
   }
   catch (Exception exc)
   {
      // 以下の1文はアプリケーションに応じて適切に処理してください。
      Console.WriteLine(exc.Message);
   }
   finally
   {
      // エラーが起きても起きなくても、finally ブロックでロックを共有にします。
      schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
   }
}
Protected Overrides Sub OnClick()
   '最上位のレイヤーのフィーチャクラスを取得
   Dim pMxDocument As IMxDocument = My.ArcMap.Document
   Dim pMap As IMap = pMxDocument.FocusMap
   Dim pLayer As ILayer = pMap.Layer(0)
   Dim pFeatureLayer As IFeatureLayer = CType(pLayer, IFeatureLayer)
   Dim pFeatureClass As IFeatureClass = pFeatureLayer.FeatureClass

   'フィールドの新規作成とプロパティの設定
   Dim pField As IFieldEdit = New FieldClass()
   pField.Name_2 = "Sample"
   pField.AliasName_2 = "サンプル"
   pField.Type_2 = esriFieldType.esriFieldTypeString
   pField.Length_2 = 16

   Dim schemaLock As ISchemaLock = CType(pFeatureClass, ISchemaLock)
   Try
       ' 排他ロックが取得できない可能性もあるため、try ブロックは必要です。
       schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock)
       ' フィールドを追加します。
       pFeatureClass.AddField(pField)
   Catch exc As Exception
       ' 以下の1文はアプリケーションに応じて適切に処理してください。
       Console.WriteLine(exc.Message)
   Finally
       '  エラーが起きても起きなくても、finally ブロックでロックを共有にします。
       schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock)
   End Try
End Sub

メタデータ

機能

種類

製品