none
falsche syntax in der nähe von '44447' bei INSERT-Kommando RRS feed

  • Frage

  • Mein Programm ist in VB.NET 2008 geschrieben und lief jahrelang als Paket auf einem SQL2008.

    Vor kurzem wurde der SQL2008 auf SQL2012 umgestellt und seither kracht's:

    An einer betsimmten Stelle des Programm soll in einer Tabelle ein neuer Datensatz angelegt werden:

    Den VB.NET-Code poste ich hier mal. Ich führe das Problem auf den SQL2012 zurück, da der Code bis zum Upgrade klaglos funktioniert hat.

    Try
          LogMessage("Versuche neuen Datensatz für die Sitzung in Tabelle HBCI_Sessions anzulegen ...", 9, False, True, True, sw, _
                      , hbcicontact, progrun_key)
          dr_session = hbci_session.NewRow                'neuen Datensatz in 'HBCISession' anlegen
          dr_session("Session_Contact") = hbcicontact     'Verweis auf Tabelle 'HBCIKonatkte'
          dr_session("Session_Run") = progrun_key         'Verweis auf Tabelle 'HBCIRuns'
          hbci_session.AddHBCISessionRow(dr_session)      'Datensatz speichern
          da_session.Update(dr_session)
          'SessionID zwischenspeichern
          session_nr = dr_session("SessionID")
          LogMessage("Datensatz erfolgreich angelegt. Sessionnr= " & session_nr.ToString, 9, _
                     False, True, True, sw, session_nr, hbcicontact, progrun_key)
        Catch ex As Exception
          LogMessage("Fehler beim Anlegen des Session-Datensatzes in Tabelle 'HBCISession'." & vbCrLf & _
                     "Fehlertext:" & vbCrLf & ex.Message, 0, True, True, True, _
                      sw, , hbcicontact, progrun_key, EventLogEntryType.Error)
    
          'Der Rückgabewert sollte jetzt immer noch 'Nothing' sein
          Exit Function
        End Try

    Der Fehler tritt in der Zeile auf:

    da_session.Update(dr_session)

    Die Fehlermeldung lautet: 'Falsche Syntax in der Nähe von '44447'. System.Data.SqlClient.SqlException; Procedure 'HBCISessionITrig'

    Die Felder werden übrigens korrekt mit Werten befüllt.

    Ich habe dann in der zugehörigen .xsd das insert-Command nachvollzogen und kann dort denselben Fehler auslösen.

    Den Wert 44447 finde ich natürlich nicht in der Insert-Anweisung.

    Wie kann ich diesem Effekt auf die Spur kommen ? Ähnliche Vorgänge mit anderen Tabellen funktionieren problemlos.

    Samstag, 31. August 2013 13:46

Antworten

  • Hallo Nico,

    schau mal unterhalb der Tabelle, die per INSERT oder UPDATE angesprochen wird. Dort gibt es ebenfalls einen Node "Trigger" und da solltest Du den finden (wenn "HCBISessionITrig" denn ein Trigger ist)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert NicoNi Sonntag, 1. September 2013 17:51
    Samstag, 31. August 2013 17:01
    Moderator

Alle Antworten

  • Hi,

    was ist denn "HBCISessionITrig"? Hört sich für mich nach einem Trigger an. Den sollte man mal prüfen und schauen, ob der den Fehler verursacht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 31. August 2013 15:32
    Moderator
  • Ich habe ehrlich keine Ahnung woher dieser Trigger? stammt.

    Habe eben im SQL Managemnet Studio nachgesehen: IN der betreffenden DB findet man nichts unter Datenbanktrigger.

    Der Trigger taucht übrigens in den Eigenshcaften der exception (Procedure) auf.

    Samstag, 31. August 2013 16:07
  • Hallo Nico,

    schau mal unterhalb der Tabelle, die per INSERT oder UPDATE angesprochen wird. Dort gibt es ebenfalls einen Node "Trigger" und da solltest Du den finden (wenn "HCBISessionITrig" denn ein Trigger ist)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert NicoNi Sonntag, 1. September 2013 17:51
    Samstag, 31. August 2013 17:01
    Moderator
  • In der Tat findet man unterhalb der Tabelle HBCISession einen Trigger namens 'HBCISession_ITrig' (man beachte den _ im Vergleich zur o.g. Schreibweise)

    Der Trigger lautet:

    /* * KEINE EINFÜGUNG BEI FEHLEN EINES PASSENDEN SCHLÜSSELS IN 'HBCIKontakte' */

    IF

    (SELECTCOUNT(*)FROMinserted)!=

    (SELECTCOUNT(*)FROMHBCIKontakte,insertedWHERE (HBCIKontakte.HBCIContact_ID=inserted.Session_Contact))


       

    BEGIN


           

    RAISERROR44447 'Der Datensatz kann nicht hinzugefügt oder geändert werden. Aufgrund der Regeln für die referentielle Integrität ist in der Tabelle ''HBCIKontakte'' ein Detaildatensatz erforderlich.'


    Da wäre dann auch der Fehler 44447. Die Meldung ist allerdings absolut Banane.

    Leider scheint hier trotzdem was schiefzulaufen.

    Der bemängelte Schlüssel wird im VB.NET-Code mit '8' besetzt. Und die ID 8 ist definitiv in der übergeordneten Tabelle vorhanden.

    Ich bin immer noch ratlos. Müsste mein Code den hbcicontact in einen anderen Typ umwandeln ?

           

    ROLLBACKTRANSACTION


       

    END


    Sonntag, 1. September 2013 17:57
  • Ich habe gerade einen Hinweis gefunden, daß sich mit SQL 2012 die Syntax für RAISERRO geändert habe.

    Wenn ich den oben zitierten SQL-Text im Management-STudio analysieren lasse, dann kommt tatsächlich genau der Fehler, nämlich falsche Syntax in der Nähe von 44447.

    Der Fehler hat also nicht an sich nichts mit fehlerhaften Daten zu tun, sondern ist eine direkte Folge des Upgrades auf SQL2012.

    Gibt es da irgendwelche KOnvertierungshilfen?

    Ich schätze, es gibt noch zahlreiche andere Trigger, die ähnlich fehlerhaft sind .

    Sonntag, 1. September 2013 19:12
  • Hallo Nico,

    solche Trigger hat meines Wissens der alte Upsizing Assistent von Access erzeugt.

    Anstatt die Syntax gerade zu biegen, solltest Du geht eher Fremdschlüssel-Einschränkungen (FOREIGN KEY) verwenden und den Trigger entfernen - denn das ist deutlich schneller.

    Für oben müsste der lauten - wenn ich mich nicht verguckt habe:

    ALTER TABLE HBCISession WITH CHECK
    ADD CONSTRAINT FK_HBCISession_HBCIKontakte
    	FOREIGN KEY (Session_Contact)
    	REFERENCES HBCIKontakte (HBCIContact_ID);

    und den Trigger löschen.

    Gruß Elmar

    Montag, 2. September 2013 18:11
    Beantworter