Avatar billede jakobdo Ekspert
18. november 2002 - 21:47 Der er 10 kommentarer og
1 løsning

Borland, Access, SQL (Count)

Hej Alle!
Denne tror jeg er lidt tricky!
Jeg er ved at lave et program i Borland C++, som snakker sammen med en MS Access Database via ODBC!

Jeg har lavet et datamodul, hvor jeg har en database, tabeller og en query liggende!

Denne query har jeg fyldt på med følgende SQL: SELECT COUNT(id) FROM ASSISTENT;

Hvordan får jeg dette svar ud??

Count skulle gerne være 3, men hvordan får jeg det ud?
Hvis jeg bruger DELETE, INSERT, UPDATE og CREATE, skal man bruge EXECSQL()

Jeg kan ikke rigtigt finde en løsning på det andet endnu! :o(
Avatar billede jpk Nybegynder
19. november 2002 - 08:05 #1
SELECT COUNT(*) FROM ASSISTENT AS CNT

Brug så EXECSQL som sædvanlig og kolonnen CNT vil indedholde svaret...
Avatar billede jakobdo Ekspert
19. november 2002 - 09:15 #2
Jeg havde tænkt noget kode ala dette!
Men hvordan får jeg værdien ud af CNT og puttet den i variablen result??

int countRecord()
{
  bool status;
  int result;

  DataMod->Query->Close();
  DataMod->Query->SQL->Clear();
  DataMod->Query->SQL->Add("SELECT COUNT(*) FROM ASSISTENT AS CNT");

  try
  {
    DataMod->Query->ExecSQL();
    status = true;
  }
  catch(const EDBEngineError&)
  {
    status = false;
  }
  DataMod->Query->Close();
  DataMod->Query->SQL->Clear();
  if (status == false)
    result = -1;
  return(result);
}
Avatar billede jpk Nybegynder
19. november 2002 - 10:27 #3
Nu kender jeg ikke Borlands implementering af DB objekter, men måske du kunne gøre noget lign.:

DataMod->Query->SQL->Clear();
DataMod->Query->SQL->Add("SELECT COUNT(*) FROM ASSISTENT AS CNT");
DataMod->Query->Open();
int nCount = DataMod->Query->FieldByName("CNT")->AsInt;
// Jeg ved ikke om du skal bruge AsInt, men den hedder sikkert noget lignende...
Avatar billede jakobdo Ekspert
19. november 2002 - 11:49 #4
Jeg har prøvet følgende koder:

DataMod->Query->SQL->Add("SELECT COUNT(*) FROM ASSISTENT AS :CNT");
DataMod->Query->SQL->Add("SELECT COUNT(*) FROM ASSISTENT AS CNT");

result = DataMod->Query->FieldByName("CNT")->AsInteger;

Men den siger fejl, når koden bliver kørt:

'Query: Field 'CNT' is of an unknown type'

Hvad gør jeg så nu??
Avatar billede jpk Nybegynder
19. november 2002 - 11:53 #5
Hvorfor:
DataMod->Query->SQL->Add("SELECT COUNT(*) FROM ASSISTENT AS :CNT"); ???

Du skal vel også kalde fx Open, det gør du ikke...

Virker følgende ikke?

DataMod->Query->SQL->Clear();
DataMod->Query->SQL->Add("SELECT COUNT(*) FROM ASSISTENT AS CNT");
DataMod->Query->Open();
int nCount = DataMod->Query->FieldByName("CNT")->AsInteger;
Avatar billede jakobdo Ekspert
19. november 2002 - 12:01 #6
JPK: Din kode virker ikke nej! Den siger samme fejl! :o(

Jeg prøvede at sætte : foran CNT, da man sætter : foran variabler som bliver tildelt en værdi med DataMod->Query->ParamByName("CNT") = "FISK"; Eller whatever...

Men det virker desværre ikke din kode, det virker som om den ikke kender Feltet CNT... :o(
Avatar billede jakobdo Ekspert
19. november 2002 - 12:09 #7
HAHA!!
Jeg har fundet løsningen!!

Fejl:
DataMod->Query->SQL->Add("SELECT COUNT(*) FROM ASSISTENT AS CNT");

Vupti:
DataMod->Query->SQL->Add("SELECT COUNT(*) AS CNT FROM ASSISTENT");

Men du havde en stor del af æren JPK, så du får pointene alligevel! (jeg fik jo løst mit problem via fælles hjælp)

Juhuuu, nu er jeg glad! (indtil jeg støder ind i næste problem)
Avatar billede jpk Nybegynder
19. november 2002 - 12:23 #8
Jeg takker...
Avatar billede mickni33 Nybegynder
19. november 2002 - 22:39 #9
du skal ikke bruge EXECSQL når du selecter
Avatar billede soepro Nybegynder
20. november 2002 - 14:40 #10
EXECSQL er til ikke-visuelle queries, f.eks. INSERT, UPDATE og DELETE. Open() er til visuelle quieries f.eks. SELECT. EXECSQL behandler alle records der passer til queryen og returnere så. Open() laver en cursor og aflevere først (den næste) record ved Next(); (Svarende til FETCH.)
Avatar billede jakobdo Ekspert
20. november 2002 - 23:15 #11
Jeg bruger også en Open(), det var bare en mindre fejl i resten! :o)
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