Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Access Datenbank öffnen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
12.01.2003, 14:35 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Ich arbeite noch immer an meinem Access Projekt.
Eine kurze Erklräung:
Unsere Aufgabe war es, eine Verwaltung für ein Internetcafe zu machen. Jetzt hab ich auf die schnelle einen Browser in VC++ gemacht, welche die Onlinezeit zählt.
Nun mein Poblem: Ich müsste beim Button "Einloggen" kurz mal in die DB schauen, ob das Passwort richtig ist und ob der User überhaupt noch surfen darf und beim Button "Ausloggen" müsste ich einen Integer Wert (Minuten) in die DB schreiben.
Kennt ihr zuällig einen Source, welcher mir erlaubt, schnell auf die DB zuzugreifen und nachzuschauen?? In VBA ging es ziemlich einfach: man musste nur zwei Instanzen erstellen und konnte auf die DB zugreifen. Hoffe, es geht in Vc++ auch

Danke im voraus!!!!!
mg mike
--

Dieser Post wurde am 12.01.2003 um 14:36 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.01.2003, 15:25 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


am schnellsten ginge sowas denke ich per mysql ...
mit Vc kann man ja ne Datenbank mit einer CRecordSet-Klasse machen ... dann hast du zugriff auf die datenbank ...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.01.2003, 17:28 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Thx für deine Antwort! Mein Problem: Ich hab kein MySQL Ich kann mit den Schnittstellen DAO, ADO oder ODBC arbeiten. Nur weiß ich nicht wie der Befehl Open (oder Connect) funktioniert. In meinen ganzen Büchern und Samples wird die DB schon beim ASSI eingebunden und das genau will ich nicht, da meinen DB nicht beim System angemeldet ist.

mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.01.2003, 17:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,

Klasse von CRecordSet ableiten:

CMyRecSet

in


C++:
void CMyRecSet::DoFieldExchange(CFieldExchange* pFX)
{
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Long(pFX, _T("[Nummer]"), m_dbNummer); // Spaltenname & Member verbinden
    RFX_Text(pFX, _T("[Title]"), m_dbTitle);
}

CString CMyRecSet::GetDefaultConnect()
{
    return _T("DBQ=%MDBNAME%; DefaultDir=%MDBDIR%; Driver={Driver do Microsoft Access (*.mdb)}; DriverId=25; FIL=MS Access; FILEDSN=%DSNDATEI%; MaxBufferSize=2048; MaxScanRows=8; PageTimeout=5; SafeTransactions=0; Threads=3; UID=admin; UserCommitSync=Yes;");
}

CString CMPSet::GetDefaultSQL()
{
    return _T("[Lieder]"); // Hier den Tabellennamen rein
}




die sachen

%MDBNAME% ist der datenbankdateiname (ohne pfad)
%MDBDIR% ist das Verzeichnis der datenbank
%DSNDATEI% ist folgende datei (mit pfad):

Datei database.dsn:

Code:
[ODBC]
DRIVER=Driver do Microsoft Access (*.mdb)
UID=admin
UserCommitSync=Yes
Threads=3
SafeTransactions=0
PageTimeout=5
MaxScanRows=8
MaxBufferSize=2048
FIL=MS Access
DriverId=25
DefaultDir=. <-- hier wieder Ordner
DBQ=database.mdb <-- hier wieder Dateiname



damit sollte es gehen, achja daten abfragen (bzw Datenbank öffnen)


C++:
CMyRecSet *pSet = NULL;

  TRY
  {
    pSet = new CMyRecSet(0);
    pSet->Open();
  }
  CATCH(CDBException,Fehler)
  {
    MessageBox("Fehler beim Verbinden zur Datenbank","ERROR",MB_OK|MB_ICONSTOP);
    return;
  }
  END_CATCH;

  if(!pSet)
    return;

  if(!pSet->IsOpen())
    return;




am Ende dann


C++:
  pSet->Close();



mit


C++:
  pSet->MoveNext();
  pSet->MovePrev();



usw, kennste sicher, eben die einträge durchschalten ...
--
class God : public ChuckNorris { };

Dieser Post wurde am 12.01.2003 um 17:48 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.01.2003, 18:41 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Danke für dein Sample!! Mir persönlich gefällts gut, nur wenn das mein Prof sieht, kappiert er wieder nix Wollte es nämlich Basic ähnlich halten.
Ich habs folgendermaßen probiert:

C++:
CDaoDatabase db;
db.Open(_T("C:\\user.mdb"));

CDaoRecordset rs(&db);
rs.Open(dbOpenDynaset, _T("Select * from tblUser"));
while (!rs.IsEOF())
{
   COleVariant varName;
   COleVariant varPass;
   varName= rs.GetFieldValue("Name");
   varPass=  rs.GetFieldValue("Passwort");

    AfxMessageBox(V_BSTRT(&varName));
        
    rs.MoveNext();
}

rs.Close();
db.Close();



Nur mein Problem: Ich kann nur Access97 DBs öffnen. Bei meiner Access2000 schreibt er: "Unbekanntes Datenbankformat". Woran kann das liegen?? An den Treibern?? Oder geht die DAO nicht für Access2000??

Danke im Voraus!

mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.01.2003, 18:56 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Habs jetzt sogar mit einem DAO MSDN Sample probiert. Der kennt Access2000 Dbs auch net
Wenn man im google "DAO Access 2000" eingibt, dürften das Problem anscheinend schon mehrere gehabt haben. Immerwieder wird ADO empfohlen. Ich hab jetzt aber keinen View

mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.01.2003, 21:06 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Mike,
warum so Umständlich?
Lesen wie folgt:

C++:
#include <odbcinst.h>

void CAccessDlg::OnLesen()
{
    CDatabase db;
    CString Sql;
    CString Ausgabe1, Ausgabe2;
    CString Treiber;
    CString Dsn;
    CString Datei = "db1.mdb";
    // eine Listbox leeren und dann wieder füllen
    m_ctrlListBox.ResetContent();
    
    
    Treiber = GetTreiber();
    if( Treiber.IsEmpty() ){
        AfxMessageBox("Kein Access-Treiber gefunden");
        return;
    }
    
    
    Dsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",Treiber,Datei);

    TRY{
        db.Open(NULL,false,false,Dsn);
        CRecordset rc( &db );
        Sql = "SELECT Name, Vorname "        
                 "FROM Tabelle1 ";
        rc.Open(CRecordset::forwardOnly,Sql,CRecordset::readOnly);

        
        while( !rc.IsEOF() ){
            rc.GetFieldValue("Name",Ausgabe1);
            rc.GetFieldValue("Vorname",Ausgabe2);
            m_ctrlListBox.AddString( Ausgabe1 + ", "+Ausgabe2 );
            rc.MoveNext();
        }
        db.Close();
                            
    }
    CATCH(CDBException,Fehler){
        
        AfxMessageBox("Fehler: "+Fehler->m_strError);
    }
    END_CATCH;
}

CString CAccessDlg::GetTreiber()
{
    char Buf[2001];
    WORD BufMax = 2000;
    WORD BufAus;
    char *p_Buf = Buf;
    CString Treiber;

   if(!SQLGetInstalledDrivers(Buf,BufMax,& BufAus))
       return "";
    do{
        if( strstr( p_Buf, "Access" ) != 0 ){
            Treiber = CString( p_Buf );
            break;
        }
        p_Buf = strchr( p_Buf, '\0' ) + 1;
    }while( p_Buf[1] != '\0' );

    return Treiber;
}


Schreiben geht genauso einfach.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 12.01.2003 um 21:10 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.01.2003, 21:08 Uhr
Christian
C/C++ Master
(Operator)


Hi!

Also das mit den Data Access Objects ist ein Problem. Die werden eben nicht mehr weiterentwickelt. Da musst du suchen, welche DAO Version zu deiner DB passt.
Die DAO Schnittstellen sind übrigens nicht 100% ig abwärtskompatibel. Ich hatte neuesten bei mir regstriert und installiert und dann kam immer die Meldung "Interner Anwendungsfehler". Daraufhin habe ich dann die Version, die zu der Version der MDB passt, verwendet.

Grüße
--
Grüße, Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.01.2003, 16:32 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Laut MSDN kann CDatabase kein SetFieldValue. Stattdessen soll man CDaoDatabsae verwenden. Mein Problem liegt jetzt aber bei den COleVariants. Wie kann ich einer COleVariantvariable einen int Wert zuweisen? Ich komm mit dem casten net klar

Danke im Voraus!!
mfg mike
PS: Mein Problem liegt beim = operator nicht bei der Deklaration
--

Dieser Post wurde am 13.01.2003 um 16:35 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
31.01.2003, 09:26 Uhr
~MoJr
Gast


Tach!
Ziemlich verspätete Antwort, aber vielleicht hilfts ja trotsdem noch.
Wieso nutzt du nicht die ADO Objekte. Im Prinzip müsste es folgendermaßen funktionieren!
Folgender Code kommt in die Headerdatei (stdafx.h)

Code:
#pragma warning(disable:4146)
#import "H:\Programme\Gemeinsame Dateien\System\ado\msado15.dll" no_namespace rename("EOF", "EndOfFile")
#pragma warning(default:4146)


Damit werden beim übersetzen 2 Header Dateien erzeugt (*.tli, *.tlh9) die alle Typdeklarationen der ADO Objekt enthalten.

Jetzt musst du die Datenbank öffnen und zwar so:

Code:
_ConnectionPtr  pConn;
int OpenDB()
{        
    _ConnectionPtr  pConnRef(_T("ADODB.Connection"));    
    pConn = pConnRef;
    pConn->AddRef();
    pConn->ConnectionTimeout = 5000;
    
    CString csConnection;
    
    csConnection.Format("Provider=Microsoft.Jet.OLEDB.4.0;"
            "Data Source=%s;Persist Security Info=False;"
            "Jet OLEDB:Database Password=Hier das Passwort", Datenbankpfad);
    try
    {
        pConn->Open((LPCTSTR) csConnection,_T(""),_T(""), adConnectUnspecified);
    }
    catch (_com_error &e){
        AfxMessageBox(e.Description());    
        return DATABASE_NOTOPEN;
    }
    catch (...){
        throw;
    }    return TRUE;

}



Und wenn Sie offen ist, ist der Zugriff noch viel einfacher!


Code:
int GetIrgendwelcheWerte(ARRAYDIRLISTE *parray)
{
             CString gelesenerWert;
    CString csTmp;
    CString csSQL;
    parray->RemoveAll();

    try{
        _RecordsetPtr    pRs(_T("ADODB.Recordset"));    
        pRs->CursorType = adOpenForwardOnly;
        pRs->LockType = adLockReadOnly;

        csSQL="Select [Spaltenname] from Tabellenname"
                " order by Directory asc";
        
        pRs = pConn->Execute((LPCTSTR)csSQL,NULL,adCmdText|adLockReadOnly);

        while (!pRs->EndOfFile)
        {    
                     gelesenerWert = (char*) (_bstr_t)pRs->Fields->Item[(long)1]->Value;
            parray->Add(gelesenerWert);
            pRs->MoveNext();            
        }
          
        pRs->Close();
    }
    catch (_com_error &e){
        AfxMessageBox(e.Description());    
        return DATABASE_ERROR;
    }
    catch (...){
        throw;
    }
    return TRUE;
}



Wenn du fertig bist, vergiss nicht die Datenbank wieder zu schließen!

Code:
int CloseDB()
{
    pConn->Close();
    pConn->Release();
    return 0;
}



Das wars schon! Beachte bitte, dass du dich damit in der COM Welt befindest, die du geeigneter Weise mit
::CoInitialize( NULL );
hochfährst und mit
::CoUninitialize( );
wieder herunterfährst.
Sorry, dass ich mich jetzt erst melde, aber ich habe lange nicht mehr hier reingeschaut. . .

Mfg MoJr

P.S. Pack doch den Code einfach in eine Klasse, die du dann später nur noch um die Zugriffsmethoden erweiterst . . .
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: