• C

Saving user defined variables as objects in databases

Is it possible to read and write a user defined struct variable into a DB2, Oracle, or Informix database (or any other database) as a single object?  I want to save structs which contain arrays, for example,


struct MyStruct
{
int firstmember[100]
char secondmember[200]
.....
}


I want to read and write whole structs to the database fields without breaking them down into individual data members. Please refer me to a source of technical info.
Thanks!



aderounmAsked:
Who is Participating?
 
cwestinConnect With a Mentor Commented:
The answer is yes, you can write a struct there.  As someone else commented above, you will have to save the structure to a binary data type.  I'm familiar with Oracle, so I'll describe that here.  You can look up more detailed information in the Oracle OCI (Oracle Call Interface) manual, sometimes also known as the HLI (High-Level Interface.)  The manual contains descriptions of the Oracle API for several languages, so be sure to look in the C section.

Essentially, you have to bind (for input) your struct as a LONG RAW datatype (in oradefs.h, SQLT_BIN).  You will do this bind using one of obndra() or its relatives (see the OCI manual.)  To get the data out, you will define output space using ocidfn() using the same type (SQLT_BIN).  For the size of the data, use sizeof(yourstruct).  In both cases, binding and defining, you have to provide the address of the struct.

Note that if you do this, the data is stored in a binary form that Oracle cannot interpret, so you can only store and retrieve the data; you will not be able to query against its content.  You will have to create some table that has another key you plan to use, e.g., "create table foo(your_key char(100), your_data long raw(500))".

You should use the LONG RAW datatype so that Oracle does not try to do character set conversions on the data.  Also note that the data is stored as its binary image looks in memory according to the compiler you are using.  You may not be able to retrieve and use this data on another platform other than the one that your wrote it from, because the structure contents (offsets) may be different on another platform.

0
 
davidfCommented:
I don't have any technical references to give you but I think I can steer you in the right direction...

Look into what sort of support your DB has for BLOB fields (Binary Large OBjects).  Without support for binary data you won't be able to store C structures in your DB.
0
 
jfbeCommented:

 Personally I know little about Oracle and DB2 since I've use
 codebase (dbase compatible) btrieve, ctree or other kinds of
 DB softwares. However some princips are identicals: you need
 to have a field that accept binary codes, special codes that
 are not a well known letter and this was the case of a char
 field in codebase as far I can remember. I've an oracle book  with me (old however) and it seems that a long datatype for a
 field can be as large as 65,536 characters, so enough to store
 a struct. You can use also a random access file in pure C
 that you create yourself if you have compatibility problems to
 cast binary numbers  into a numerical field, but normally it  should work with oracle. all you need is to cast your structure
(ex: in a specific database you'd write

write( (char *) &Mystruct)

 rather than write(MY_array_of_chars)

 and to retrieve it you cast the same way: x=(Mystruct *)read();

 These are arbitrary api's, depend of the database you use, you can replace read and write in such a case. The only thing you
have to do is to cast your structure and make a call by reference.
0
Making Bulk Changes to Active Directory

Watch this video to see how easy it is to make mass changes to Active Directory from an external text file without using complicated scripts.

 
aderounmAuthor Commented:
Please include a technical reference so I can know where to look for info. Thanks.
0
 
aderounmAuthor Commented:
Adjusted points to 130
0
 
aderounmAuthor Commented:
Thanks a million!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.