Laden...

SQL Lite - Spalten hinzufügen, wenn nicht vorhanden

Erstellt von Max1809 vor 11 Jahren Letzter Beitrag vor 11 Jahren 7.553 Views
M
Max1809 Themenstarter:in
67 Beiträge seit 2011
vor 11 Jahren
SQL Lite - Spalten hinzufügen, wenn nicht vorhanden

verwendetes Datenbanksystem: <SQL Lite>

Hallo,

die Überschrift sagt alles. Ich würde gerne, wenn die Spalte nicht existiert, diese hinzufügen.

Wie mache ich das am besten?

Ich arbeite mit einem "DatenContainer" - also eine Klasse die von meinem Datenmodell erbt und den ConnectionString beim instanziieren befüllt.

So hab ich es gelöst:

  DatenContainer dmc = new DatenContainer();
            dmc.Connection.Open();

            dmc.ExecuteStoreCommand("ALTER TABLE dbZaehler ADD COLUMN test nVarChar");

            dmc.Connection.Close();

Das funktioniert soweit auch, allerdings nur solange diese Spalte tatsächlich nicht vorhanden war. Wenn diese Spalte bereits existierte, bekomme ich hier eine Exception.

F
10.010 Beiträge seit 2004
vor 11 Jahren

Ja und?
Dann fang die Exception eben ab.
Du solltest auf jeden Fall eine Versionierung einführen.

Einfacher geht sowas z.b. mit FluentMigrator dann hast du es auch gleich DB unabhängig.

Wobei sachen wie dmc.Connection.Open(); von schlechtem Design zeugen.

D
615 Beiträge seit 2009
vor 11 Jahren

Hallo Max1809

...solltest du es doch mit reinem SQL lösen wollen, könntest du sowas machen...

Vorher prüfen ob diese Column existiert, dies könnte etwa so aussehen:


IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = TABLENAME AND COLUMN_NAME = TEST)
BEGIN
   ALTER TABLE TABLENAME ADD TEST nVarChar
END



Beste Grüsse

Diräkt

3.825 Beiträge seit 2006
vor 11 Jahren

Oder geh in einem DataReader alle Spalten durch und schau ob die Spalte bereits vorhanden ist.

Ich mach das auch so :

Alle Felder anlegen die nicht vorhanden sind.

So ist die Datenbankstruktur immer aktuell, auch ohne Versionierung.

Ganz grob aus den Kopf :


string colname = "Test";
DbDataReader dr = null;
...
bool fieldexists = false;
DataTable dt = dr.GetSchemaTable();
foreach (DataRow rw in dt.Rows)
    if (colname == rw["ColumnName"].ToString()) fieldexists = true;
if (!fieldexists)
{
    ...
}

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

M
Max1809 Themenstarter:in
67 Beiträge seit 2011
vor 11 Jahren
foreach (DataRow rw in dt.Rows)
    if (colname == rw["ColumnName"].ToString()) fieldexists = true;

Das trifft bei mir immer zu (also filedExsists bleibt False und er versucht die Spalte anzulegen), da unter rw["ColumnName"] keine "Namen" von Spalten stehen, sondern folgendes:

08.08.2012 11:16:30;DEBUG;TABLE_CATALOG
08.08.2012 11:16:30;DEBUG;TABLE_SCHEMA
08.08.2012 11:16:30;DEBUG;TABLE_NAME
08.08.2012 11:16:30;DEBUG;COLUMN_NAME
08.08.2012 11:16:30;DEBUG;COLUMN_GUID
08.08.2012 11:16:30;DEBUG;COLUMN_PROPID
08.08.2012 11:16:30;DEBUG;ORDINAL_POSITION
08.08.2012 11:16:30;DEBUG;COLUMN_HASDEFAULT
08.08.2012 11:16:30;DEBUG;COLUMN_DEFAULT
08.08.2012 11:16:30;DEBUG;COLUMN_FLAGS
08.08.2012 11:16:30;DEBUG;IS_NULLABLE
08.08.2012 11:16:30;DEBUG;DATA_TYPE
08.08.2012 11:16:30;DEBUG;TYPE_GUID
usw .

3.825 Beiträge seit 2006
vor 11 Jahren

da unter rw["ColumnName"] keine "Namen" von Spalten stehen

Das ist aber der Standardwert nach "GetSchema".

Ohne "GetSchema" :


string colname = "Test";
DbDataReader dr = null;
...
bool fieldexists = false;
for (int i = 0; i < dr.FieldCount; i++)
    if (colname == dr.GetName(i)) fieldexists = true;
if (!fieldexists)
{
    ...
}

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

F
10.010 Beiträge seit 2004
vor 11 Jahren

Hingefrickelt bekommt man sowas immer, aber das hat mit vernünftiger Architektur nichts zu tun.
Da ist kein vernünftiges ChangeManagement, keine Versionierung und damit keine vernünftige Kontrolle gegeben.

Fluent NHibernate and Fluent Migrator
Das ist wirklich nicht schwer.
FluentMigrator kommt sehr gut mit SQLite klar.

Wenn man EF benutzt ist es ab 4.3 auch enthalten.
EF 4.3 Code-Based Migrations Walkthrough