![]() |
Datenbank: Firebird • Version: 2,5 • Zugriff über: SQL
Insert in eine Firebirddatenbank (Tabelle)
Hallo,
ich habe folgende Procedure.
Delphi-Quellcode:
Leider werden bestimmte Werte nicht in die Tabelle geschrieben obwohl die Parameter alle gefüllt sind. Hat jemand eine Ahnung warum nicht.
procedure TRessourcenListe.SaveIntoDB;
var i: Integer; saveResource: TKalenderRessource; range: TDisabledRange; j: Integer; begin try // delete old resources and ranges ExecuteSQL('delete from Disabled_Ranges', []); ExecuteSQL('delete from Resources', []); // save new resources for i := 0 to FResources.Count - 1 do begin saveResource := TKalenderRessource(FResources[i]); if saveResource.Image = nil then begin ExecuteSQL( 'insert into Resources (Resname, ResPosition, ResId) values (:Resname, :ResPosition, :ResId)', [saveResource.Title, saveResource.Position, saveResource.ResourceId]) end else ExecuteSQLEx('insert into Resources (Resname, Resimage, ResPosition, ResId)' + ' values (:Resname, :Resimage, :ResPosition, :ResId)', [saveResource.Title, saveResource.Image, saveResource.Position, saveResource.ResourceId], [2]); // save disabled ranges for j := 0 to saveResource.DisabledRangesCount - 1 do begin range := TDisabledRange(saveResource.DisabledRanges[j]); ExecuteSQLEx('insert into Disabled_Ranges (ResId, Disabled_Num, Disabled_From, Disabled_To)' + ' values (:ResId, :Disabled_Num, :Disabled_From, :Disabled_To)', [saveResource.ResourceId, j+1, range.Start, range.Finish], [3, 4]); end; end; except end; end; Das Problem habe in öfters in meine Anwendung weiß aber nicht wieso das so ist. |
AW: Insert in eine Firebirddatenbank (Tabelle)
Wie sehen denn ExecuteSQL und ExecuteSQLEx aus? Wieso der leere Except-Block? Läuft das Ganze in einer Transaktion?
|
AW: Insert in eine Firebirddatenbank (Tabelle)
Ich glaube ich hatte den Fehler auch mal.
Hast du eine UTF8-Datenbank? Ich glaube bei mir wars so dass ich in der Connection - Options UseUnicode = true setzen musste und danach ging es dann, falls ich mich nicht täusche und das die Lösung für einen anderen Fehler war :mrgreen: |
AW: Insert in eine Firebirddatenbank (Tabelle)
Hallo Detlef,
hier die Funktionen
Delphi-Quellcode:
:
function ExecuteSQL(const s : string; const Par : array of variant) : Boolean;
function ExecuteSQLEx(const s: string; const Par, prBlobParamsNumbers: array of const): Boolean; |
AW: Insert in eine Firebirddatenbank (Tabelle)
Vielleicht noch zur Info. Ich arbeite mit IBObjects.
|
AW: Insert in eine Firebirddatenbank (Tabelle)
Hast du denn mal überprüft was ich geschrieben habe?
|
AW: Insert in eine Firebirddatenbank (Tabelle)
Ich hatte eigentlich die Implementation gemeint. Fast noch wichtiger scheinen mir aber Neutral Generals Tipp bzw. meine anderen Fragen zu sein.
|
AW: Insert in eine Firebirddatenbank (Tabelle)
Hallo Detlef,
ich habe den Code von einem Mitarbeiter übernommen aus Delphi 2007 (da hat alles funktioniert.). Warum der Except-Block leer ist keine Ahnung. Es läuft nicht in einer Transaktion, ich denke das regelt IBObjects von sich aus. Bei mir wird alles bis auf Resname in die Tabelle geschrieben obwohl saveResource.Title = 'Test 1' ist. Hallo Michael, bei TIB_Connection gibt es so eine Option nicht. |
AW: Insert in eine Firebirddatenbank (Tabelle)
Sorry hier die functionen:
Delphi-Quellcode:
function ExecuteSQL(const s: string; const Par: array of variant): Boolean;
var Q: TIBOQuery; i: integer; begin Q := TIBOQuery.Create(nil); try try Q.Databasename := dmMain.ibconMain.DatabaseName; Q.SQL.Text := s; for i := Low(Par) to High(Par) do case VarType(Par[i]) of varSmallint , varInteger : Q.Params.Items[i].AsInteger := Par[i]; varSingle , varDouble : Q.Params.Items[i].AsFloat := Par[i]; varCurrency : Q.Params.Items[i].AsCurrency := Par[i]; varDate : begin if TDateTime(Par[i]) = 0 then begin Q.Params.Items[i].DataType := ftDate; Q.Params.Items[i].Clear; end else Q.Params.Items[i].AsDateTime := Par[i]; end; varBoolean : begin if Par[i] = True then Q.Params.Items[i].AsString := '1' else Q.Params.Items[i].AsString := '0'; end; varByte : Q.Params.Items[i].AsWord := Par[i]; varString : Q.Params.Items[i].AsString := Par[i]; varLongWord : Q.Params.Items[i].AsInteger := Par[i]; end; Q.ExecSQL; Result := True; except Result := False; raise; end; finally Q.Close; FreeAndNil(Q); end; end; function ExecuteSQLEx(const s: string; const Par, prBlobParamsNumbers: array of const): Boolean; var bProcessed: boolean; Stream1: TStream; Q: TIBOQuery; i, j: integer; begin Q := TIBOQuery.Create(nil); try try Q.Databasename := dmMain.ibconMain.DatabaseName; Q.SQL.Text := s; for i := Low(Par) to High(Par) do with Par[i] do begin bProcessed := False; for j := 0 to High(prBlobParamsNumbers) do begin if i = prBlobParamsNumbers[j].VInteger - 1 then begin if VType = vtString then begin Stream1 := TStringStream.Create(VString^); try Q.Params.Items[i].LoadFromStream(Stream1, ftMemo); finally Stream1.Free; end; end else if VType = vtAnsiString then begin Stream1 := TStringStream.Create(string(VAnsiString)); try Q.Params.Items[i].LoadFromStream(Stream1, ftMemo); finally Stream1.Free; end; end else if VType = vtObject then begin Stream1 := TMemoryStream.Create; try if VObject.InheritsFrom(TBitmap) then begin if not TBitmap(VObject).Empty then begin TBitmap(VObject).SaveToStream(Stream1); Q.Params.Items[i].LoadFromStream(Stream1, ftBlob); end else begin Q.Params.Items[i].DataType := ftBlob; Q.Params.Items[i].Clear; end; end; if VObject.InheritsFrom(TStrings) then begin TStrings(VObject).SaveToStream(Stream1); Q.Params.Items[i].LoadFromStream(Stream1, ftMemo); end; finally Stream1.Free; end; end else if VType = vtExtended then begin if VExtended^ = 0 then begin Q.Params.Items[i].DataType := ftDate; Q.Params.Items[i].Clear; end else Q.Params.Items[i].AsDateTime := VExtended^; end; bProcessed := True; Break; end; end; if not bProcessed then case VType of vtInteger: Q.Params.Items[i].AsInteger := VInteger; vtBoolean: begin if VBoolean = True then Q.Params.Items[i].AsString := '1' else Q.Params.Items[i].AsString := '0'; end; vtChar: Q.Params.Items[i].AsString := VChar; vtExtended: Q.Params.Items[i].AsFloat := VExtended^; vtString: Q.Params.Items[i].AsString := VString^; vtAnsiString: Q.Params.Items[i].AsString := string(VAnsiString); vtCurrency: Q.Params.Items[i].AsCurrency := VCurrency^; vtObject: begin end; end; end; Q.ExecSQL; Result := True; except Result := False; raise; end; finally Q.Close; FreeAndNil(Q); end; end; |
AW: Insert in eine Firebirddatenbank (Tabelle)
Hallo,
< Bei mir wird alles bis auf Resname in die Tabelle geschrieben obwohl saveResource.Title = 'Test 1' ist. > Woher weisst du das denn so genau ? Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz