Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 435
  • Last Modified:

CDaoRecordSet and CByteArray HELP!

VCPP 5.0 Win95
I am trying to store and retrieve a CByteArray to my DaoRecordset and not succeeding. To write the data I am doing the following:
BYTE abyteTemp[MAX];
CByteArray array ;
CDaoRecordset rs (&m_db);
char szQuery[256];
sprintf(szQuery,"SELECT * FROM MyTable");
rs.Open(dbOpenDynaset,szQuery);
rs.SetBookmark(rs.GetLastModifiedBookmark());
rs.AddNew();

array.SetSize( m_nSizeOfData ) ;
for (INT n=0;n<m_nSizeOfData;++n)
array.Add(abyteTemp[n]) ;

COleVariant v(array) ;
rs.SetFieldValue("Data0", v);
rs.Update();

After I execute this code, I can open my database table with Access and see that there is data written to the proper dbLongBinary field.  The field reads. “Long binary data”.  I am not sure if the proper data has been written to the field because if I try and View the data, Access will not let me.  

For reading the databastable, I execute:

char szQuery[256];
CByteArray array ;
BYTE abyteTemp[MAX] ;

CDaoRecordset rs ( &m_db ) ;
sprintf( szQuery, "SELECT * FROM MyTable" ) ;
rs.Open( dbOpenDynaset,szQuery ) ;
if ( !rs.IsEOF( ) )
rs.MoveFirst( );

while( !rs.IsEOF( ) ) {
array.SetSize(m_nSizeOfData) ;

COleVariant v( array ) ;
rs.GetFieldValue( "Data0",v) ;

for (INT n=0;n<m_nSizeOfData;++n)
abyteTemp[n]=array.GetAt(n) ;

rs.MoveNext( ) ;
}

After writing and reading to the database I get garbage values in my CByteArray.  All suggestions welcome and code fragments greatly appreciated!
0
Surfer
Asked:
Surfer
  • 3
1 Solution
 
SurferAuthor Commented:
Edited text of question
0
 
SurferAuthor Commented:
Adjusted points to 200
0
 
piano_boxerCommented:
I can not make the method you are using work, but here's a way that will work:

Instead of just use a generic CDaoRecordset, derive a new class from
CDaoRecordset (CMySet) using ClassWizard, and bind to the fields in your database table (MyTable).
Bind the field Data0 as a CByteArray called m_rgData0 (it defaults to CLongBinary so remember to change it).

Writing:
   
    // Open recordset
    CMySet rs(&m_db);
    rs.Open(dbOpenDynaset);
   
    // Add new record
    rs.AddNew();
    rs.m_rgData0.SetSize( m_nSizeOfData );
    memcpy( &rs.m_rgData0[0], &abyteTemp[0], m_nSizeOfData );

    // Mark field as having a value and dirty.
    rs.SetFieldNull( &rs.m_rgData0, FALSE );
    rs.SetFieldDirty( &rs.m_rgData0, TRUE );

    // Store record and close recordset
    rs.Update();
    rs.Close();


Reading:

    // Open recordset
    CMySet rs(&m_db);
    rs.Open(dbOpenDynaset);

    // Now recordset is opened and placed on first record.
    // Loop through all records
   
    while( !rs.IsEOF() )
    {
        ASSERT(rs.m_rgData0.GetSize() != 0);

        memcpy( &abyteTemp[0], &rs.m_rgData0[0], rs.m_rgData0.GetSize() );

        // NOTE: call rs.m_rgData0.GetSize() to get size of data
        //       stored in database

        //
        // Now data from 1 record has been copied to abyteTemp
        // Do something with it!
        //

        // Move on to next record
        rs.MoveNext();
    }

    // Close recordset
    rs.Close();


Please note that you should surround these calls with try/catch to catch
errors.
0
 
SurferAuthor Commented:
Your answer was right on the mark!  Thank you very much.
0

Featured Post

[Webinar] Cloud and Mobile-First Strategy

Maybe you’ve fully adopted the cloud since the beginning. Or maybe you started with on-prem resources but are pursuing a “cloud and mobile first” strategy. Getting to that end state has its challenges. Discover how to build out a 100% cloud and mobile IT strategy in this webinar.

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now