Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Insert in eine Firebirddatenbank (Tabelle) (https://www.delphipraxis.net/181717-insert-eine-firebirddatenbank-tabelle.html)

Walter Landwehr 4. Sep 2014 14:37

Datenbank: Firebird • Version: 2,5 • Zugriff über: SQL

Insert in eine Firebirddatenbank (Tabelle)
 
Hallo,

ich habe folgende Procedure.

Delphi-Quellcode:
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;
Leider werden bestimmte Werte nicht in die Tabelle geschrieben obwohl die Parameter alle gefüllt sind. Hat jemand eine Ahnung warum nicht.

Das Problem habe in öfters in meine Anwendung weiß aber nicht wieso das so ist.

DeddyH 4. Sep 2014 14:51

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?

Neutral General 4. Sep 2014 14:54

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:

Walter Landwehr 4. Sep 2014 15:07

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;
:

Walter Landwehr 4. Sep 2014 15:10

AW: Insert in eine Firebirddatenbank (Tabelle)
 
Vielleicht noch zur Info. Ich arbeite mit IBObjects.

Neutral General 4. Sep 2014 15:11

AW: Insert in eine Firebirddatenbank (Tabelle)
 
Hast du denn mal überprüft was ich geschrieben habe?

DeddyH 4. Sep 2014 15:12

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.

Walter Landwehr 4. Sep 2014 15:59

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.

Walter Landwehr 4. Sep 2014 16:11

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;

hoika 4. Sep 2014 17:40

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 02:26 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz