GUID muss 32 Ziffern mit 4 Bindestrichen enthalten (...)

Andre

The Shocker
Hallo zusammen,

ich soll nun ein Tool in C# zu Ende schreiben, womit ich ganz einfach Daten über eine Oracle-Datenbank verwalte.
Um die Datenbank zu verwalten (Tabellen, etc. ) benutze ich den Telerik ORM.
Nun zu meinem Problem, ich möchte nun die Daten, die ich in Textboxen eingebe, in einer Datenbank speichern.
Bis zum Schreiben in die Oracle Datenbank läuft auch noch alles ohne Probleme und dann kommt folgende Fehlermeldung:

Code:
System.FormatException: GUID muss 32 Ziffern mit 4 Bindestrichen enthalten (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
   bei System.Guid..ctor(String g)
   bei OpenAccessRuntime.Relational.sql.SqlDriver.convertId(Object v, Int32 t)
   bei OpenAccessRuntime.Relational.sql.SqlDriver.mapAutoIncColumnValue(RelationalTable classTable, Object v)
   bei OpenAccessRuntime.Relational.sql.OracleSqlDriver.getAutoIncColumnValue(RelationalTable classTable, Connection con, Statement stat)
   bei OpenAccessRuntime.Relational.sql.AutoIncRelationalKeyGenerator.generatePrimaryKeyPost(String className, RelationalTable classTable, Object[] data, Connection con, Statement stat)
   bei OpenAccessRuntime.Relational.RelationalStorageManager.generateInserts(NewObjectOID oid, Int32 index, ClassMetaData cmd, PersistGraph graph, Int32[] fieldNos, CharBuf s, Object[] oidData, IntArray toUpdateIndexes)
   bei OpenAccessRuntime.Relational.RelationalStorageManager.persistPass1(PersistGraph graph)
   bei OpenAccessRuntime.Relational.RelationalStorageManager.doUpdates(StatesToStore toStore, StateContainer container, Boolean retainValues)
   bei OpenAccessRuntime.Relational.RelationalStorageManager.store(StatesToStore toStore, DeletePacket toDelete, Boolean returnFieldsUpdatedBySM, Int32 storeOption, Boolean evictClasses)



Hier nen Code-Ausschnitt
Code:
datcombox box = new datcombox();
            datcom_bemerkung bemerkung = new datcom_bemerkung();
            simkarten simkarte = new simkarten();
            status_datcom status = new status_datcom();
            DatcomEntities.DatcomboxTransactions dt = DatcomEntities.DatcomboxTransactions.GetInstance();


            if (tbBemerkung.Text.Trim().Length > 0)
            {
                bemerkung.bemerkung = tbBemerkung.Text;
                bemerkung.dat_ins = DateTime.Now;
                bemerkung.guid_bemerkung = Guid.NewGuid();
            }

            box.datcomnr = tbSnr.Text;
            box.firmware = tbFirmware.Text;
            box.kfz_kennzeichen = tbKennzeichen.Text;
            box.guid_datcombox = Guid.NewGuid();
            box.dat_ins = DateTime.Now;
            box.dat_upd = DateTime.Now;

            simkarte.dat_ins = DateTime.Now;
            simkarte.kartennr = tbKartennummer.Text;
            simkarte.telnr = tbTelnr.Text;
            simkarte.guid_simkarten = Guid.NewGuid();
            simkarte.dat_ins = DateTime.Now;
            simkarte.dat_upd = DateTime.Now;

            status.status_text = cbStatus.Text;

            box.datcom_bemerkungs.Add(bemerkung);
            box.simkartens.Add(simkarte);
            bemerkung.status_datcoms.Add(status);
            dt.addDatcombox(box);

Code:
public void addDatcombox(datcombox box)
        {
            using (EntitiesModel em = new EntitiesModel())
            {
                em.Add(box);
                em.SaveChanges();
                
            }
        }
Und der Fehler tritt beim "em.SaveChanges()" auf.

Ich versuche diesen fehler schon seit ca. 3 stunden zu beheben.
 

Maliko

Grünschnabel
Hey du,

was bekommst du denn bei

Code:
           box.guid_datcombox = Guid.NewGuid();
           simkarte.guid_simkarten = Guid.NewGuid();

im Einzelschrittmodus ausgegeben?
 

Andre

The Shocker
bei
Code:
box.guid_datcombox = Guid.NewGuid();
bekomme ich: {03ae43ae-669b-487e-a1f0-9f6524ef4dcf}

und bei
Code:
 simkarte.guid_simkarten = Guid.NewGuid();
bekomme ich: {c1384b73-469b-417b-b288-c8eae15bb56f}

sind zwei verschiedene Tabellen "guid_datcombox" und "guid_simkarten" sind dabei die Primary Keys.

hoffe es hilft, sonst einfach weiter fragen ;P
 

Maliko

Grünschnabel
hmm. Hast du vielleicht noch nen Pimärschlüssel, welche eine GUID ist in der Datenbank? Oder sind das die beiden GUIDs aus dem Code? Weil die erzeugten GUIDs sind absolut korrekt (vorrausgesetzt du hast die {} davorgesetzt. Ansonsten musst du die noch rauslöschen).
 

Andre

The Shocker
Also ich hab insgesamt 7 Tabellen. Wovon aber nicht immer alle Daten erhalten. Z.b. trag ich nur die Niederlassung ein, und dort kommt dann der Fehler. Aber die anderen Tabellen werden doch gar nicht beansprucht, dann brauchen die doch auch keine GUID, oder?

BD.JPG

Das "{ } " wird immer automatisch mitgeben. Das hier hab ich in der Zwischenzeit auch schonmal ausprobiert,

Code:
            string test1 = Guid.NewGuid().ToString("N");
            string test2 = Guid.NewGuid().ToString("D");
            string test3 = Guid.NewGuid().ToString("B");
            string test4 = Guid.NewGuid().ToString("D");
            string test5 = Guid.NewGuid().ToString("");
            box.guid_datcombox = Guid.NewGuid().ToString("test 1-5 ");

aber nichts davon möchte er.
 

Andre

The Shocker
Hallo zusammen,

also ich hab es endlich geschafft den Fehler zu beheben.

Bisher habe ich die Tabellen über den ORM in Visual Studio erzeugt (genau da liegt der Fehler).
Da die Oracle-Datenbank kein GUID an sich kennt, sondern dies als RAW(16) bezeichnet, hat der ORM aus dem GUID ein VARCHAR(20) gemacht, und dies dann so in die Datenbank geschrieben.
Wenn man nun im Programm sagt, hier du bekommst eine GUID und er diesen TYP in der Tabelle nicht findet (sondern den VARCHAR(20) an dieser stelle), kommt es zu diesem Fehler.
Code:
GUID muss 32 Ziffern mit 4 Bindestrichen enthalten (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).

Als Lösung dazu habe ich die Tabellen über die Oracle-Datenbank erstellt und mir die Tabellen dann in Visual Studio aus der Oracle-Datenbank geben lassen. Allerdings tritt dann der Fehler auf, dass ORM keine RAW(16) kennt und daraus dann ein Byte-Array macht.
Aber zum Glück kann man ja in C# die erzeugte GUID in ein Byte-Array konvertieren lassen ;)
Code:
 box.GUID__DATCOMBOX = Guid.NewGuid().ToByteArray();