Entwickler-Ecke

Datenbanken - DB Fehler bei INSERT INTO


N3tw124rd - Fr 05.05.06 10:28
Titel: DB Fehler bei INSERT INTO
Hi,

Ich habe eine Datenbank welche ziemlich groß ist und der Server ist nun mal auch relativ langsam.
Mein Problem ist das ich bei dem ExecSQL einen Fehler bekomme :

Fehler bei einem aus mehreren Schritten bestehenden OLE DB-Vorgang. Prüfen Sie die einzelnen DB-Statuswerte, falls vorhanden. Daten wurden nicht verarbeitet.

Bei den Selects die ich vorher gemacht habe benötigt er viel Zeit und der letzte Befehl (INSERT) funktioniert dann nicht.

MFG
N3tw124rd


jasocul - Fr 05.05.06 10:34

Das sind einfach zu wenig Infos, um dir zu dem Problem wirklich was sinnvolles sagen zu können.
Hast du dir die DB-Stati schon angesehen, falls möglich?
Langsame Select-Anweisungen können viele Ursachen haben.

Funktionierte das Ganze denn vorher oder ist das was neues?


mkinzler - Fr 05.05.06 10:35

Zitat:
Ich habe eine Datenbank welche ziemlich groß ist und der Server ist nun mal auch relativ langsam.
Die Größe einer Datenbank dürfte bei einem richtigen DBMS die Geschwindigkeit nicht beeintächtigen.
Welche DB?
Mit etwas Code wäre es einfacher.

[Edit: @jasocul man sollte ne Hupe einbauen ;-)]


N3tw124rd - Fr 05.05.06 10:45

Sorry,

bin heute morgen noch etwas verschlafen.
Die Datenbank ist eine MSDE 2000 d.h. die kostenlose version des MS SQL Servers.
Der Code sieht so aus :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
  Result := TRUE;
 try
  qrACK.Close;
  qrACK.SQL.Text := 'INSERT INTO '+sTable+
  ' (VSYS_ID, ALM_TAGNAME, ALM_DATELAST, ALM_TIMELAST, alm_timeduration, '+
  'alm_dateend, alm_timeend, alm_tagdesc, alm_descr, alm_msgtype, alm_almstatus, '+
  'alm_almarea, alm_almpriority, alm_value, alm_unit, alm_datein, alm_timein, '+
  'alm_lognodename, alm_physlnode, alm_opname, alm_opnode, alm_almextfld1, alm_almextfld2, '+
  'alm_nativetimein, alm_nativetimelast, alm_opfullname, alm_perfname, alm_perffullname, '+
  'alm_perfbycomment, alm_vername, alm_verfullname, alm_verbycomment, alm_msgid, alm_userfld1, '+
  'alm_userfld2, alm_userfld3, alm_userfld4'+
  ')VALUES('+
  ':sys, :tag, :datl, :timl, :dur, :date, :time, :tagd, :desc, :msgt, :alms, '+
  ':alma, :almp, :valu, :unit, :dati, :timi, :logn, :phys, :opna, :opno, '+
  ':ext1, :ext2, :natin, :natla, :opful, :perfn, :perff, :perfb, :vern, :verf, '+
  ':verb, :msgi, :user1, :user2, :user3, :user4)';
  qrACK.Parameters.ParamByName( 'sys' ).Value   := frmAlarmsAndMessages.GetSystemTime;
  qrACK.Parameters.ParamByName( 'tag' ).Value   := rec.sAlm_TagName;
  qrACK.Parameters.ParamByName( 'datl' ).Value  := rec.sAlm_DateLast;
  qrACK.Parameters.ParamByName( 'timl' ).Value  := rec.sAlm_TimeLast;
  qrACK.Parameters.ParamByName( 'dur' ).Value   := rec.sAlm_TimeDuration;
  qrACK.Parameters.ParamByName( 'date' ).Value  := rec.sAlm_DateEnd;
  qrACK.Parameters.ParamByName( 'time' ).Value  := rec.sAlm_TimeEnd;
  qrACK.Parameters.ParamByName( 'tagd' ).Value  := rec.sAlm_TagDesc;
  qrACK.Parameters.ParamByName( 'desc' ).Value  := rec.sAlm_Descr;
  qrACK.Parameters.ParamByName( 'msgt' ).Value  := rec.sAlm_MsgType;
  qrACK.Parameters.ParamByName( 'alms' ).Value  := rec.sAlm_AlmStatus;
  qrACK.Parameters.ParamByName( 'alma' ).Value  := rec.sAlm_AlmArea;
  qrACK.Parameters.ParamByName( 'almp' ).Value  := rec.sAlm_AlmPriority;
  qrACK.Parameters.ParamByName( 'valu' ).Value  := rec.sAlm_Value;
  qrACK.Parameters.ParamByName( 'unit' ).Value  := rec.sAlm_Unit;
  qrACK.Parameters.ParamByName( 'dati' ).Value  := rec.sAlm_DateIn;
  qrACK.Parameters.ParamByName( 'timi' ).Value  := rec.sAlm_TimeIn;
  qrACK.Parameters.ParamByName( 'logn' ).Value  := rec.sAlm_LogNodeName;
  qrACK.Parameters.ParamByName( 'phys' ).Value  := rec.sAlm_PhyslNode;
  qrACK.Parameters.ParamByName( 'opna' ).Value  := rec.sAlm_OpName;
  qrACK.Parameters.ParamByName( 'opno' ).Value  := rec.sAlm_OpNode;
  qrACK.Parameters.ParamByName( 'ext1' ).Value  := rec.sAlm_AlmExtFld1;
  qrACK.Parameters.ParamByName( 'ext2' ).Value  := rec.sAlm_AlmExtFld2;
  qrACK.Parameters.ParamByName( 'natin' ).Value := rec.sAlm_NativeTimeIn;
  qrACK.Parameters.ParamByName( 'natla' ).Value := rec.sAlm_NativeTimeLast;
  qrACK.Parameters.ParamByName( 'opful' ).Value := rec.sAlm_OPFullName;
  qrACK.Parameters.ParamByName( 'perfn' ).Value := rec.sAlm_PerfName;
  qrACK.Parameters.ParamByName( 'perff' ).Value := rec.sAlm_PerfFullName;
  qrACK.Parameters.ParamByName( 'perfb' ).Value := rec.sAlm_PerfByComment;
  qrACK.Parameters.ParamByName( 'vern' ).Value  := rec.sAlm_VerName;
  qrACK.Parameters.ParamByName( 'verf' ).Value  := rec.sAlm_VerFullName;
  qrACK.Parameters.ParamByName( 'verb' ).Value  := rec.sAlm_VerByComment;
  qrACK.Parameters.ParamByName( 'msgi' ).Value  := rec.sAlm_MsgID;
  qrACK.Parameters.ParamByName( 'user1' ).Value := rec.sAlm_UserFld1;
  qrACK.Parameters.ParamByName( 'user2' ).Value := rec.sAlm_UserFld2;
  qrACK.Parameters.ParamByName( 'user3' ).Value := rec.sAlm_UserFld3;
  qrACK.Parameters.ParamByName( 'user4' ).Value := rec.sAlm_UserFld4;
  qrACK.ExecSQL;
 Except
  Result := FALSE;
 End;


Wie kann ich die DB Statis überprüfen habe nichts im Enterprise Manager gefunden.

THX
N3tw124rd

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt


mkinzler - Fr 05.05.06 11:01

Stimmen die Typen zwischen Parametr und rec.<x>?
Ist dieser Query in einem eigenen Transaktionskontext oder zusammen mit anderen Statements?


N3tw124rd - Fr 05.05.06 11:07

Hi,

die query hat keine TRansaktionskomponente angehängt und ist direkt mit der connection komponente auf die Datenbank gehängt.
Damit will ich sagen das keine transaktionen zwischen gepuffert sein sollten.
Das mache ich normalerweise immer so und hat auch seit ein paar Jahren schön funktioniert.
Die Typen stimmen, den bei den ados hast du nur value als wert und dies ist ein Variant, der Compiler guckt dann was er zugewiesen bekommen hat und castet dann gegebenenfalls.
So denke ich mir das auf jeden Fall mal.

THX
N3tw124rd


mkinzler - Fr 05.05.06 11:10

Versuch doch mal diesen INSERT in eine eigene transaktion zu kapseln.


N3tw124rd - Fr 05.05.06 11:14

Ich habe jetzt mal neben bei die DB auf meinem Rechner installiert, welcher schneller
ist da habe ich das selbe Problem, es dauert aber ein wenig bis die Meldung kommt.
Ich werde mal eine query draufziehen die nur dieses Insert macht.

THX
N3tw124rd


jasocul - Fr 05.05.06 11:17

Ich glaube nicht, dass das Problem beim Insert-Statement liegt. (Was nichts heißen soll)
Das klingt mehr nach einem DB-Problem, bzw. Verbindungsproblem zur DB (OLE-DB-Fehler! s.o.).

Hast du schonmal versucht das Statement direkt auszuführen? Also nicht aus Delphi heraus, sondern mit einer DB-Oberfläche, die SQL-Statements verarbeiten kann?

@Markus: Trööt :zwinker: Ich habe fast das selbe gedacht.


N3tw124rd - Fr 05.05.06 11:21

Ich kann den Enterprise Manager verwenden aber der verwendet nicht ODBC, der schwingt sich
direkt drauf und ansonsten habe ich jetzt kein Tool, welches sich über ODBC draufschwingt um zu prüfen
ob der ODBC Defekt ist :(
Kennt ihr eines ?

THX
N3tw124rd


jasocul - Fr 05.05.06 11:23

Dann teste es doch erstmal ohne ODBC. Wenn es dann funktioniert, hast du zumindest den Fehlerbereich eingeschränkt. Wenn es nicht funktioniert natürlich auch.


mkinzler - Fr 05.05.06 11:23

Zitat:
Fehler bei einem aus mehreren Schritten bestehenden OLE DB-Vorgang.
Weist IMHO darauf hin, daß noch mehrere andere Vorgänge in der gleichen Transaktion ausgeführt wurden.


jasocul - Fr 05.05.06 11:26

Bei OLE/ODBC bin ich mir nicht immer sicher, was da noch so alles passieren kann. Aber im Prinzip hast du schon Recht.


N3tw124rd - Fr 05.05.06 11:31

Ich denke das .Value ist Schuld ein Feld und zwar das "ALM_MSGID" ist ein Unique identifier.Das kommt aus Access und ist
so eine Art GUID da meckert er momentan das er das nicht konvertieren kann, weil ich über den Enterprise Manager alle Felder mit 1 füllen wollte.Das mit dem einem aus mehreren kommt daher das jedes .Value ja ein OLE Variant ist und dann von rec.sXXX in das DB Format konvertiert werden muss und beim Feld ALM_MSGID schlägt dies dann fehlt :(
Ich konvertier das Feld mal in was anderes und melde mich dann gleich nochmal.

THX
N3tw124rd


N3tw124rd - Fr 05.05.06 11:33

Den INSERT hat er mal gemacht...
Jetzt kommt die Applikation noch mal...
Ich bin ja gespannt ...


N3tw124rd - Fr 05.05.06 11:38

Das war des Fehlers Lösung :)
Die Datenbank konnte meinen String nicht in das GUID Format bringen deshalb hat sie gecancelt.
Ich denke mal mit der Fehlermeldung die ich vom Enterprise Manager bekommen habe wäre ich besser bedient gewessen
als mit der vom Delphi.
Vielen Dank Jungs jetzt kann ich endlich weitermachen.
Zur Lösung fürs Protokoll : Ich habe das Unique Feld nun in ein Varchar geändert, weil dies bei mir so nicht benötigt wird.

THX
N3tw124rd