Mit problem nu er at jeg har et autoinc felt i min MySQL tabel (IDKode), dette felt kan jeg ikke få lov til at ændre i når jeg kalder Edit, altså:
ClientDataSet.Edit; ClientDataSet.FieldByName('IDKode').AsInteger:=7364; ClientDataSet.Post; //fejler her med cant modify a read-only field
Ved Insert er der ingen problemer: ClientDataSet.Fields.FieldByName('IDKode').ReadOnly:=false; ClientDataSet.Insert; ClientDataSet.FieldByName('IDKode').AsInteger:=7364; ClientDataSet.Post;
At sætte FieldByName('IDKode').ReadOnly:=false; før en Edit har ingen virkning.
Har du ikke nogle fielddefs på dit clientdataset du skal ind og rette i, det må være det der er problemet, read-only flaget er vel ført med over i dit clientdataset's fielddefs....
Jeg har prøvet at rette på alle de fielddefs for IDKode jeg syntes jeg kan finde som kunne have noget med det at gøre uden held. Det mærkelige er at det jo virker fint med at sætte ReadOnly:=false; før en Insert.
Min cds bliver "nulstillet" når jeg kører denne kode: ClientDataSet.ProviderName:='DataSetProvider'; ClientDataSet.Open; ClientDataSet.ProviderName:='';
så alle fields jeg evt. har oprettet inden er væk.
Ja men på din mysql db er det et autoinc field og sikkert også primarykey osv. og det gør sikkert at den ikke vil lave en edit.... men du har da ret det er lidt mærkeligt at du ikke også får en fejl ved insert
Jeg læste et indslag om hvordan man taklede de auto-inc felter - og hvordan man håndterede dem når andre client-dataset refererede til dem. Skrev det også ud og skal klistre linket ind i morgen når jeg møder. Humlen i det var at man undlod at hente nøglen (medmindre man skal bruge den) og lavede et heltalsfelt som pseudonøgle. Indtil man applyer rettes de til de rigtige værdier. Altså ikke en nem og strømlinet løsning, men et paradigme på den problemstilling (første gang jeg bruger ordet paradigme, fedt).
Jeg har midlertidig ordnet problemet ved at flytte alle poster fra ADO til ClientDataSet manuelt, det er en langsommere løsning men så længe det ikke drejer sig om flere tusinde poster er der ingen problemer.
Det gør jeg således: DataSet er min TClientDataSet
DataForm.ADOQuery.Open;
for i:=0 to DataForm.ADOQuery.FieldCount-1 do with DataSet.FieldDefs.AddFieldDef do begin DataType:=DataForm.ADOQuery.FieldDefs[i].DataType; if DataType=ftAutoInc then DataType:=ftInteger; Name:=DataForm.ADOQuery.FieldDefs[i].Name; Size:=DataForm.ADOQuery.FieldDefs[i].Size; end;
DataSet.CreateDataSet;
while not DataForm.ADOQuery.Eof do begin DataSet.Append; for i:=0 to DataSet.FieldCount-1 do DataSet.FieldByName(DataSet.FieldDefs[i].Name).Value:=DataForm.ADOQuery.Fields[i].Value; DataSet.Post; DataForm.ADOQuery.Next; end; DataForm.ADOQuery.Close; DataSet.First;
Men, undskyld mig, så er det vel fordi et autoinc-felt ... netop er readonly, ikke? Jeg tror du gør det på den rigtige måde med manuelt at kopiere felterne. Man kan desværre ikke, vha. "alter table", ændre feltet til et dødeligt int-felt.
Da jeg brugte dbExpress var der ingen problemer og jeg syntes jo at når man afbryder forbindelsen til MySQL ved at sætte ClientDataSet.ProviderName:=''; så burde man også have lov til at ændre som man har lyst.
Næ, jeg gør som jeg beskrev kl. 22:07:03 og det virker ganske fint.
Synes godt om
Ny brugerNybegynder
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.