Zum Hauptinhalt springen

Tabellen/View und Spalten erzeugen/lesen

Warnung

Benutzen Sie bei MapEdit und Map Datenstrukturen immer die API Funktionen um die Definition von Tabellen/Views/Spalten etc anzulegen, zu ändern oder zu löschen. Benutzen Sie keine SQL Befehle!! Die API Funktionen sorgen dafür das alle Einträge und notwendigen Dinge die zu beachten sind automatisch für Sie erzeugt werden.

Das Datenbank Schema

Über die Klasse "DbSchemaDefinition" können Sie Informationen zu einer Datenbank wie

  • Tabellen
  • Spalten
  • Views
  • Topologien
  • Label Definitionen
  • Utility Model Definitionen
  • uvm.

abfragen und anlegen.

Wenn Sie eine Connection haben bekommen sie das Schema so.

DbSchemaDefinition schema = connection.GetSchemaDefinition();
var tables = this.Schema.Tables;

An vielen Stellen wie dem DialogPlugin ist das aktuelle Schema das dem Dialog zugewiesen ist über "this.Schema" abgerufen werden.

var alle Tabellen = this.Schema.Tables;
var table = this.Schema.Tables["BAUM"];
var spalten table.Columns;

Andere Wege das Schema zu holen:

DbSchemaDefinition schema = this.Repository.GetDbSchema("DBNAME")
Connection cn = this.Project.GetDbConnection("DBNAME");
DbSchemaDefinition schema = this.Repository.GetDbSchema(cn);
DbSchemaDefinition schema = this.Application.Repository.GetDbSchema("DBNAME");
DbSchemaDefinition schema = this.Project.Repository.GetDbSchema("DBNAME");

Anlegen von Tabellen

Es wird geraten wenn notwendig das anlegen von Tabellen immer beim laden des Plugins durchzuführen bzw am Anfang, ansonsten kennen alle anderen Codeteile die Tabelle nicht.

DbSchemaDefinition schema = this.Repository.GetDbSchema("MYDB");


if (schema.Tables.Contains("PERSON"))
{
//Tabelle ist schon vorhanden
return;
}

DbTableDefinition table = new DbTableDefinition(schema, "PERSON");
table.Caption = "My New Table Caption";
table.TableContentType = DbTableContentType.LineString;

//Spalten definieren
table.Columns.Add("NAME", DataType.DbString, 255);
table.Columns.Add("AGE", DataType.DbInt32);
table.Columns.Add("WEIGHT", DataType.DbDouble);
table.Columns.Add("DATE_OF_BIRTH", DataType.DbDate);


//Einen NOT NULL (Spalte die zwingen gefuellt werden muss anlegen)
var colYear = table.Columns.Add("YEAR", DataType.DbInt64, false);
colYear.DefaultValue = "1920"; //Default wert


schema.Tables.CreateTable(table);

//Index auf eine Spalte anlegen
schema.Indexes.CreateIndex(table.Name, false, "AGE");

//Index auf mehrere Spalte anlegen
schema.Indexes.CreateIndex(table.Name, false, "AGE", "WEIGTH");

//Index auf eine Spalte anlegen andere Variante mit Indexname
DbIndexDefinition indexDefinition = new DbIndexDefinition();
indexDefinition.IndexName = "IDX_MYINDEX";
indexDefinition.TableName = table.Name;
indexDefinition.IsUnique = false;
indexDefinition.Columns.Add("NAME");
schema.Indexes.CreateIndex(indexDefinition);

//Eindeutigen Index auf eine Spalte anlegen
schema.Indexes.CreateIndex(table.Name, true, "NAME");

//Am ende des anlegens aller Tabellen immer das Schema resetten
schema.Reset();

Die Spalten FID, GEOM, DATE_CREATED bzw ID bei Domain Tabellen etc müssen nicht definiert werden und werden von der API automatisch abhängig vom gesetzten "table.TableContentType" angelegt.

Beachten Sie das die API für Sie im Hintergrund die MapEdit System Tabellen füllt, Spatial Index anlegt, Spatial Metatabellen füllt uvm.

Wenn Sie keine FID etc wollen und alle Felder der Tabelle selbst festlegen wollen setzen Sie bei table.TableContentType = DbTableContentType.Custom. Die sollten Sie nur in Ausnahmefällen tun.

Anlegen von Views

public void CreateView(string viewName, string sql, string attributeTableName, string geometryTableName, DbKnownViewType viewType, DbTableContentType contentType)

Beispiel:

Anlegen eines einfachen Views

schema.Tables.CreateView("MY_VIEW_NAME", "select fid, name from mytable where id_color=3", "", "", DbKnownViewType.Unknown, DbTableContentType.Point)

Bei "contentType" muss der Geometry Type angegeben werden, wenn der View keine Geometry hat dann DbTableContentType.Attribute.

Anlegen eines Utility Views, also ein View der auf Utility Tabellen geht

schema.Tables.CreateView("MY_UTIL_VIEW_NAME", "select fid, name from mytable where id_color=3", "MY_UTIL_ATTR_TABLE", "MY_UTIL_GEOM_TABLE",
DbKnownViewType.Utility, DbTableContentType.Point)

Für Utility View ist es wichtig das das Programm weis was die zugehörige Attribute Table und Geometrie Tabelle ist. Wird das nicht gemacht dann kommt es zu fehlverhalten bei Professional/Desktop.

Löschen von Tablen/Views


DbTableDefinition table = schema.Tables["MYTABLE"];
schema.Tables.DropTable(table);

//Am ende immer das Schema resetten
schema.Reset();

Löschen von Spalten


DbTableDefinition table = schema.Tables["MYTABLE"];
schema.Tables.DropColumn(table, "NAME");

//Am ende immer das Schema resetten
schema.Reset();