Unter Visual Studio C und C++ mischen



  • Hey Freunde der Sonne,

    ich arbeite gerade an einem Schulprojekt und möchte mit Hilfe von OpenCV erkennen ob ein freier Parkplatz verfügbar ist und die Daten an mein MySQL Server (XAMPP) senden. Die Bilderkennung funktioniert super und ich hab es in C++ geschrieben, da die Bibliothek dort umfangreicher und für mich einfacher zu verstehen ist. ABER! Ich kriege die Krise mit C++ mich zur Datenbank zu verbinden... ich muss selber die builds machen wovon ich keine Ahnung habe und ich frage euch, ob ich z.B. innerhalb meines Projektes auch in C# schreiben kann. Geht sowas? Weil die main Datei ist .cpp und ich weiß nicht wie kompatibel sowas ist. Danke für eure Hilfe. 🙂



  • Meinst du jetzt "C und C++ mischen" oder "C# und C++ mischen"?



  • Also einfache Datenbank-Requests absetzen ist mit ADODB jetzt auch nicht mehr als ein paar Zeilen Code.

    ---

    C# und C++ kann man soweit ich weiss innerhalb des selben Projekts nicht mischen. Du kannst aber über C++/CLI .NET Code aufrufen. Ist nur die Frage ob du das willst. Ist vermutlich auch nicht weniger Arbeit als ein ADODB Sample anzupassen so dass es das tut was du brauchst.



  • Die einfachste Lösung wäre vermutlich, den C++ Code in eine DLL zu packen und diese von C# aus zu verwenden.



  • Du kannst auch ein Programm für die Bildverarbeitung mit C++ erstellen und eins für die Datenverwaltung mit C# und die beiden dann über IPC Daten austauschen lassen. 😃



  • hustbaer schrieb:

    Also einfache Datenbank-Requests absetzen ist mit ADODB jetzt auch nicht mehr als ein paar Zeilen Code.

    ---

    C# und C++ kann man soweit ich weiss innerhalb des selben Projekts nicht mischen. Du kannst aber über C++/CLI .NET Code aufrufen. Ist nur die Frage ob du das willst. Ist vermutlich auch nicht weniger Arbeit als ein ADODB Sample anzupassen so dass es das tut was du brauchst.

    Und wie soll das gehen ? Was macht ADODB und kann ich das innerhalb von meinem C++ Programm nutzen und die Daten dann an meine MySQL Datenbank senden ? Im Netz finde ich die Info das es nur mit Python geht...



  • comtruise schrieb:

    Im Netz finde ich die Info das es nur mit Python geht...

    Womit suchst Du denn? 😕 😮

    https://www.google.com/search?q=ADODB+c%2B%2B



  • Swordfish schrieb:

    comtruise schrieb:

    Im Netz finde ich die Info das es nur mit Python geht...

    Womit suchst Du denn? 😕 😮

    https://www.google.com/search?q=ADODB+c%2B%2B

    Also wenn ich als Neuling diese Codes sehe dann kriege ich ein Schrecken. Warum ist das so kompliziert über C++ Daten an einen localhost Server zu senden, geschweige SQL Statements zu benutzen?



  • Kann ich verstehen dass dich das als Anfänger abschreckt. Hier ein kleines, funktionierendes Beispiel:

    #import "c:\Program Files\Common Files\System\ADO\msado15.dll" rename("EOF", "EndOfFile")
    
    #include <iostream>
    
    int main()
    {
    	// COM initialisieren.
    	::CoInitialize(nullptr);
    
    	try
    	{
    		// Connection zum Server aufmachen.
    		ADODB::_ConnectionPtr con(__uuidof(ADODB::Connection));
    		con->Open(L"Provider=sqloledb;Server=.;Initial Catalog=test;Integrated Security=SSPI", L"", L"", ADODB::adConnectUnspecified);
    
    		// Einen Datensatz einfügen.
    		_variant_t count = 0;
    		con->Execute(L"INSERT t1 (data) VALUES ('rararasputin');", &count, ADODB::adOptionUnspecified);
    		std::cout << static_cast<long>(count) << " records inserted\n";
    
    		// Alle Datensätze abfragen.
    		ADODB::_RecordsetPtr rs(__uuidof(ADODB::Recordset));
    		rs->Open(
    			L"SELECT id, data FROM t1 ORDER BY id ASC;",
    			con.GetInterfacePtr(), ADODB::adOpenForwardOnly, ADODB::adLockReadOnly, ADODB::adOptionUnspecified);
    		// Felder binden
    		ADODB::FieldPtr idField = rs->Fields->Item[L"id"];
    		ADODB::FieldPtr dataField = rs->Fields->Item[L"data"];
    		// Über alle Datensätze loopen.
    		while (!rs->EndOfFile)
    		{
    			// Feldwerte der aktuellen Zeile ausgeben.
    			long id = static_cast<long>(idField->Value);
    			_bstr_t data = static_cast<_bstr_t>(dataField->Value);
    
    			std::cout << "id = " << id << ", data = '" << static_cast<char const*>(data) << "'\n";
    
    			// Zur nächsten Zeile gehen.
    			rs->MoveNext();
    		}
    		// Und tschüss.
    		rs->Close();
    		con->Close();
    		return 0;
    	}
    	catch (_com_error const& e)
    	{
    		std::cout << "Error: " << static_cast<char const*>(_bstr_t(e.ErrorMessage())) << "\n";
    		std::cout << "Description: " << static_cast<char const*>(e.Description()) << "\n";
    		return 1;
    	}
    }
    

    Den Connection-String (=das was bei con->Open() mitgegeben wird) wirst du anpassen müssen, dazu einfach auf https://www.connectionstrings.com/ nachgucken was du für deine Datenbank brauchst. (Der in dem Beispiel ist für einen lokal laufenden SQL Server mit Authentifizierung über den eingeloggten Windows Account, Datenbankname "test".)

    Was ich vielleicht noch dazuschreiben sollte: "id" ist in dem Beispiel ein "identity" Feld = ein Feld wo der Server automatich eine passende ID generiert.