Avatar billede mmfrandsen Nybegynder
17. september 2004 - 13:51 Der er 25 kommentarer og
1 løsning

Updating Data in a linked table is not supported by this ISAM.

Jeg er i gang med et program, hvor jeg bruger en tekst fil som database med | som seperator. Jeg har lavet en ny Data Source i OBDC Data Source Administrator og det virker fint indtil jeg prøver at ændre noget i filen. Når jeg prøver at ændre noget får jeg denne besked: [Microsoft][ODBC Text Driver]Updating Data in a linked table is not supported by this ISAM.

Er der nogen, der ved, hvad jeg kan gøre?

På forhånd tak,
Mads
Avatar billede mmfrandsen Nybegynder
17. september 2004 - 13:52 #1
Desuden skal det lige siges, at jeg prøver at ændre den ved brug af et ADODataset, en datasource og et DBGrid. Jeg kan sagtens se databasen, men bare ikke ændre.
Avatar billede martinlind Nybegynder
17. september 2004 - 13:56 #2
eller sagt på en anden måde, det er et readonly dataset du har fået, ODBC Text driveren supporter sikkert kun readonly
Avatar billede pellelil Nybegynder
17. september 2004 - 13:56 #3
Jeg har aldrig anvendt en "ODBC Text Driver", men gætter på (ud fra den fejlbesked du oplyser) at den ikke understøtter at man ændre i dataene.

Hvis du "kan leve med et andet format" kunne du jo smide det over i et ClientDataSet (den kan godt gemme til en fil, omend et andet format) !?
Avatar billede martinlind Nybegynder
17. september 2004 - 13:57 #4
Kan du ikke bare bruge TClientDataSet, med en flad fil ( xml eller binær )
Avatar billede martinlind Nybegynder
17. september 2004 - 13:58 #5
pellelil >> to sjæle en tanke :)
Avatar billede mmfrandsen Nybegynder
17. september 2004 - 15:10 #6
Jeg kan desværre ikke leve med et andet format :(
Medmindre man måske kunne lave en lille process, der konverterede tekst filen med | til et andet format og efter ændringerne var lavet, så kunne konvertere den tilbage igen. Nogle idéer i den retning?
Avatar billede martinlind Nybegynder
17. september 2004 - 15:16 #7
Ja, Drop dit datset halløj og brug en stringlist, den har en property du kan sætte element skrille karakteren på så sætter du den til '|' og læsser din fil ind i den, så har du en liste du kan lege med rette i og gemme igen
Avatar billede martinlind Nybegynder
17. september 2004 - 15:17 #8
TStringList = Verdens 8 vidunder :)
Avatar billede hrc Mester
17. september 2004 - 16:15 #9
Det er nemmeligt helt korrekt. Bare placér TStringList ved siden af Pyramiderne, Kolossen fra Rhodos, Babylons hængende haver, Alexandrias fyrtårn og alle de andre.

Er det bare en enkelt information eller er der flere slags pr. record? Hvis der er flere kan du bruge TStringLists fætter, TObjectList - men det kræver lidt mere programmering.
Avatar billede hrc Mester
17. september 2004 - 16:17 #10
Information om de andre vidundere kan findes på: http://ce.eng.usf.edu/pharos/wonders/
Avatar billede mmfrandsen Nybegynder
17. september 2004 - 16:51 #11
Undskyld, hvis det er mig, der ikke kan følge med her, men er en stringlist ikke bare en enkel liste og ikke en hel database? Jeg forstår ikke helt, hvordan jeg kan få den ind i et DBGrid.
Avatar billede martinlind Nybegynder
17. september 2004 - 21:05 #12
Det kan du heller ikke, men du kan evt. vise det i en StringGrid, men det lyder som om der er flere felter per record, hvordan ser dit dataformat mere præsist ud :

Felt delimiter og record delimiter og hvor mange felter er der

/Martin
Avatar billede mmfrandsen Nybegynder
17. september 2004 - 21:59 #13
IDxchange_cyclist|fkIDcyclist|fkIDteam|finan_f_uci_premium|finan_f_period_wage|finan_i_period_date_end|gene_b_on_transfert_list|gene_i_date
1|1|1|125.000000|11000.000000|1130238000|0|1073386800
2|2|12|140.000000|16250.000000|1130238000|0|1074337200
3|4|12|150.000000|47750.000000|1130238000|0|1074423600
4|5|22|140.000000|20250.000000|1098702000|0|1073991600
5|6|1|100.000000|6750.000000|1130238000|0|1074337200
6|9|15|125.000000|14250.000000|1130238000|0|1074423600
7|11|7|125.000000|10500.000000|1098702000|0|1073559600
8|12|7|125.000000|13500.000000|1098702000|0|1073559600
9|13|1|150.000000|50500.000000|1130238000|0|1073559600
10|14|1|140.000000|19750.000000|1098702000|0|1073214000
11|15|7|100.000000|5500.000000|1098702000|0|1073732400
12|16|1|150.000000|29500.000000|1098702000|0|1074164400
13|17|1|150.000000|33500.000000|1130238000|0|1073300400

Det er et eksempel fra en af databaserne. Antal af felter varierer fra database til database.
Avatar billede martinlind Nybegynder
17. september 2004 - 22:02 #14
Ok første line er altså en liste af felt navne
og så felterne med '|' imellem og record separator er ny line
Vender tilbage med noget kode
Avatar billede martinlind Nybegynder
17. september 2004 - 22:33 #15
et lille eks på hvordan du læser ind i en StringGrid med TStringList :
Form Fil :
object Form1: TForm1
  Left = 230
  Top = 107
  Width = 870
  Height = 640
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 180
    Top = 20
    Width = 32
    Height = 13
    Caption = 'Label1'
  end
  object Button1: TButton
    Left = 25
    Top = 10
    Width = 96
    Height = 25
    Caption = 'L'#230's fra disk'
    TabOrder = 0
    OnClick = Button1Click
  end
  object StringGrid1: TStringGrid
    Left = 5
    Top = 50
    Width = 836
    Height = 511
    TabOrder = 1
  end
end
--------------------------------
Pas fil :
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FList : TStringList;
    FList2 : TStringList;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
VAR
  Cnt : Integer;
begin
  FList := TStringList.Create;
  FList2 := TStringList.Create;
  FList2.LoadFromFile('F:\Frandsen\data.dat'); <------- ret sti her
  Label1.Caption := Format('Indlæste Records : %d',[FList2.Count-1]);
  StringGrid1.RowCount := FList2.Count;
  FList.Delimiter := '|';
  for Cnt := 0 to FList2.Count-1 do
  begin
      FList.DelimitedText := FList2[Cnt];
      StringGrid1.ColCount := FList.Count;
      StringGrid1.Rows[Cnt].Assign(FList);
      FList.Clear;
  end;
end;

end.
---------------------

Lav et project og overskriv dfm filen og pas filen med det ovenstående, ret derefter stien og filnavnet på den db fil du vil indlæse
Avatar billede martinlind Nybegynder
17. september 2004 - 22:33 #16
trylle rylle :)
Avatar billede stoney Nybegynder
18. september 2004 - 09:59 #17
martinlind, din "slemme" dreng, skal du ikke huske at free Flist og Flist2 :-)

Stoney
Avatar billede martinlind Nybegynder
18. september 2004 - 10:03 #18
Det behøver jeg faktisk i ikke de ligger som en del af form obj. og delphi rydder selv op når programmet lukker, men det er da rigtigt at hvis det skal være HELT rigtig så ...
Avatar billede mmfrandsen Nybegynder
18. september 2004 - 13:03 #19
Mange tak for det. Jeg tjekker det når jeg kommer hjem i aften eller i morgen. Bare lige så du ved, at jeg ikke har glemt det ;)
Avatar billede mmfrandsen Nybegynder
18. september 2004 - 13:24 #20
Fik tid til at tjekke det nu alligevel, og det virker jo helt perfekt. Mange tak :D
Avatar billede martinlind Nybegynder
18. september 2004 - 13:52 #21
Selv Tak :)
Avatar billede hrc Mester
19. september 2004 - 10:38 #22
MartinLind: Jeg er nu ikke sikker på at Delphi håndterer den slags. Det er noget med hvad der allokeres hvor og det strider i alt fald med/mod al børnelærdom ikke at ordne den slags i destructoren.

Det er rigtigt nok at hvis du laver en TRadioButton eller ligenende så angiver du en Owner i constructoren og så skulle det være i orden. Når den "konstructor" sig så hægter den sig på ejerens liste af komponenter og så skal den nok sørge for at frigive sig selv.

Din påstand har dog sået tvivl og jeg bliver nødt til at teste det. Så kan det jo være at jeg kommer med endnu et af mine dementier
Avatar billede hrc Mester
19. september 2004 - 10:49 #23
MartinLind: Så er det testet og du har IKKE ret.

Jeg lavede en form der åbnede en subform der oprettede en stringlist med 10000 linier. Da jeg lukkede formen var der fortsat 7MB allokeret til stringlisten.

Håber ikke at du har lavet det trick for mange steder i dine programmer...
Avatar billede martinlind Nybegynder
20. september 2004 - 09:39 #24
Ja ja, men hvad med når du lukker din main form, så har delphi lige som C, ryddet op efter sig :)

PS. Det man også kalder garbage-collect
Avatar billede hrc Mester
20. september 2004 - 10:09 #25
martinlind: Ja, men det her er ikke Java! Det er ikke sådan man programmerer i Delphi - eller C/C++ for den sags skyld.

Og nej, dette her er ikke garbage collection (det er sløset programmering) idet GC er en mekanisme der løbende sørger for at rydde op i hukommelsen. Det er ikke hvad der sker når et program lukkes.

Når programmer afsluttes så frives al den hukommelse som tilhører det. Om det er udviklingssproget eller Windows' opgave, ved jeg ikke, men mon ikke det er Windows.

Det er i alt fald noget skidt at lære fra sig i et forum som Eksperten.


En definition:

(GC) The process by which dynamically allocated storage is reclaimed during the execution of a program. The term usually refers to automatic periodic storage reclamation by the garbage collector (part of the run-time system), as opposed to explicit code to free specific blocks of memory.

Automatic garbage collection is usually triggered during memory allocation when the amount free memory falls below some threshold or after a certain number of allocations. Normal execution is suspended and the garbage collector is run. There are many variations on this basic scheme.

Languages like Lisp represent expressions as graphs built from cells which contain pointers and data. These languages use automatic dynamic storage allocation to build expressions. During the evaluation of an expression it is necessary to reclaim space which is used by subexpressions but which is no longer pointed to by anything. This reclaimed memory is returned to the free memory pool for subsequent reallocation.

Without garbage collection the program's memory requirements would increase monotonically throughout execution, possibly exceeding system limits on virtual memory size.

The three main methods are mark-sweep garbage collection, reference counting and copying garbage collection.

See also the AI koan about garbage collection.

... så "pretty please - with sugar on top - Free the f...... objects"
Avatar billede martinlind Nybegynder
20. september 2004 - 10:17 #26
Til et hurtigt Hack som det jeg lavede til ham, synes jeg altså godt jeg kan forsvare min kode, og jeg man skal da ryde op efter sig, det plejer jeg også at gøre.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester