Avatar billede sammy Nybegynder
12. september 2002 - 10:07 Der er 9 kommentarer og
1 løsning

Hjælp til funktion i Borland C++ Builder

Hej

Jeg er i gang med at lave en funktion til at udføre queries i mit program.

__Fastcall Form1::ExecuteQuery(AnsiString asSQL, AnsiString asQuery)

DataModule->asQuery->Close();
DataModule->asQuery->SQL->Clear();
DataModule->asQuery->SQL->Add(asSQL);
DataModule->asQuery->Open();

Problemet er at når jeg kalder funktionen kan den ikke håndtere variablen/parametren asQuery, men i stedet leder efter objektet asQuery i DataModule.

Nogen ideer?
Sammy
Avatar billede jpk Nybegynder
12. september 2002 - 10:30 #1
Det er da klart hvis du henviser til en parameter du sender med til en funktion..?
asQuery er jo bare en lokal streng , ikke en member i DataModule!
Avatar billede sammy Nybegynder
12. september 2002 - 10:43 #2
Funktionen bliver defineret i DataModule, men det åbenbart ikke nok ;)

Hvis jeg kalder funktionen sådan her:

DataModule->ExecuteQuery("Select * from Table",Query1)

skal den gerne udføre dette:

DataModule->Query1->Close();
DataModule->Query1->SQL->Clear();
DataModule->Query1->SQL->Add("Select * from Table);
DataModule->Query1->Open();

Hvad kan jeg gøre for at få det til at virke?
Avatar billede jpk Nybegynder
12. september 2002 - 11:08 #3
Hvilken type er Query1?
Du har angivet det som AnsiString i din funktion, men det er vel ikke?
Avatar billede sammy Nybegynder
12. september 2002 - 11:51 #4
Nej det er en TQuery placeret i datamodulet, dem har jeg nogle stykker af. Derfor vil jeg gerne kunne vælge hvilken Query jeg vil arbejde med.
Avatar billede mickni33 Nybegynder
12. september 2002 - 22:27 #5
kan man ikke lave sin egen variabel af typen asSQL

TQuery* asSQL;
Avatar billede mickni33 Nybegynder
12. september 2002 - 22:28 #6
altså sådan  her

__Fastcall Form1::ExecuteQuery(TQuery* asSQL, TQuery* asQuery)
Avatar billede jpk Nybegynder
13. september 2002 - 10:40 #7
asSQL skal nok være en streng, altså vil jeg mene dette er det korrekte:

__Fastcall Form1::ExecuteQuery(AnsiString asSQL, TQuery* asQuery)
Avatar billede mickni33 Nybegynder
13. september 2002 - 12:17 #8
jpk>>
ja se'følig :-)
Avatar billede soepro Nybegynder
16. september 2002 - 09:18 #9
Hvad med:

bool __fastcall Form1::ExecuteQuery(TQuery *pQuery, AnsiString asSQL)
{
  AnsiString chkForSelect = asSQL.LowerCase();
 
  if (pQuery->Active)
    pQuery->Close();
 
  try
  {
    pQuery->SQL->Text = asSQL;
    if (chkForSelect.Pos("select") > 1)
      pQuery->SQL->Open();
    else
      pQuery>->ExecSQL();
  }
  catch (Exception& e)
  {
    Application->MessageBox(("SQL statement \'" + asSQL + "\' kunne IKKE udføres. (Fejl: " + e.Message + ")").c_str(), "Fejl i SQL",
      MB_ICONERROR | MB_OK);
  };
} // ExecuteQuery

Funktionen skal så kaldes med den af dine DataModule queries, som skal udføres:

  ExecuteQuery(DataModule->Query1, "select * from Table");

Principielt ville jeg synes du skulle fjerne sqlStmt helt fra selve funktionskaldet, og lave ændringen af SQL-statementet (hvis der overhovedet skal det - for det er vel derfor du har flere forskellige Queries i dit datamodul eller ?):

  DataModule->Query1->SQL->Text = "select * from table";
  ExecuteQuery(DataModule->Query1);

Du skal lige være opmærksom på, at man kun kan lave Open på SQL-statements der indeholder 'select' - alle andre skal udføres vha. 'ExecSQL' metoden. (Derfor det ekstra lille check på om SQL-statementet indeholder select.)
Avatar billede sammy Nybegynder
02. januar 2005 - 19:06 #10
->soepro, du får point,,, kan knap huske jeg har oprettet dette indlæg,, tak for interessen!
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