AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Insert in eine Firebirddatenbank (Tabelle)
Thema durchsuchen
Ansicht
Themen-Optionen

Insert in eine Firebirddatenbank (Tabelle)

Ein Thema von Walter Landwehr · begonnen am 4. Sep 2014 · letzter Beitrag vom 8. Sep 2014
Antwort Antwort
Seite 1 von 2  1 2      
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Insert in eine Firebirddatenbank (Tabelle)

  Alt 4. Sep 2014, 14:37
Datenbank: Firebird • Version: 2,5 • Zugriff über: SQL
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.
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Insert in eine Firebirddatenbank (Tabelle)

  Alt 4. Sep 2014, 14:51
Wie sehen denn ExecuteSQL und ExecuteSQLEx aus? Wieso der leere Except-Block? Läuft das Ganze in einer Transaktion?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Insert in eine Firebirddatenbank (Tabelle)

  Alt 4. Sep 2014, 14:54
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Insert in eine Firebirddatenbank (Tabelle)

  Alt 4. Sep 2014, 15:07
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
Mfg

Walter
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Insert in eine Firebirddatenbank (Tabelle)

  Alt 4. Sep 2014, 15:10
Vielleicht noch zur Info. Ich arbeite mit IBObjects.
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Insert in eine Firebirddatenbank (Tabelle)

  Alt 4. Sep 2014, 15:11
Hast du denn mal überprüft was ich geschrieben habe?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Insert in eine Firebirddatenbank (Tabelle)

  Alt 4. Sep 2014, 15:12
Ich hatte eigentlich die Implementation gemeint. Fast noch wichtiger scheinen mir aber Neutral Generals Tipp bzw. meine anderen Fragen zu sein.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Insert in eine Firebirddatenbank (Tabelle)

  Alt 4. Sep 2014, 15:59
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
Mfg

Walter
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Insert in eine Firebirddatenbank (Tabelle)

  Alt 4. Sep 2014, 16:11
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;
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Insert in eine Firebirddatenbank (Tabelle)

  Alt 4. Sep 2014, 17:40
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
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 Uhr.
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