Обсуждение: Newbee to databases (ODBC)

Поиск
Список
Период
Сортировка

Newbee to databases (ODBC)

От
"Malm Paul"
Дата:

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

Re: Newbee to databases (ODBC)

От
Andrei Kovalevski
Дата:
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/