Datenbankanbindung

mischu

Grünschnabel
Ich bin gerade an der Entwicklung eines Projekts mit C++ und DirectX. Leider habe ich keine Erfahrung mit Datenbankanbindungen in C++.
Ich möchte gerne den Spielstand sowie die andere Optionen im Spiel in eine Datenbank speichern. Das ganze muss nicht rasend schnell sein, da dies während des Ladezyklus (bzw. Speicher) des Spieles aus der Datenbank gelesen wird.
Nun wie gesagt fehlt mir die Erfahrung, und wollte darum euch fragen, was ihr hier für sinnvoll haltet?
Ich hätte an eine Access Datenbank gedacht. Jedoch habe ich in den FAQs und im Forum selbst keine Lösung gefunden. Aus Zeitdruck wäre ich euch für eine Tipp und ein Beispiel sehr dankbar.

Ps.: Dies wird kein rissen 3D Spiel, sondern ein mittelgrosses 2D Spiel.
 
Hallo,

bin gerade dabei eine AccessDB auszulesen/zu ändern. Hier ein kleiner Code. Zwei/Drei Beiträge drunter beschreibe ich leider mein Problem mit dieser Methode, aber vielleicht hilt es dir ein weinig weiter:

Code:
int CADODB::loadDataBase(CString& sPath)
{
	try
	{
		::CoInitialize(NULL);
		
		//ConnectionObject
		m_pCon = NULL;
		m_pCon.CreateInstance( __uuidof( Connection ) );

		CString sProv = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + sPath;
		m_pCon->Open(_bstr_t(sProv), "", "", adConnectUnspecified);
		if (m_pCon == NULL)
			return -1;
		
		//RecordSetObject
		m_pRs = NULL;
		m_pRs.CreateInstance(__uuidof( Recordset ));
		
		m_nAnzahl = 0;

		::CoUninitialize();

		return 0;
	}
	catch(...)
	{
		AfxMessageBox("Fehler beim Laden der Datenbank");
		return -1;
	}
}

Ich lese die Datenbank über ADO aus. Dazu müsstest du noch die Msado15.dll importieren.

Code:
#import "C:\Programme\Gemeinsame Dateien\System\ADO\Msado15.dll" rename_namespace("ADOCG") rename("EOF", "ADOEOF")

using namespace ADOCG;

Mit dem RecordsetObject kannst du die Daten auslesen/ändern.
Hier noch ein "Kot" zum öffnen einer Tabelle.

Code:
int CADODB::loadTable(CString& sTable)
{
	//open a table
	if (sTable == "")
	{
		AfxMessageBox("Fehlender Parameter: Tabellenname fehlt");
		return -1;
	}
	if (m_pRs->GetState() == adStateOpen)
	{
		m_pRs->Close();
		m_pRs = NULL;
	}
	try
	{
		if (m_pCon == NULL)
			return -1;
		m_pRs->Open(OLESTR("select * from " +  _bstr_t(sTable)), 
					m_pCon.GetInterfacePtr(), adOpenForwardOnly, 
					adLockBatchOptimistic, -1);
		m_pRs->MoveFirst();
		m_sActiveTable = sTable;
	}
	catch(...)
	{
		CString sErr;
		sErr.Format("Fehler beim Öffnen der Tabelle %s", sTable);
		AfxMessageBox(sErr);
		return -1;
	}
	return 0;
}

Wenn du willst, dann schicke ich dir die Klasse zu, aber ich weiß nicht, ob sie bei dir fehlerfrei funktioniert. Habe die noch nicht ganz fertig. Aber vielleicht hilft es dir ein bißchen weiter.

@alle anderen
Falls ich hier irgendwo fehler gemacht habe, bitte um Korrektur! Bin schließlich auch nur ein Azubi, deshalb auch ein Anfäger!

Lukas
 
Zurück