[Delphi] Record toevoegen aan DB lukt niet

Pagina: 1
Acties:

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Het is me eindelijk gelukt om in Delphi een nieuwe database te maken en hieraan tabellen toe te voegen. Nu wil ik nog informatie toevoegen aan die tabellen, en dat doe ik volgens de manier zoals beschreven op about.delphi.com.

Als ik echter de data wil toevoegen dan krijg ik de volgende foutmelding:
'ADOTable1: Cannot perform this operation on an open dataset'.
De fout is dus dat de dataset open is. Maar hoe close ik de dataset dan?? Het voor de hand liggende close werkt niet, op editmode zetten ook niet. Ik heb gezocht op google, maar ik kan het probleem niet goed genoeg omschrijven om wat te vinden.

Ik gebruik de volgden code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
procedure TForm1.SCToDataBase(VR: TVergelijkrec);
var
 DataSource : string;
 dbName,cs  : string;
 i          : integer;
begin
 //create DB
  if (SaveDialog1.Execute) then   
  begin
    dbName:=SaveDialog1.FileName+'.mdb';
    DataSource :=
      'Provider=Microsoft.Jet.OLEDB.4.0' +
      ';Data Source=' + dbName +
      ';Jet OLEDB:Engine Type=5';

    ADOXCatalog1.Create1(DataSource);

    //connect DB
    ADOConnection1.ConnectionString := DataSource;
    ADOConnection1.LoginPrompt := False;
    ADOCommand1.Connection := ADOConnection1;

    for i:=0 to high(VR.Familie) do
    begin
      //add tables
      cs:='CREATE TABLE Family'+IntToStr(i+1)+
      ' (' +
        'Id TEXT(50),' +
        'ProdOrder TEXT(50),' +
        'ArtNr TEXT(50),' +
        'VolgNr TEXT(50),' +
        'Bewerking TEXT(50),' +
        'Machinenummer TEXT(50),' +
        'Bestelgroote TEXT(50),' +
        'BEW_TIJD TEXT(50),' +
        'OMS_TIJD TEXT(50),' +
        'PROD_TIJD TEXT(50),' +
        'ALTROUTE TEXT(50),' +
        'DATUM_2 TEXT(50))';
      ADOCommand1.CommandText := cs;
      ADOCommand1.Execute;

      AdoTable1.TableName:='Family'+IntToStr(i+1);

      with ADOTable1 do begin --> HIER VASTLOPER
        Insert;
        FieldByName('Id').Value := '2';
        FieldByName('ProdOrder').Value := '10';
        FieldByName('Machinenummer').Value := 'hetzal';
        Post;
      end;

[ Voor 12% gewijzigd door Oscar Mopperkont op 20-06-2004 15:50 ]


  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024

CRiMiNaL

Witlof ^^

jou probleem is dat de dataset nog gebruikt word. hij zit dus bij jou aan 2 verschillende dingen vast. Een close van je dataset zou genoeg moeten zijn. Of gewoon een 2e object van je dataset aanmaken.

... MMORPG Addict.


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
CRiMiNaL schreef op 20 juni 2004 @ 15:10:
jou probleem is dat de dataset nog gebruikt word. hij zit dus bij jou aan 2 verschillende dingen vast. Een close van je dataset zou genoeg moeten zijn. Of gewoon een 2e object van je dataset aanmaken.
Maar hoe close ik de dataset dan? Dat weet ik dus niet AdoTable1.close werkt niet, want dat commando mag dus niet

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024

CRiMiNaL

Witlof ^^

vertel eerst een hoe jou link met je database inelkaar zit. ik zie een DataSource een ADOTable, gebruik je ook nog een ADOQuery ? andere ADO opjecten ?

[ Voor 18% gewijzigd door CRiMiNaL op 20-06-2004 15:16 ]

... MMORPG Addict.


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Ik gebruik de volgende componenten:
TAdoConnection
TAdoTable
TDataSource
TAdoCommand
TAdoxCatalog


Het eerste wat het programma doet is een andere database openen. Dat gebeurd als volgt:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.Open1Click(Sender: TObject);
begin
  odlOpenInputFile.InitialDir :=  ExtractFilePath(Application.ExeName);
  if (odlOpenInputfile.execute) then
  begin
      LocatieInputFile:= odlOpenInputFile.FileName;
      StatusBar1.SimpleText:=odlOpenInputFile.FileName;
      ADOTable1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data
 Source='+LocatieInputFile+';Mode=ReadWrite;Persist Security Info=False';
      ADOTable1.TableName:='TBL_Productie_Gegevens';
      ADOTable1.Active:=True;
      MaxAantalMachines:=BepaalMaxAantalMachines(odlOpenInputFile.FileName);
  end;
end;


Dan leest het programma de database in en doet van alles, en uiteindelijk moet er dus nieuwe output komen en komt hij met de procedure die ik in de TS gaf. Daarbij wordt dus een nieuwe db aangemaakt, met daarin een x aantal tabellen. Dat gaat allemaal goed. Maar nu ik dus bezig ga met informatie in die tabellen doen, gaat het fout.

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024

CRiMiNaL

Witlof ^^

ok, ik probeer nu even te begrijpen hoe je structuur in elkaar zit.

Waarschijnlijk heb jij je TDataSource gekoppeld aan je TAdoTable
Zodra jij je TAdoTable aanspreekt geeft ie een acces violation.
90% kans dat je TDataSource die veroorzaakt.
probeer dus eerst even je TDataSource te ontkoppenen van je AdoTable

... MMORPG Addict.


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Als ik de Datasource disable en de naam van de dataset (AdoTable1) leeg laat. Kortom als hij niks meer doet. Dan geeft hij nog steeds dezelfde foutmelding.

Verwijderd

Criminal, je ziet geen DataSource, maar een connection string die Oscar 'DataSource' heeft genoemd (niet handig...).

Ik heb 0.0 ervaring met mdb's, Jet, etc., en ik zou inserts en updates altijd via een TADOQuery doen i.p.v. een TADOTable, maar er vallen wel wat dingetjes op...

- Namen als ADOTable1, ADOConnection1, etc. zijn een gruwel. Wanneer ik van 1 van m'n ontwikkelaars een unit onder ogen krijg waar die default namen nog instaan, kan 'ie de boel per direct aanpassen. Geef die dingen zinvolle namen!

- Die ADOConnection, ADOTable, etc. staan blijkbaar al op 't form of op de DataModule, maar zijn ze ook wel goed gekoppeld? Weet die ADOTable naar welke ADOConnection 'ie moet kijken?

- Bij een hoop database systemen moet je na het creeren van een nieuwe table eerst expliciet je werk committen, anders is 'ie daarna nog niet direct benaderbaar. Of dit bij Access ook het geval is weet ik niet. Lijkt me niet (alles gebeurt toch client side), maar in combinatie met ADO (ook bedoeld voor volwassen database systemen) zou 't best kunnen.

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Je hebt gelijk dat die Datasource een connection string is. Ik heb die codes overgenomen van about.delhi.com, dus ik dacht dat dat wel goed zou zijn. Maar het is kennelijk dus niet standaard. Heb het nu trouwens in de code van de openingspost even aangepast.

Het is idd niet netjes dat ik die standaardnamen laat staan, maar de code werkt er niet beter of minder door. Ik snap alleen nog niet goed genoeg (blijkt ook wel, want dit is waarsch echt een beginners prob) waar ik echt mee bezig ben. Dus ik kan ook nog niet echt zinnige namen geven, ik snap denk ik wel globaal wat er gebeurd.

[ Voor 7% gewijzigd door Oscar Mopperkont op 20-06-2004 15:56 ]


Verwijderd

Oscar Mopperkont schreef op 20 juni 2004 @ 15:56:
Ik heb die codes overgenomen van about.delhi.com
Als ik in m'n browser 'about.delhi.com' intik, kom ik op een portal om hotelkamers en trips in New Delhi te boeken. :)
Maar het is kennelijk dus niet standaard.
Meer niet handig. Wanneer je een variabele dezelfde naam geeft als een standaard Delphi component of property naam, maak je het jezelf alleen maar moeilijk.
Zeker wanneer je ook nog gebruik maakt van "with <component> do...". Alle data aware controls hebben een DataSource property, en dat kan je dan een hoop zinloos debuggen kosten...

Voor wat betreft de rest kan ik nu niet zo gek veel betekenen, wegens gebrek aan ervaring met mdb's.

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Sorry ik bedoelde http://www.delphi.about.com/

En ik volg dan deze tutorial http://www.delphi.about.com/library/weekly/aa010101a.htm

Ik heb nu de code als volgt aangepast:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
procedure TForm1.SCToDataBase(VR: TVergelijkrec);
var
 DataSource : string;
 dbName,cs  : string;
 i          : integer;
begin
 //create DB
  if (SaveDialog1.Execute) then 
  begin
    dbName:=SaveDialog1.FileName+'.mdb';
    DataSource :=
      'Provider=Microsoft.Jet.OLEDB.4.0' +
      ';Data Source=' + dbName +
      ';Jet OLEDB:Engine Type=5';

    ADOXCatalog1.Create1(DataSource);

    //connect DB
    ADOConnection1.ConnectionString := DataSource;
    ADOConnection1.LoginPrompt := False;
    ADOCommand1.Connection := ADOConnection1;
    ADOTable1.Close;

    for i:=0 to high(VR.Familie) do
    begin
      //add tables
      cs:='CREATE TABLE Family'+IntToStr(i+1)+
      ' (' +
        'Id TEXT(50),' +
        'ProdOrder TEXT(50),' +
        'ArtNr TEXT(50),' +
        'VolgNr TEXT(50),' +
        'Bewerking TEXT(50),' +
        'Machinenummer TEXT(50),' +
        'Bestelgroote TEXT(50),' +
        'BEW_TIJD TEXT(50),' +
        'OMS_TIJD TEXT(50),' +
        'PROD_TIJD TEXT(50),' +
        'ALTROUTE TEXT(50),' +
        'DATUM_2 TEXT(50))';
      ADOCommand1.CommandText := cs;
      ADOCommand1.Execute;


      ADOTable1.ConnectionString:=DataSource;
      ADOTable1.TableName:='Family'+IntToStr(i+1);
      ADOTable1.Active:=True;


      with AdoTable1 do begin
        Insert;
        FieldByName('Id').Value := '2';
        FieldByName('ProdOrder').Value := '10';
        FieldByName('Machinenummer').Value := 'hetzal';
        Post;
      end;

     ADOTable1.Close;

Hij geeft nu "pas" een foutmelding als hij aan de tweede aangemaakte tabel informatie toe wil voegen. Hij kan die tabel dan niet vinden, terwijl hij al wel is aangemaakt. Als ik de database met Acces open is hij er namelijk wel. De naam klot ook. Als ik voor de naam niet een variabele naam neem (dus niet 'Family'+IntToStr(i+1) ), maar altijd Family1, dan voegt hij wel telkens toe aan Family1, en hij maakt alle andere tabellen ook gewoon aan.
Het probleem is dus dat hij de aangemaakte tabel niet kan vinden.

[ Voor 99% gewijzigd door Oscar Mopperkont op 20-06-2004 16:42 ]

Pagina: 1