Recordset Binären wert speichern.



  • Hallo,
    ich habe eine Datenbank über MS-Access erstellt. die entsprechende Spalte um die es geht auf MEMO gesetzt. Es lassen sich alle werte (spalte MEMO auch) auslesen und einwandfrei anzeigen.
    Es werden mir auch alle werte gespeichert, bis auf die Spalte MEMO. Ich brauch aber diese Spalte!!!
    Stell ich die Spalte vom MEMO auf VARCHAR(255), werden mir dort wieder die werte eingetragen. Allerdings brauch ich mehr als 255 Zeichen.

    Ich habe versucht mir die Zeichenfolgen Werte über CDBVariant::m_pbinary beim einlesen der Datenbank sowie beim speichern der Datenbank anzeigen zu lassen und in der Variable CDBVariant::m_pbinary steht jeweils der korrekte Wert. Aber in der DB steht letzten endes nichts.

    Ich hab mich jetzt schon einige zeit im netz umgeschaut, aber nichts wirklich brauchbares gefunden, das mir weiterhelfen könnte. Weis hier jemand den weg wie man das bewerkstelligt? Fehlen da noch ein paar einstellungen in der DB?

    anbei hab ich hier noch den codeschnipsel wie ich CDBVariant::m_pbinary mit werten befülle.

    void CDBVariantEx::StringToBinary(CString& cStr, CLongBinary& bin, bool bExpand )const
    {
    	int	nSize = min( (int)bin.m_dwDataLength, cStr.GetLength() );
    	if( bExpand )
    		nSize = cStr.GetLength();
    
    	if( nSize < 1 ) {
    		memset((LPVOID)&bin,0,sizeof(CLongBinary));
    		return;
    	}
    	LPTSTR lpszBuff = cStr.LockBuffer();
    	bin.m_dwDataLength = nSize+1;
    
    	void*	p = ::GlobalLock( bin.m_hData );
    	if( p == NULL )
    		::AfxThrowMemoryException();
    
    	memset(p,0,nSize+1);
    	memcpy(p,lpszBuff,nSize);
    
    	cStr.UnlockBuffer();
    	::GlobalUnlock( bin.m_hData );
    
    }
    

  • Mod

    Und warum bindest Du die Memo Spalte nicht einfach diekt an das CString?



  • Hallo Martin,

    weil die Zeichenfolge aus einer std::map<int,string> stammt und erst zusammen gestellt wird. bevor dann daraus der binäre wert wird.

    kann dir aber im moment nicht ganz folgen. was meinst du mir direkt daran binden.



  • hab das problem gelöst,
    danke martin für den Tip... 👍

    der fehler lag einfach darin, das ich in meiner RecordSet Klasse in der Funktion DoFieldExchange( CFieldExchange* pFX ) nach dem Typenwert der Spalte gefragt habe. Die Spalteneinstellung (MEMO) in der Datenbank gibt anscheindend den Typenwert DBVT_BINARY zurück. da ich unter diesem Type mit RFX_LongBinary gearbeitet habe, kam es zu dem oben beschriebenen Problem.

    nachdem ich mich ein wenig durch die msdn gelesen habe und ätlichen versuchen später hab ich das problem dann wie folgt gelöst...

    void CRecSet::DoFieldExchange(CFieldExchange* pFX)
    {
    
    	// m_Note_ = Editfeld bzw. CString Variable
    	int iLen = m_Note_.GetLength();
    
    	if(!iLen)iLen = 32767;
    
    	pFX->SetFieldType(CFieldExchange::outputColumn);
    
     	//Angabe der Länge (iLen) der zu speichernden Zeichenfolge und Spaltentype (SQL_LONGVARCHAR) ist ausschlaggebend
    	RFX_Text(pFX, _T("[Note]"), m_Note_, iLen,SQL_LONGVARCHAR);
    
    //	RFX_LongBinary(pFX,_T("[Note]"), m_LongBin);
    
    }
    

Log in to reply