Newbee to databases (ODBC)

Started by Malm Paulabout 18 years ago2 messagesgeneral
Jump to latest
#1Malm Paul
paul.malm@saabgroup.com

Hi all,
I'm sorry to bother you with this question, I know it is a C++ ODBC
question. But I'm a bit desperate.
Perhaps I'll be lucky.

I have a table with 2 columns no_char and blobdata were no_char is
number of characters in blobdata. I would like to handle each row from
the result set.

I have got this far:

//Setup selectstatement
strcpy((char*) SQLStmt, "Select no_char, blobdata from tab1");

//Execute the statement
rc = SQLExecDirect(dbConnection.StmtHandle, SQLStmt, SQL_NTS);

//Define what to read out from the selection set
rc =SQLBindCol(StmtHandle, 1 SQL_C_LONG, (SQLPOINTER) &no, sizeOf(no),
NULL);
rc =SQLBindCol(StmtHandle, 2 SQL_C_BINARY, (SQLPOINTER) blob, no, NULL);

// get the values
while(SQLFetch(StmtHandle) != SQL_NO_DATA)
{
...
...
}

But this will not work since I'm using "no" in the second statement to
define the blob size, and no is not set yet.
I could solve it by using 2 different select statemen (once for the size
and one for the blob) but that seems to be a bad solution.

Sorry again!
/Paul

#2Andrei Kovalevski
andyk@commandprompt.com
In reply to: Malm Paul (#1)
Re: Newbee to databases (ODBC)

Hello,

You can use SQLGetData(...) function:

//Setup selectstatement
strcpy((char*) SQLStmt, "Select no_char, blobdata from tab1");

//Execute the statement
rc = SQLExecDirect(dbConnection.StmtHandle, SQLStmt, SQL_NTS);

//Define what to read out from the selection set
rc =SQLBindCol(StmtHandle, 1, SQL_C_LONG, (SQLPOINTER) &no, sizeOf(no),
NULL);
rc =SQLBindCol(StmtHandle, 2 SQL_C_BINARY, (SQLPOINTER) blob, no, NULL);

// get the values
while(SQLFetch(StmtHandle) != SQL_NO_DATA)
{
void* blob = malloc(no);
if (blob)
{
rc = SQLGetData(StmtHandle, 2, SQL_V_BINARY, blob, no, &no);
...
...
free (blob);
}
}

Malm Paul wrote:

Hi all,
I'm sorry to bother you with this question, I know it is a C++ ODBC
question. But I'm a bit desperate.
Perhaps I'll be lucky.

I have a table with 2 columns no_char and blobdata were no_char is
number of characters in blobdata. I would like to handle each row from
the result set.

I have got this far:

//Setup selectstatement
strcpy((char*) SQLStmt, "Select no_char, blobdata from tab1");

//Execute the statement
rc = SQLExecDirect(dbConnection.StmtHandle, SQLStmt, SQL_NTS);

//Define what to read out from the selection set
rc =SQLBindCol(StmtHandle, 1 SQL_C_LONG, (SQLPOINTER) &no, sizeOf(no),
NULL);
rc =SQLBindCol(StmtHandle, 2 SQL_C_BINARY, (SQLPOINTER) blob, no, NULL);

// get the values
while(SQLFetch(StmtHandle) != SQL_NO_DATA)
{
...
...
}

But this will not work since I'm using "no" in the second statement to
define the blob size, and no is not set yet.
I could solve it by using 2 different select statemen (once for the
size and one for the blob) but that seems to be a bad solution.

Sorry again!
/Paul

--
Andrei Kovalevski
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Managed Services, Shared and Dedicated Hosting
Co-Authors: plPHP, ODBCng - http://www.commandprompt.com/