Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Mit UIB Komponente Datensatz in FireBird Tabelle einfügen (https://www.delphipraxis.net/99105-mit-uib-komponente-datensatz-firebird-tabelle-einfuegen.html)

GuenterS 6. Sep 2007 23:36

Datenbank: FireBird • Version: 1.5 • Zugriff über: UIB

Mit UIB Komponente Datensatz in FireBird Tabelle einfügen
 
Hallo,

ich versuche gerade mittels den UIB Komponenten einen Eintrag in einer Tabelle zu machen, bekomme jedoch immer Fehlermeldungen.

Delphi-Quellcode:
  with TJvUIBquery.Create(nil) do
  try
    DataBase := dmIntern.InternDB;
    Transaction := dmIntern.IBTransaction;
    SQL.Text := 'INSERT INTO kontakte (K_KONTAKTEID, ADRESSENID, ANSPRECHPARTNERID, '
      + ' K_DATUMK, K_BEREICH, K_FEHLERKLASSE, K_ABGESCHLOSSEN, K_EIN_AUS, K_PUBLIC_PRIVATE, '
      + ' K_ANLAGEN, PR_PRODUKTEID, KA_KONTAKTARTID, K_GELOESCHT, K_ZEIT, '
      + ' K_VERRECHNET, TODO_SYSID, K_DRINGLICHKEIT_STR, K_UNTERBEREICH, ST_STATUSID) '
      + ' VALUES(:K_KONTAKTEID, :ADRESSENID, :ANSPRECHPARTNERID, '
      + ' :K_DATUMK, :K_BEREICH, :K_FEHLERKLASSE, :K_ABGESCHLOSSEN, :K_EIN_AUS, :K_PUBLIC_PRIVATE, '
      + ' :K_ANLAGEN, :PR_PRODUKTEID, :KA_KONTAKTARTID, :K_GELOESCHT, :K_ZEIT, '
      + ' :K_VERRECHNET, :TODO_SYSID, :K_DRINGLICHKEIT_STR, :K_UNTERBEREICH, :ST_STATUSID)';

    Params.ByNameAsInteger['K_KONTAKTEID'] := lKID;
    Params.ByNameAsString['ADRESSENID'] := GetComboBoxID(ComboKunde, ComboKunde.ItemIndex);
    Params.ByNameAsString['ANSPRECHPARTNERID'] := GetComboBoxID(ComboAnsp, ComboAnsp.ItemIndex);
    Params.ByNameAsDateTime['K_DATUMK'] := now;
    Params.ByNameAsString['K_BEREICH'] := GetComboBoxID(ComboBereich, ComboBereich.ItemIndex);
    Params.ByNameAsString['K_FEHLERKLASSE'] := GetComboBoxID(ComboTODO, ComboTODO.ItemIndex);
    Params.ByNameAsInteger['K_ABGESCHLOSSEN'] := 0;
    Params.ByNameAsInteger['K_EIN_AUS'] := 0;
    Params.ByNameAsInteger['K_PUBLIC_PRIVATE'] := 0;
    Params.ByNameAsInteger['K_ANLAGEN'] := 0;
    Params.ByNameAsString['PR_PRODUKTEID'] := GetComboBoxID(ComboPRodukt, ComboProdukt.ItemIndex);
    Params.ByNameAsString['KA_KONTAKTARTID'] := GetComboBoxID(ComboKontaktart, ComboKontaktArt.ItemIndex);
    Params.ByNameAsInteger['K_GELOESCHT'] := 0;
    Params.ByNameAsDateTime['K_ZEIT'] := now;
    Params.ByNameAsInteger['K_VERRECHNET'] := 0;
    Params.ByNameAsString['TODO_SYSID'] := GetComboBoxID(ComboTodo, ComboTodo.ItemIndex);
    Params.ByNameAsString['K_DRINGLICHKEIT_STR'] := ComboDringlichkeit.Text;
    Params.ByNameAsString['K_UNTERBEREICH'] := Edit1.Text;
    Params.ByNameAsString['ST_STATUSID'] := GetComboBoxID(ComboStatus, ComboStatus.ItemIndex);
    ExecSQL;


  finally
    Free;
  end;
Zitat:

Zitat von Exception
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt todoXP.exe ist eine Exception der Klasse EUIBError mit der Meldung 'arithmetic exception, numeric overflow, or string truncation
Cannot transliterate character between character sets
can't format message 13:198 -- message file F:\d7\bin\firebird.msg not found
Error Code: 1' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Was mache ich falsch? Wenn das ganze z.B.: eine TMSQuery oder TADOQuery für den MS SQL-Server wäre würde das ja funktionieren.

Lemmy 7. Sep 2007 06:10

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Hi,

ich vermute mal 2 Fehler:

1. Du arbeitest mit einer nicht vollständigen embedded FB-Installation oder einer nicht korrekt installierten Server-Version
2. Deine Datenbank hat eine andere Einstellung des Character-Sets als deine TUIBDatabase-Komponente

zu 2.: In den Verbidnungseinstellungen der Komponente musst Du den selben CharacterSet einstellen wie du ihn bei der ERstellung der DB angegeben hast. Für deutschsprachige DBs empfiehlt sich ISO8859_1

zu 1.: Müsste ich erst mal wissen was Du hast (FBServer oder Embedded)....
Grüße
Lemmy

hoika 7. Sep 2007 07:24

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Hallo,

3. Ein übergebener String-Wert (z.B. der des Edit) ist zu gross.


Heiko

Hansa 7. Sep 2007 07:33

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Warum lässt du das Insert nicht vom Dataset selber erzeugen ? Dann müssten nur noch die Felder besetzt werden. Entweder mit DBEdits usw. oder eben mit FieldByName.

mkinzler 7. Sep 2007 08:15

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Weil UIB keine BDE ist!!!!

Hansa 7. Sep 2007 08:21

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Was hat das mit BDE zu tun ? :shock: Gibts da keinen Dataset - Generator, Insert, Post usw. Befehle ?

mkinzler 7. Sep 2007 08:52

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Aber auch dann hätte er das Problem, das die übergebenen Werte zu groß(lang) sind.

Hansa 7. Sep 2007 09:19

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Hätte er nicht ! Sind dem Dataset die Felder per SQL-Generator bekannt gegeben, dann reicht statt einer grausamen Din A 4 Seite Insert-Codes das hier :

Delphi-Quellcode:
DS.Insert;
DS.FieldByName ('..').As...;
DS.Post;

GuenterS 7. Sep 2007 12:33

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Hallo,

erstmal danke für die viele Antworten.

Ich wollte einfach nur ein Insert Ding abschicken, daher keine Datenbankgebundenen Steuerelemente.

Das Feld erlaubt übrigens eine Länge von 180 Zeichen, übergeben sind nur ein Bruchteil davon max 20.

Bei der Datenbankverbindung habe ich es bei den Standardeinstellungen belassen, lediglich DatabaseName, Password und Username entsprechend ausgefüllt.

Weiters ist SQLDialekt=3 und CharacterSet = csNone ... so waren die aber schon eingestellt.


Auf dem Rechner, wo die Firebird Datenbank-Datei db.gdb liegt, läuft der Firebird Server mit Version 1.5.

Verwendet wird die gds32.dll

Welcher Zeichensatz bei Erstellung der DB angegeben wurde weiß ich nicht, die DB entstand vor meiner Zeit und war wohl in früheren Zeiten eine Interbase Datenbank.

MagicAndre1981 7. Sep 2007 12:41

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Stell mal das CharacterSet auf ISO8859_1.

mkinzler 7. Sep 2007 12:41

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Hast du dir die Datenbank mal in einem Admin-Tools angesehen (Characterset).
Besteht die Möglichkeit das Strings länger sind als die maximale Länge der Felder?

GuenterS 7. Sep 2007 13:22

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Was für Admin Tool könntest Du vorschlagen?

Verwende momentan den SQL Manager Lite for Interbase/Firebird

Zulange sind die Felder sicher nicht, das was ich einfügen möchte habe ich überprüft, das müßte von den Längen her gesehen klappen.


MagicAndre ... genau das hat geholfen. :)

MagicAndre1981 7. Sep 2007 13:25

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Schön, dass es geholfen hat :) Hatte damals (vor 4 Jahren) auch Ewigkeiten nach diesem Fehler gesucht. Als Admintool nehme ich immer die PersonalEdition vom IBExpert.

Hansa 7. Sep 2007 16:39

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Zitat:

Zitat von GuenterS
Ich wollte einfach nur ein Insert Ding abschicken,..

Es ist hier zwar üblich, Beiträge einfach zu ignorieren. Sinnvoll ist es aber nicht. Was sollen z.B. die [] :?: So was wie hier :
Delphi-Quellcode:
    Params.ByNameAsInteger['K_KONTAKTEID'] := lKID;
Ignorieren des Dataset-Generators bringt auch nicht viel. Ausnahme : komplett alles wir ignoriert. :mrgreen:

GuenterS 7. Sep 2007 17:33

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von GuenterS
Ich wollte einfach nur ein Insert Ding abschicken,..

Es ist hier zwar üblich, Beiträge einfach zu ignorieren. Sinnvoll ist es aber nicht. Was sollen z.B. die [] :?: So was wie hier :
Delphi-Quellcode:
    Params.ByNameAsInteger['K_KONTAKTEID'] := lKID;
Ignorieren des Dataset-Generators bringt auch nicht viel. Ausnahme : komplett alles wir ignoriert. :mrgreen:

Tut mir leid, wenn ich auf Deine Beiträge in diesem Thread zu wenig eingegangen bin.

Ist es eigentlich generell sinnvoll eine Abfrage zu erstellen nur weil man etwas einfügen möchte? Ich könnte mir vorstellen, dass das Laden der verfügbaren Datensätze wohl auch etwas Zeit braucht. Zumal ich die Datensätze überhaupt nicht benötige an der Stelle.

Mit Params.ByNameAsInteger['K_KONTAKTEID'] := lKID setzt man einen Parameter mit dem Namen K_KONTAKTEID auf den Wert von lKID.

Hansa 7. Sep 2007 17:40

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Zitat:

Zitat von GuenterS
...Ist es eigentlich generell sinnvoll eine Abfrage zu erstellen nur weil man etwas einfügen möchte?..

Ist es eben nicht. Das Dataset kennt die Felder und dann genügt das Insert und die Besetzung der Felder per FieldByName. Alles andere ist überflüssig

GuenterS 7. Sep 2007 17:54

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Irgendwie kann man da TJvUIBQuery keine Felder hinzufügen, so wie mans beispielsweise bei einer TQUery oder TADOQuery machen würde.

Hansa 7. Sep 2007 17:59

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Query deutet immer auf die BDE hin. Gibts da keinen Nachfahren von TDataSet ? Guck mal in deinem Query, ob es da tatsächlich kein "Insert" gibt.

P.S.: was heißt : Felder hinzufügen ?

mkinzler 7. Sep 2007 17:59

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Die in der JVCL enthaltene Version von UIB ist veraltet. Nimm lieber die Originalversion

GuenterS 7. Sep 2007 18:10

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Ich habe die Version von

http://www.progdigy.com/modules.php?name=UIB
genommen.

Das ist doch die Originalversion oder?

Ne da gibts nur ein Schreibgeschütztes Dataset ... also wohl nicht verwendbar. Die normale TJvUIBQuery ist kein Nachfolger von einem TDataSet oder TCustomDataset.

Hansa 7. Sep 2007 18:41

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Bin dem Link mal nachgegangen. Da steht :

Delphi-Quellcode:
  TJvUIBCustomDataSet = class(TDataSet)
Es ist also in etwa von TDataSet abgeleitet. Mich stört da aber das Custom. Deutet sehr auf viel eigene Arbeit hin. Sehr viele Compiler-Directiven sind vorhanden. Was ist {$IFNDEF UIBPEVERSION}
oder : {$IFDEF HAVE_SYNEDIT} ?

GuenterS 7. Sep 2007 19:32

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Zitat:

Zitat von Hansa
Bin dem Link mal nachgegangen. Da steht :

Delphi-Quellcode:
  TJvUIBCustomDataSet = class(TDataSet)
Es ist also in etwa von TDataSet abgeleitet. Mich stört da aber das Custom. Deutet sehr auf viel eigene Arbeit hin. Sehr viele Compiler-Directiven sind vorhanden. Was ist {$IFNDEF UIBPEVERSION}
oder : {$IFDEF HAVE_SYNEDIT} ?

Gut :)

Ich finds gut dass das der Teil mit Custom auf der linken Seite steht und nicht rechts ... wird also von einem vollständigen Dataset abgeleitet...

Bei meiner Query kam das nicht vor, konnte allerdings nur im Quelltext schaun

{$IFDEF HAVE_SYNEDIT} ... ist eine Compilerdirektive ... der Quellcode wird nur dann verwendet, wenn sie gesetzt ist, wahrscheinlich kann man so auch die Syn_Edit Requirements ausschalten.

Hansa 7. Sep 2007 21:11

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Zitat:

Zitat von GuenterS
Ich finds gut dass das der Teil mit Custom auf der linken Seite steht und nicht rechts ...

Umgekehrt rum müste ich mich noch selber mit dem Kam rumschlagen. :P Verwende doch das vom TDataSet abgeleitete. Mir gelang es allerdings nicht, das alles komplett zu installieren. Vielleicht werde ich das aber noch nachholen. 8)

GuenterS 7. Sep 2007 21:38

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Was mich aber stutzig macht ist, dass neben dem TJvUIBDataSet in fett read only steht. Genauso liefert CanModify immer false zurück. Auch finde ich keine InternalPost Methode nur InternalOpen, InternalClose und was man sonst noch für den Lesenden Zugriff braucht.

Ich fürchte das was Du mir vorschlagen wolltest wird nicht funktionieren mit den UIB Komponenten.


Wegen Installation ... Du hast Delphi 8 laut Deiner Signatur ... bin mir nit sicher dass die Komponenten auch für Delphi.NET gibt. Vorraussetzung ist aber ein korrekt installiertes SynEdit. (Habs mit der Compilerdirektive nur bei Delphi 7 Prof. geschafft es ohne zu installieren)

Hansa 8. Sep 2007 00:23

Re: Mit UIB Komponente Datensatz in FireBird Tabelle einfüge
 
Zitat:

Zitat von GuenterS
Was mich aber stutzig macht ist, dass neben dem TJvUIBDataSet in fett read only steht. Genauso liefert CanModify immer false zurück.

Wegen Installation ... Du hast Delphi 8 laut Deiner Signatur ...
Delphi-Quellcode:
{$IFNDEF UIBPEVERSION}
  jvuibdataSet,
{$ENDIF}
  jvuibdatabaseedit,jvuibtransactionedit,
{$IFDEF HAVE_SYNEDIT}

ja, bin eben D8 Geschädigter. 8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:55 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