Funktioniert nicht: Kombi aus Visual Studio 2015, Oracle DB, Pro*C/C++



  • Hallo zusammen,

    ich bin neu hier und das ist mein erster Beitrag in diesem Forum.
    Zu meiner Vorgeschich­te: In den letzten 10 Jahren habe ich ausschließlich mit Microsoft Visual C++ 6.0 MFC-Anwendungen programmiert. Größtenteil mit Zugriff auf eine Oracle Datenbank (Oracle Database 11g Release 11.2.0.3.0 - 64bit Production). Der Zugriff auf die Daten in der Datenbank erfolgt mittels Oracle Pro*C/C++ Precompiler *1).

    Der Oracle Precompiler arbeitet folgendermaßen: Es wird eine Eingabedatei mit der Endung .pc erstellt, die den notwendigen SQL-Code plus etwas C++ Code enthält. Diese Datei wird durch den Precompiler gejagt, der eine Ausgabedatei .cpp (oder .c) erstellt. Diese wird per #include meiner Klasse mitgeteilt.

    Jetzt möchte ich umsteigen auf Visual Studio 2015 *2).

    Leider ist die Dokumentation von Oracle *3) zur Integration von Pro*C/C++ in Visual Studio sehr dürftig. Selbst in der aktuellsten Dokumentation für Oracle 18c vom Februar 2018 befinden sich auf VC++6.0 bezogene veraltete Screenshots und dazugehöriger veralteter Text. Ich habe mittlerweile einige Versionen (8.1.6, 9.2, 10.2, 11.2, 12c, 18c) der Oracle-Dokumentation durchgearbeitet und in allen steht der gleiche Text und sind die gleichen Screenshots drin. 😞

    Mit Hilfe von einer Suchmaschine fand ich dann noch einen Textbeitrag von Mark Williams *4), der sich mit der Integration von Pro*C/C++ in Visual C++ 2008 Express Edition beschäftigt.

    Mithilfe dieser Dokumentationen habe ich dann versucht, die geeigneten Einstellungen für einen erfolgreichen Betrieb von VS 2015 und Pro*C/C++ vorzunehmen. Leider ist mir das noch nicht ganz gelungen, denn eine Einstellung muß ich übersehen haben bzw. falsch vorgenommen haben.

    Für den Umstieg auf VS 2015 habe ich ein kleines minimales MFC-Testprojekt erzeugt. Es beinhaltet (neben weiteren Methoden) 3 Methoden, die eine Verbindung zur Oracle-Datenbank aufbauen, eine SQL-Select-Abfrage machen und anschließend die Verbindung zur Oracle-Datenbank beenden. Parallel dazu habe ich unter VC++6.0 ein identisches Testprojekt erzeugt und ohne Probleme zufriedenstellend ausgeführt. Nur unter VS 2015 bekomme ich für jede der drei Datenbank-Methoden einen Fehler:

    Error LNK2019 unresolved external symbol "private: int __thiscall CHallo::connectDB(void)" (?connectDB@CHallo@@AAEHXZ) referenced in function "public: void __thiscall CHallo::OnBnClickedPbDatum(void)" (?OnBnClickedPbDatum@CHallo@@QAEXXZ) MFCApplication6 D:\Projekte\TestProjekte\VS_2015\MFC\MFCApplication6_ora\MFCApplication6\Hallo.obj

    Ich vermute, dass die Referenz zur Precompiler Ausgabedatei nicht oder nicht korrekt von mir gesetzt wurde. Allerdings habe ich alle Angaben/Eingaben mehrfach geprüft und kann keinen Fehler finden. Habt Ihr eine Idee, wo ich schrauben kann, damit mein Projekt sauber durchläuft?

    Wenn ich den Precompiler mit Eingabe- und Ausgabedatei manuell aufrufe, funktioniert es wie es soll.

    1)
    Oracle Pro
    C/C++ Precompiler
    https://de.wikipedia.org/wiki/Pro*C

    *2)
    Microsoft Visual Studio Professional 2015
    Version 14.0.25425.01 Update 3
    Microsoft .NET Framework
    Version 4.7.02558

    3)
    Integrating Pro
    C/C++ into Microsoft Visual Studio .NET
    https://docs.oracle.com/en/database/oracle/oracle-database/18/lnpcc/integration-with-Microsoft-Visual-Studio.html#GUID-B8364098-6810-40D7-A9BF-E38E263C8A36

    4)
    Mark Williams :: Blog
    Oracle Pro
    C on Windows with Express Edition Products
    https://oradim.blogspot.de/2009/05/oracle-proc-on-windows-with-express.html

    PS.
    Liebe Admins/Mods, falls ich im falschen Brett geschrieben habe, bitte ich darum, diesen Faden in ein geeignetes Brett zu verschieben.



  • Ist denn CHallo::connectDB eine vom Oracle-Preprozessor erzeugte Funktion oder von dir selbst geschrieben?

    An der Integration in neuere VS-Versionen sollte sich nichts wesentlich verändert haben (außer evtl. neuere Dialog-Designs).



  • Th69 schrieb:

    Ist denn CHallo::connectDB eine vom Oracle-Preprozessor erzeugte Funktion oder von dir selbst geschrieben?

    Hi,

    die Methode ist von mir geschrieben und befindet sich in der Eingabedatei für dem Precompiler. In der Ausgabedatei wird die Methode genutzt, um sich mit der Oracle-Datenbank zu verbinden. An der Methode kann es nicht liegen, denn in einem VC++ 6.0 Projekt funktioniert sie hervorragend.

    BOOL CHallo::connectDB()
    {
    	CString	csBenutzer	= _T("benutzer");
    	CString	csPasswort	= _T("geheim");
    	CString	csDatenbank	= _T("datenbank");
    
    	EXEC SQL BEGIN DECLARE SECTION;
    		VARCHAR vcBenutzer[32];
    		VARCHAR vcPasswort[32];
    		VARCHAR vcDatenbank[32];
    	EXEC SQL END DECLARE SECTION;
    
    	EXEC SQL WHENEVER SQLERROR goto sqlerror;
    	EXEC SQL WHENEVER NOT FOUND continue;
    
    	vcBenutzer.len	= strlen(strcpy((char *)vcBenutzer.arr,		csBenutzer));
    	vcPasswort.len	= strlen(strcpy((char *)vcPasswort.arr,		csPasswort));
    	vcDatenbank.len	= strlen(strcpy((char *)vcDatenbank.arr,	csDatenbank));
    
    	EXEC SQL CONNECT :vcBenutzer IDENTIFIED BY :vcPasswort USING :vcDatenbank;
    
    	return TRUE;
    
    	sqlerror:
        {
    		return FALSE;
        }
    }
    


  • Der Linker findet aber die aus dem Oracle-Preprozessor generierte Datei nicht.

    Wird denn bei einem Build korrekt der Oracle-Preprozessor aufgerufen, d.h. passen die Build Settings für die ".pc"-Dateien (s. G.2.3 Specifying Custom Build Options)?
    Und die passenden Dummy-".cpp"-Dateien sind auch dem Projekt hinzugefügt (s. G.2.1 Adding References to .c Files to a Project)?

    Und schau doch mal in die erzeugte ".cpp"-Datei.



  • Moin!

    Th69 schrieb:

    Der Linker findet aber die aus dem Oracle-Preprozessor generierte Datei nicht.

    Da bin ich ganz Deiner Meinung.

    Th69 schrieb:

    Wird denn bei einem Build korrekt der Oracle-Preprozessor aufgerufen, d.h. passen die Build Settings für die ".pc"-Dateien (s. G.2.3 Specifying Custom Build Options)?
    Und die passenden Dummy-".cpp"-Dateien sind auch dem Projekt hinzugefügt (s. G.2.1 Adding References to .c Files to a Project)?

    Die von Dir verlinkte Dokumentation kenne ich. Leider beziehen sich Text und Bilder auf VC++6.0 und nicht auf VS 2015. Zwischen den beiden bestehen hinsichtlich der Einstellungen sehr große Unterschiede. So wie in der von Dir verlinkten Doku geht das nicht. Wenn ich weiß, wie ich hier Screenshots hochladen kann, dann zeige ich mal meine Einstellungen.

    Th69 schrieb:

    Und die passenden Dummy-".cpp"-Dateien sind auch dem Projekt hinzugefügt (s. G.2.1 Adding References to .c Files to a Project)?

    Ich denke, das hier mein Fehler liegt. Leider passt der Dokumentationstext überhaupt nicht zu VS 2015, denn die folgende Meldung erscheint nicht. 😞

    Microsoft Visual Studio .NET displays the following message: "The specified file does not exist. Do you want to add a reference to the project anyway?"

    Th69 schrieb:

    Und schau doch mal in die erzeugte ".cpp"-Datei.

    Die ist leer. Rufe ich den Precompiler händisch auf (es gibt eine GUI-Version davon), dann wir die .cpp-Datei korrekt erzeugt.

    PS. Kann ich hier Screenshots hochladen?



  • Hallöchen,

    ich habe natürlich weiter recherchiert und dabei habe ich festgestellt, dass die Variable $(InputName) leer ist. Normalerweise sollte sie die Namen der .pc-Dateien enthalten.

    Irgendwo bei "G.2 Adding .pc Files to a Project" muss etwas schief gegangen sein.

    Kann ich diese Variable $(InputName) irgendwo setzen?



  • Tach auch!

    Gerade habe ich das unten stehende Dokument gefunden, welches besagt, dass das Makro $(InputName) veraltet ist. Vielleicht ist das ja der Grund, warum es zu meinem Problem kommt.

    Makros für Buildbefehle und -eigenschaften
    Visual Studio 2015
    https://msdn.microsoft.com/de-de/library/c02as0cs.aspx

    $(InputName) (Veraltet; Migriert) Der Basisname der Eingabedatei. Wenn das Projekt die Eingabe darstellt, entspricht dieses Makro $(ProjectName).



  • Hallöchen,

    ich mach hier mal die Irene.

    Zum aktuellen Stand
    Mit VC++6.0 habe ich ein Minimal-MFC-Programm gebaut, welches auf die Oracle-Datenbank zugreift. Von diesem Projekt habe ich mir zwei Kopien angelegt und jeweils eine Kopie mit Visual Studio 2010 Professional geöffnet und die andere Kopie mit Visual Studio 2015 Professional geöffnet.
    Die Kopie (VS 2010) meckert den Befehl "strcpy()" an; nachdem ich das korrigiert habe, läuft das Programm. 🙂
    Die Kopie (VS 2015) meckert Kommandozeilen-Optionen an "Error D8016 '/ZI' and '/Gy-' command-line options are incompatible". Soweit, sogut. Ich lass das hier erst mal so stehen.

    Eine Merkwürdigkeit ist mir aufgefallen. In beiden Projekten (VS 2010, VS 2015) gibt es in den Projekteigenschaften den Punkt "Benutzerdefiniertes Buildtool". Dieser Punkt "Benutzerdefiniertes Buildtool" fehlt mir in meinem ursprünglichen Testprojekt. Wie kann das sein? Kann mir jemand von Euch erklären, wie ich den Punkt "Benutzerdefiniertes Buildtool" zu einem beliebigen Projekt (VS 2015) hinzu bekomme?



  • Den gibt es schon. Hängt von den Einstellungen der Datei ab.

    - Wähle eine Datei aus. Z.B. eine Header Datei
    - Gehe in die Projekteinstellungen für die Datei
    - Dort Wähle bei Item-Type "Custom Build Tool"
    - Auf der rechten Seite erscheint nun ein Knoten "Custom Build Tool" in dem Du die Einstellungen vornehmen kannst.



  • Martin Richter schrieb:

    Den gibt es schon. Hängt von den Einstellungen der Datei ab.

    - Wähle eine Datei aus. Z.B. eine Header Datei
    - Gehe in die Projekteinstellungen für die Datei
    - Dort Wähle bei Item-Type "Custom Build Tool"
    - Auf der rechten Seite erscheint nun ein Knoten "Custom Build Tool" in dem Du die Einstellungen vornehmen kannst.

    Herzlichen Dank!

    Das funktioniert. Jetzt komme ich ein Stück weiter.