Avatar billede haunted Nybegynder
16. april 2002 - 21:36 Der er 4 kommentarer og
1 løsning

Opdatering i database

Jeg kan ikke få følgende 2 funktioner ril at opdatere i min simple database.

Kan i hjælpe??

Når jeg trykker på en Ok knap, skal der opdateres...men dette sker ikke.

void __fastcall TfrmKunde::Ok_ButtonClick(TObject *Sender)
{
TUpdateKind updateKind;

  if (Edit2->Modified == true ||
    Edit3->Modified == true ||
    Edit4->Modified == true ||
    Edit5->Modified == true ||
    Edit6->Modified == true ||
    Edit7->Modified == true ||
    Edit8->Modified == true ||
    Edit9->Modified == true) {
    if (MessageDlg("Skal ændringer gemmes?", mtConfirmation, TMsgDlgButtons()
      << mbYes << mbNo, 0) == mrYes) {
      CheckEdit(Sender);
      if (swOk2 == J) {
        updateKind = ukModify;
        KundeUpdateRecord(Sender, DM1->kunde, updateKind);
        ApplyUpdate(Sender);
        StatusBar1->SimpleText = "Kunden er opdateret.";
      }
    }
    else {
      Close();
    }
  }
}
//---------------------------------------------------------------------------

void __fastcall TfrmKunde::KundeUpdateRecord(TObject *Sender, TDataSet *DataSet, TUpdateKind UpdateKind)
{
  TUpdateSQL *pUpdate = (TUpdateSQL *)((TBDEDataSet *)DataSet)->UpdateObject;

  // Call SetParams to bind the parameters before calling ExecSQL
  pUpdate->SetParams(UpdateKind);

  if (UpdateKind == ukModify) {
    pUpdate->Query[UpdateKind]->ParamByName("oldkundeid")->Value = Edit1->Text;
    pUpdate->Query[UpdateKind]->ParamByName("firmaNavn")->Value = Edit2->Text;
    pUpdate->Query[UpdateKind]->ParamByName("postNr")->Value = Edit4->Text;
    pUpdate->Query[UpdateKind]->ParamByName("city")->Value = Edit5->Text;
    pUpdate->Query[UpdateKind]->ParamByName("firmaTlf")->Value = Edit6->Text;
    pUpdate->Query[UpdateKind]->ParamByName("mobil")->Value = Edit7->Text;
    pUpdate->Query[UpdateKind]->ParamByName("faxNr")->Value = Edit8->Text;
    pUpdate->Query[UpdateKind]->ParamByName("eMail")->Value = Edit9->Text;

    // Execute the SQL statement.
    pUpdate->ExecSQL(UpdateKind);

    // Call Apply to set parameters for the SQL statement
    // and execute it to update the record
    pUpdate->Apply(UpdateKind);
  }
}
Avatar billede haunted Nybegynder
16. april 2002 - 21:39 #1
Modify i TUpdateSql ser således ud...

update kunde
set
  FIRMANAVN = :FIRMANAVN,
  POSTNR = :POSTNR,
  CITY = :CITY,
  FIRMATLF = :FIRMATLF,
  MOBIL = :MOBIL,
  FAXNR = :FAXNR,
  EMAIL = :EMAIL
where
  KUNDEID = :OLDKUNDEID
Avatar billede soepro Nybegynder
17. april 2002 - 09:16 #2
Hvad laver CheckEdit() ? Hvor langt når du ? Hvad er det for en masse ekstra led du har med ? Apply() ? Caste pointere i flere led - æhem !

Nå, spøg til side ! Får du ikke en exception ? Jeg har selv oplevet at der foregår en eller anden form for Caching, som gjorde at datasettet ikke altid blev opdateret. Hvis derimod du bruger en TQuery komponent, hvor du også kan "fyre" batch SQL updates af vha. ExecSQL() metoden, plejer det at virke. Du kunne således ændre din KundeUpdateRecord til dette (pUpdate er en TQuery component):

void __fastcall TfrmKunde::KundeUpdateRecord(TObject *, TUpdateKind UpdateKind)
{
  String sqlStmt = "";

  swicth (UpdateKind)
  {
    case ukUpdate : sqlStmt = "update kunde set \n"
                    + "FIRMANAVN = \'" + Edit2->Text + "\', \n"
                    + "POSTNR = \'" + Edit4->Text + "\', \n"
                    + "CITY =  \'" + Edit5->Text + "\', \n"
                    + "FIRMATLF = \'" + Edit6->Text + "\', \n"
                    + "MOBIL = \'" + Edit7->Text + "\', \n"
                    + "FAXNR = \'" + Edit8->Text + "\', \n"
                    + "EMAIL = \'" + Edit9->Text + "\' \n"
                    + "where \n"
                    + "KUNDEID = \'" + Edit1->Text + '\'";
                    break;
    case ukInsert : sqlStmt = "insert into kunde \n"
                    + "(KUNDEID, FIRMANAVN, POSTNR, CITY, FIRMATLF, MOBIL, FAXNR, EMAIL)\n"
                    + "VALUES("
                    + Edit1->Text + ",\n"
                    + Edit2->Text + ",\n"
                    + Edit3->Text + ",\n"
                    + Edit4->Text + ",\n"
                    + Edit5->Text + ",\n"
                    + Edit6->Text + ",\n"
                    + Edit7->Text + ",\n"
                    + Edit8->Text + ",\n"
                    + Edit9->Text + ")";
                    break;
    case ukDelete : sqlStmt = "delete from kunde\n"
                    + "where \n"
                    + "KUNDEID = \'" + Edit->Text1 + "\'";
                    break;
  };

  // Execute the SQL statement.
  if (sqlStmt != "")
  {
    pUpdate->SQL->Text = sqlStmt;
    try
    {
      pUpdate->ExecSQL();
    }
    catch (Exception& e)
    {
      Application->MessageBox(("Fejl under opdatering af kunde(Fejl: "
                              + e.Message.TrimRight() + ")").c_str(),
                              "Kunde ikke opdateret", MB_ICONERROR | MB_OK);
      /* Ignore */
    };
  }; /* SQL statement built. */
}
Avatar billede haunted Nybegynder
17. april 2002 - 14:18 #3
Jeg kom sgu' til at acceptere...nå men jeg regner med din funktion den virker, jeg får dog først prøvet den iaften!

Det skal lige siges, at det med at caste pointere i flere led, det var noget jeg fandt i en bog. Så jeg er uskyldig :-0

Tak for hjælpen.
Avatar billede soepro Nybegynder
17. april 2002 - 14:37 #4
Den skulle holde vand - dog skal du bemærke at jeg konsekvent har sat ' (pling dvs. \') rundt om værdien på alle felter, det skal du fjerne for felter der er numeriske. (Det kunne jeg ikke se ud af dit SQL-statement hvilke felter der var.)

Mht. casting i flere led, så er det blot fordi bitter erfaring har lært mig, at man blive straffet hvis man gør det forkert - og det er nemt at komem til, når man først begynder at caste. Hvis du *skal* caste, så brug dynamic_cast<type '>(Variabel der skal castes) - den checker nemlig om den cast du laver også rent faktisk er gyldig. (Ved at checke klassetyper osv.)
Avatar billede haunted Nybegynder
18. april 2002 - 10:53 #5
Det virker sgu'.

Det ser også ud til at jeg ikke behøver at lave en commit work på databasen, mærkeligt!!

Det skal man da når man arbejder med tables?
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