• 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?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

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
aderounmAuthor Commented:
Please include a technical reference so I can know where to look for info. Thanks.
0
Simplify Active Directory Administration

Administration of Active Directory does not have to be hard.  Too often what should be a simple task is made more difficult than it needs to be.The solution?  Hyena from SystemTools Software.  With ease-of-use as well as powerful importing and bulk updating capabilities.

aderounmAuthor Commented:
Adjusted points to 130
0
cwestinCommented:
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

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
aderounmAuthor Commented:
Thanks a million!
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C

From novice to tech pro — start learning today.