Benutzer mit den meisten Antworten
falsche syntax in der nähe von '44447' bei INSERT-Kommando

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.
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
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 -
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.
-
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
-
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
-
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 .
-
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
- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 10. September 2013 16:45