Binärdaten aus SQL Datenbank in eine Datei schreiben



  • Guten Morgen,
    ich bin kein c++ Programmiere, muss aber eben solch ein Programm supporten.
    Nun soll ich Binärdaten ( PDF, Bild, Firmware,....) aus eine MS Sql Tabelle in eine Datei speichern. Ich habe schon einiges versucht aber nichts klappt so recht. Ich brauch dringend euer Hilfe.

    HRESULT CStdAPABDlg::Execute(CString OrderNo, long lAVO, CString sPath, CString &FileName, bool DoSave /*false*/)
    {
    	HRESULT hr = S_OK;
    
    
    	FileName ="";
    	const CString DB_PROFILE = "bla.bla.Production";
    	CString s = "";
    	s.Format("%d",lAVO);
    	s = "'%_" + s + "%'";
    	//	CString s = "'%_" + ltoa(lAVO) + "%d %'";
    	CString source = ""; //s.Format(s,lAVO);//'%_4110%'
    	CString sTemp = "'%"+ OrderNo + "'";
    	CString strSQL;
    	COleVariant varDatabase;
    	CCxADOConnection DBCon;
    	
    	CCxADORecordset Rs(&DBCon);
    
    	int iRetries = 0;
    	const int iMaxRetries = 3;
    
    	m_DataLogger.Log_Info(CCxGUID("b28c6793-ded2-4343-a4cf-9265e45d3e80"), "CStdAPABDlg::Execute() ModulNr: %d", GetModulNr());
    
    	//09902968_M13597637_BGZ_2437270_00_2437270_00_E84DGFCRFJPX067_4110.PNG
    	if(DoSave)
    	{
    		strSQL.Format("SELECT afw.[file_name] ,afws.binary_data \
    				FROM t_AuftragFirmware afw inner join t_AuftragFirmwareStore afws on afws.lfdnr = afw.lfdnr_store \
    				where afw.file_name like %s and afw.lfdnr_auftrag = (select lfdnr from t_auftrag where aufnr like %s)", s, sTemp);
    	}
    	else
    	{
    		strSQL.Format("SELECT afw.[file_name] \
    				FROM t_AuftragFirmware afw inner join t_AuftragFirmwareStore afws on afws.lfdnr = afw.lfdnr_store \
    				where afw.file_name like %s and afw.lfdnr_auftrag =  (select lfdnr from t_auftrag where aufnr like %s)", s, sTemp);
    	
    	}
    	BOOL fRet = FALSE;
    	SET_SUCC_HR(hr, DBCon.Open(DB_PROFILE));
    	if (hr != S_OK) 
    	{
    		m_DataLogger.Log_Info(CCxGUID("b28c6793-ded2-4343-a4cf-9265e45d3e80"), "CStdAPABDlg::Execute() ModulNr: %d DB Fehler", GetModulNr());
    		Cx_ERROR_DB_MSG(hr, DBCon);
    		return hr;
    	}
    	
    	SET_SUCC_HR(hr, Rs.OpenSQL(strSQL));
    	BOOL fEOF = TRUE;
    	SET_SUCC_HR(hr, Rs.GetEOF(fEOF));
    
    	//fEOF = FALSE;
    	if(fEOF)
    	{
    		m_DataLogger.Log_Info(CCxGUID("b28c6793-ded2-4343-a4cf-9265e45d3e80"), "CStdAPABDlg::Execute() ModulNr: %d File not found", GetModulNr());
    		return hr;
    	}
    
    
    	while (!fRet && iRetries < iMaxRetries)
    	{
    		 while (SUCCEEDED(hr) && !fEOF)
    		 {
    
    			SET_SUCC_HR(hr, Rs.GetFieldValue("file_name", FileName));
    			if(DoSave)
    			{
    				CByteArray data;
    				SET_SUCC_HR(hr, Rs.GetFieldValue("binary_data", data));
    				//sTemp = sPath + FileName;
    				sTemp = "C:\\Temp\\" + FileName;
    				CFile file;
    				file.Open(FileName, CFile::modeCreate|CFile:: modeReadWrite);
    				file.Write(data.GetData(),data.GetCount());
    				file.Close();
    			}
    			fRet = TRUE;
    			SET_SUCC_HR(hr, Rs.MoveNext(fEOF));
    		}// while (SUCCEEDED(hr)
    	}// while (!fRet &&
    	
    	SET_SUCC_HR(hr, Rs.Close());
    
    	if (!fRet)
    	{
    		m_DataLogger.Log_Info(CCxGUID("b28c6793-ded2-4343-a4cf-9265e45d3e80"), "CStdAPABDlg::Execute() ModulNr: %d Fehler beim Schreiben der Datei: %s", GetModulNr(), FileName);
    	}// if
    	else
    	{
    		m_DataLogger.Log_Info(CCxGUID("b28c6793-ded2-4343-a4cf-9265e45d3e80"), "CStdAPABDlg::Execute() ModulNr: %d Datei: %s erfolreich übertragen", GetModulNr(), FileName);
    	}// if
    
    	Cx_ERROR_DB_MSG(hr, DBCon);
    
    	return hr;
    }// CStdAPABDlg::Execute
    

    Noch ein wenig Konfus aber es macht was es soll aber speichert eben nicht die Daten in eine Datei.

    Was mache ich fasch????

    Mfg Torsten



  • @Tossi65 sagte in Binärdaten aus SQL Datenbank in eine Datei schreiben:

    ich bin kein c++ Programmiere, muss aber eben solch ein Programm supporten.

    Tja, dumme Idee.

    Was mache ich fasch????

    Du benutzt keinen Debugger?
    Du kübelst hier nicht übersetztbnaren und nicht testbaren Code ab und glaubst, jemand flickt mal eben so zusammen?



  • Guten Morgen Manni66,
    du scheinst ein sehr netter Mensch zu sein.☹
    Ich benutze einen Debugger und der meldet keinen Fehler in dieser Prozedur.
    Es wird allerdings kein File geschrieben. Keine Schutzverletzung, nichts. Im Array stehen Daten drin.
    Nehme ich überhaupt die richtige c++ Funktion , um die Datei zu schreiben? Kann ich mit dieser Funktion überhaupt alle Möglichkeiten von Daten in einer Datei speichern?

    Das würde mir schon weiterhelfen.

    Vielen Dank
    Torsten



  • @Tossi65 sagte in Binärdaten aus SQL Datenbank in eine Datei schreiben:

    Ich benutze einen Debugger und der meldet keinen Fehler in dieser Prozedur.
    Es wird allerdings kein File geschrieben. Keine Schutzverletzung, nichts. Im Array stehen Daten drin.

    Ach, sieh mal einer an, man kann ja doch mehr dazu sagen.

    Nehme ich überhaupt die richtige c++ Funktion , um die Datei zu schreiben? Kann ich mit dieser Funktion überhaupt alle Möglichkeiten von Daten in einer Datei speichern?

    Ich kenne die MFC nicht. Aber man wird dort sicher wie überall sonst testen können, ob eine Datei geöffnet oder etwas geschrieben werden konnte bzw. im Fehlerfall einen Errorcode erhalten, der mehr sagt.



  • @Tossi65 sagte in Binärdaten aus SQL Datenbank in eine Datei schreiben:

    Bei dir ab Zeile 71:

    sTemp = "C:\\Temp\\" + FileName;
    CFile file;
    file.Open(FileName, CFile::modeCreate|CFile:: modeReadWrite);
    

    Hier frage ich mich schon, warum du erst sTemp ermittelst, dann im open aber doch nur FileName verwendest. Du schreibst also womöglich woanders hin, als du denkst.

    Sieh dir auch mal hier an, wie du das open auf Fehler testest (1 Sekunde googlen, da ich MFC auch nicht kenne, liefert die entsprechende Doku):
    https://docs.microsoft.com/de-de/cpp/mfc/reference/cfile-class?view=msvc-160#open



  • Hallo Wob,
    die Variable sTemp war nur ein Test. Hat mich aber nicht weiter gebracht. Ich bin mittlerweile soweit, das die Datei angelegt wird aber ohne Inhalt. Aber Danke für den Link, schau ich mir gleich mal an.

    Die Nuss knacken wir schon.

    Danke



  • Welchen Wert hat denn data.getCount()?
    Und füge mal noch CFile::typeBinary beim file.Open(...)-Aufruf zu den FileMode-Attributen hinzu.


  • Gesperrt

    Dieser Beitrag wurde gelöscht!


  • @CPlusPlusWorld
    Meine Fresse... hast du jemals was Sinnvolles zu sagen? Schon wieder Schrott, aber gleich 100+ Zeilen.


  • Gesperrt

    Ich versuche einen Beitrag zu löschen, kann ihn aber nicht.


  • Gesperrt

    Entschuldigung, falsch geschrieben: P., gelöscht


Anmelden zum Antworten