Einzelnen Beitrag anzeigen

Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#1

Timespan-Umwandlung ungültig bei Firebird und typ.DataSet

  Alt 30. Sep 2006, 12:51
Datenbank: Firebird • Version: 2.0 • Zugriff über: Firebird NET Provider 2.0.1.0
Hallo,

ich habe mir zu einer Firebird-DB ein typisiertes DataSet durch XSD.exe erzeugen lassen. Der FB-Datentyp TIME scheint in NET bei der Umwandlung in TimeSpan Probleme zu verursachen, wenn ich es als Dauer (xsd:duration) und nicht als Uhrzeit (xsd:time) interpretieren möchte:

SQL-Code:
CREATE TABLE SENDUNG (
    ID D_ZAHL NOT NULL /* D_ZAHL = INTEGER DEFAULT 0 NOT NULL */,
    TITEL_ID D_ZAHL /* D_ZAHL = INTEGER DEFAULT 0 NOT NULL */,
    DATUM D_DATE NOT NULL /* D_DATE = DATE */,
    VON D_ZEIT NOT NULL /* D_ZEIT = TIME */
    // usw. weitere Felder );
Dazu habe ich (teilweise manuell) eine Daten.xsd erzeugt u.a. mit diesem Inhalt:
XML-Code:
<xsd:element name="Sendung">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="ID" msdata:AutoIncrement="true" type="xsd:int" />
      <xsd:element name="Titel_ID" msdata:AutoIncrement="false" type="xsd:int" />
      <xsd:element name="Datum" type="xsd:date" minOccurs="0" />
      <xsd:element name="von" type="xsd:duration" minOccurs="0" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
Daraus hat XSD folgenden C#-Quelltext erzeugt:
Code:
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public System.TimeSpan von {
    get {
        try {
            return ((System.TimeSpan)(this[this.tableSendung.vonColumn]));
        }
        catch (System.InvalidCastException e) {
            throw new System.Data.StrongTypingException("Der Wert für Spalte von in Tabelle Sendung ist DBNull.", e);
        }
    }
    set {
        this[this.tableSendung.vonColumn] = value;
    }
}
Beim Einlesen der Daten (im Feld 'Von' steht der Wert '12:07:00') über DataAdapter erhalte ich die folgende Fehlermeldung:
Zitat:
Die angegebene Umwandlung ist ungültig. <01.01.1970 12:07:00> konnte nicht in der von-Spalte gespeichert werden. Erwarteter Typ: TimeSpan
In meiner jetzigen Situation konnte ich 'xsd:duration' durch 'xsd:time' ersetzen und die cs-Datei neu erstellen lassen - und alles funktioniert einwandfrei. Es bleibt die generelle Frage: Wie muss ein duration-Wert in einer FB-DB gespeichert werden, damit er in einem NET-DataSet genutzt werden kann? Ich habe nämlich noch ein weiteres Feld, das wirklich eine Dauer bezeichnet!

Danke für Hinweise! Jürgen

PS. Aus mehreren praktischen Gründen möchte ich Datum, Startzeit "Von" und Schlusszeit "Bis" trennen. Bitte nicht darüber streiten.
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat