C++: Hoe vanuit code ADOconnectie?

Pagina: 1
Acties:

  • Antediluvian
  • Registratie: Maart 2002
  • Laatst online: 22-06 10:58
Hoe maak je vanuit code in C++ een ADOTable aan naar een Access Database?

De bedoeling is om een bepaalde Tabel een random record een vraag en 3 mogelijke antwoorden op te halen.

De tabel die ik wil openen heeft dezelfde naam als het themanummer.

Met de constructor wil ik de connectie bepalen en dan via de void "stelvraag" de verbinding activeren en er een random vraag+antwoorden ophalen.
code:
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
class thema{

private:
      int themanr, aantal;
      char themavraag[255], themaantwoord1[255], themaantwoord2[255], themaantwoord3[255];
      TADOTable *vragen;

public:
      thema (int t){ //Constructor
            themanr = t;
            vragen=new TADOTable(Form1);
            vragen->ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=MS Access-database;Initial Catalog=C:\vragen.mdb";
            vragen->TableName = themanr;
      }
      void stelvraag(){
            // verbinding activeren
            vragen->Active = true;
            aantal = vragen->RecordCount();
            aantal = random(aantal);
            vragen->Filter = "ID = " & aantal;
            vragen->Filtered = true;
            strcpy(themavraag, vragen->FieldByName("Vraag")->AsString);
            strcpy(themaantwoord1, vragen->FieldByName("Antwoord1")->AsString);
            strcpy(themaantwoord2, vragen->FieldByName("Antwoord2")->AsString);
            strcpy(themaantwoord3, vragen->FieldByName("Antwoord3")->AsString);
            vragen->Filtered = false;
            vragen->Filter = "";
            vragen->Active = false;
      }
};

Ben ik nu een }:O en zit ik er volledig naast of zou dit toch moeten werken (wat het dus niet doet).
Kan er iemand opheldering brengen?

PS: Voor de zekerheid, Welke includes heb ik hier voor nodig?

  • Antediluvian
  • Registratie: Maart 2002
  • Laatst online: 22-06 10:58
Sorry voor de wat breed uitgevallen post. :+

Verwijderd

Wat is een TADOTable?

Verwijderd

Geen idee lijkt me C++ Builder dit :?

  • Antediluvian
  • Registratie: Maart 2002
  • Laatst online: 22-06 10:58
TADOTable is inderdaad een Object in Borland C++ Builder 5 waarmee je een bepaalde Tabel van een database(bv een Access db of SQL server) kunt openen.

Als ik dit Object manueel op mijn form zet werkt het dus wel maar ik wil het vanuit code genereren

Als het ook een oplossing is zonder dit object is die ook goed.

Help :'( aub

Verwijderd

Op zaterdag 27 april 2002 13:10 schreef Antediluvian het volgende:
TADOTable is inderdaad een Object in Borland C++ Builder 5 waarmee je een bepaalde Tabel van een database(bv een Access db of SQL server) kunt openen.

Als ik dit Object manueel op mijn form zet werkt het dus wel maar ik wil het vanuit code genereren

Als het ook een oplossing is zonder dit object is die ook goed.
Hier met native C++ (VC++)

Bovenin de ADO typelib importeren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
#define INC_OLE2                // Include OLE/COM files
#include <comdef.h>             // Compiler support for _bstr_t
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//
//                              COM TYPELIB IMPORTS
//
///////////////////////////////////////////////////////////////////////////////////////
// Import libraries definitions, which will generate smart pointers.
//      ADO Components
#import "C:\Program Files\Common Files\System\ado\msado25.tlb" no_namespace rename("EOF", "EndOfFile")

Het pad naar de msado25.tlb file moet je even aanpassen aan jouw situatie.

Connection object openen:
code:
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
// Purpose: creates a new ADO Connection object and connects to the database specified
// Returns true if succeeded, false otherwise
bool
CGlobalData::CreateDBConnection()
{
    bool            bReturnValue;
    _bstr_t         bsConToUse;
    
    bReturnValue = true;
    try
    {
        TESTHR(m_conADO.CreateInstance(__uuidof(Connection)));
            // fill bsConToUse with connection string, omitted here in this snippet
        // Open the connection
        TESTHR(m_conADO->Open(bsConToUse,"","",adConnectUnspecified));
            
        // All ok
        bReturnValue = true;
    }
    catch(_com_error &e)
    {
        // Com error
        m_ssError.Format("CGlobalData::CreateDBConnection::COM Error: %s",e.Error(), e.ErrorMessage());
        bReturnValue = false;
    }
    return bReturnValue;
}

Zie ook de ADO help pages voor een voorbeeld hoe een recordset te retrieven uit de database. Het volgt een beetje het stramien zoals het voorbeeldje hieronder waar ik snippets heb geplakt van een stukje code dat via ADO een command object een record insert dmv een stored proc:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Create Command object
TESTHR(cmdADO.CreateInstance(__uuidof(Command)));
        
// fill properties
cmdADO->ActiveConnection=m_ggdInternalData.m_conADO;
cmdADO->CommandText = "sp_pdimport_Add_Landen";
cmdADO->CommandType = adCmdStoredProc;
    
// Add parameter
cmdADO->Parameters->Append(cmdADO->CreateParameter("@sLandID",adVarChar, adParamInput, 3));
cmdADO->Parameters->Append(cmdADO->CreateParameter("@sDescription",adVarChar, adParamInput, 50));
cmdADO->Parameters->Append(cmdADO->CreateParameter("@bInitFirst",adBoolean, adParamInput, 1));
cmdADO->Parameters->Append(cmdADO->CreateParameter("@iErrorCode",adInteger, adParamOutput,4,0));

// ...
// fill parameters with values
cmdADO->Parameters->Item["@sLandID"]->Value = sLandID;
cmdADO->Parameters->Item["@sDescription"]->Value = sDescription;
cmdADO->Parameters->Item["@bInitFirst"]->Value = bInitFirst;
                    
cmdADO->Execute(NULL,NULL,adCmdStoredProc);

iErrorCode = (int)cmdADO->Parameters->Item["@iErrorCode"]->Value;

Verwijderd

#import is ms specific dacht ik?

Verwijderd

Op zaterdag 27 april 2002 14:50 schreef Yarvieh het volgende:
#import is ms specific dacht ik?
DAT zou wel eens kunnen inderdaad, niet bij stilgestaan, maar het zou me niets verbazen als BCB5 een equivalent heeft. Het is nml. klare SM om COM te programmeren zonder smart pointers :)

Verwijderd

Op zondag 28 april 2002 12:14 schreef Otis het volgende:
Het is nml. klare SM om COM te programmeren zonder smart pointers :)
Och de pijn went.. :Y)

  • Antediluvian
  • Registratie: Maart 2002
  • Laatst online: 22-06 10:58
Ik zal morgen effe proberen wat Otis voorstelde, ik laat jullie weten of het gelukt is of niet.

Alvast bedankt

  • Antediluvian
  • Registratie: Maart 2002
  • Laatst online: 22-06 10:58
Nog even een kleine probleem schets.

De gebruikte compiler is Borland C++ Builder 5

Er bestaat een access databank(nl vragen.mdb) met een tabel "1" en daarin een kolom "Vraag"

Het is mij gelukt om vanuit code een TADOTable aan te maken en wel op deze manier.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <ADODB.hpp>
 
TADOTable *test;
char strtest[255];

test = new TADOTable(Form1);
test->ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=MS Access-database;Initial Catalog=D:\Documenten\School\Projecten\C++\vragen.mdb";
test->TableName = "1";
test->EnableBCD = true;   //ik ben niet zeker dat dit nodig is
test->TableDirect = true;   //ik ben niet zeker dat dit nodig is
test->Active = true;
strcpy(strtest, test->FieldByName("Vraag")->AsString.c_str());
Application->MessageBox(strtest, "Alert!", MB_OK);



Voor de connectie gebruik ik de ODBC drivers

Tijdens het compileren krijg ik geen enkele fout maar tijdens het uitvoeren krijg ik de volgende error op de strcpy lijn :(

"Project Project1.exe raised exception class EOleException with message '[Microsoft][ODBC Microsoft Access-stuurprogramma] Deze naam is geen geldige bestandsnaam'. Precess stopped. Use Step or Run to continue."

Ik heb reeds geprobeert om "vraag" om te zetten naar AnsiString maar zonder resultaat.

Ik zou zéér graag via code mijn database aanspreken en zo de gewenste vraag ophalen aangezien ik van plan ben om alle schermen(forms) via code te laten genereren.

Ik heb reeds vele uren gezocht op internet maar ik begin de moed te verliezen.

Kan iemand mij eventueel helpen om dit te realiseren?

PS: Het is vrij dringend.

Bedankt op voorhand.

  • Antediluvian
  • Registratie: Maart 2002
  • Laatst online: 22-06 10:58
Voor de mensen die geïnstresseerd zijn, dit is de oplossing die ik heb gevonden. *D

Het probleem lag hem eerder bij ODBC dan bij C++ |:(
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <ADODB.hpp>
 
TADOTable *test;
char strtest[255];

test = new TADOTable(Form1);
test->ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=JB";
test->TableName = "1";
test->EnableBCD = true;   //ik ben niet zeker dat dit nodig is
test->TableDirect = true;   //ik ben niet zeker dat dit nodig is
test->Active = true;
strcpy(strtest, test->FieldByName("Vraag")->AsString.c_str());
Application->MessageBox(strtest, "Alert!", MB_OK);

De verandering = de Connectionstring: Data Source=JB

met JB in het ODBC-gegevensbronbeheer als gebruikers-DSN gedefiniëerd die de MS Access driver gebruikt en direct verwijst naar de desbetreffende Databese. B-)
Pagina: 1