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.
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.
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
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
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 .
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
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