Hallo Zusammen,
hat jemand von Euch ne Ahnung, warum folgendes Verhalten auftritt bzw. wie ich das ändern kann?
Ich verwende Delpi 2007 und bin über eine ADOConnection und ein ADODataSet mit einem MS
SQL-Server 2005 verbunden.
Folgende zwei Szenarien verhalten sich unterschiedlich, warum?
I. - a, ich beginne eine Transaktion mit ADOConnection.BeginTrans
- b, ich füge mit ADODataSet1.Insert einen neuen Datensatz hinzu
- c, ich weise einem SMALDATETIME-Feld mit ADODataSet1.FieldByName('Feldname').AsString:='01. 01.1999' zu
- d, ich schicke die Daten mittels ADODataSet1.Post zur Datenbank
- e, ich füge mit ADODataSet1.Insert einen weiteren Datensatz hinzu
- f, ich weise dem SMALDATETIME-Feld mit ADODataSet1.FieldByName('Feldname').AsString:='01. 01.2099' zu
- g, ich schicke die Daten mittels ADODataSet1.Post zur Datenbank
-> was zu einer Exception wegen dem zu großen Jahr führt (Bereichsüberlauf)
- h, ich beende die Transaktion mit ADOConnection1.CommitTrans
- Ergebnis: Keiner der beiden Datensätze ist in der Datenbank vorhanden, weil bei der Exception
anscheinend automatisch ein Rollback durchgeführt wurde.
II. - a, ich beginne eine Transaktion mit ADOConnection.BeginTrans
- b, ich füge mit ADODataSet1.Insert einen neuen Datensatz hinzu
- c, ich weise einem VARCHAR-Feld mit Eindeutigem Index drauf mit ADODataSet1.FieldByName('Feldname').AsString:='Tes t' zu
- d, ich schicke die Daten mittels ADODataSet1.Post zur Datenbank
- e, ich füge mit ADODataSet1.Insert einen weiteren Datensatz hinzu
- f, ich weise dem VARCHAR-Feld mit ADODataSet1.FieldByName('Feldname').AsString:='Tes t' den selben Wert zu
- g, ich schicke die Daten mittels ADODataSet1.Post zur Datenbank
-> was logischerweise zu einer Exception wegen dem eindeutigen Index führt
- h, ich beende die Transaktion mit ADOConnection1.CommitTrans
- Ergebnis: Der erste der beiden Datensätze ist in der Datenbank vorhanden, weil hier bei der Exception
anscheinend kein automatisches Rollback durchgeführt wurde.
Soll bzw. muß das so sein? Und wer ist an diesem Verhalten Schuld : der
SQL-Server,
ADO oder Delphi ?
PS: Das Verhalten in Szenario I konnte ich übrigens nur bei SMALLDATETIME feststellen,
bei DATETIME > 31.12.9999 oder SMALLINTEGER > 32767 z.B. verhält sich das ganze genau wie in Szenario II.
Gruß
Micha
Der Weg ist das Ziel...