the proper way of inserting and retrieving odbc data.

From: Bill Shui <wshui(at)cse(dot)unsw(dot)edu(dot)au>
To: pgsql-odbc(at)postgresql(dot)org
Cc: unixodbc-dev(at)easysoft(dot)com
Subject: the proper way of inserting and retrieving odbc data.
Date: 2003-06-02 03:23:54
Message-ID: 20030602132354.E15493@cse.unsw.edu.au
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-odbc

Hi,

I am having difficulty inserting or retrieving data through
unixodbc using postgresql.

I am sure that the config was correct, since I was able to insert
and retrieve data to and from postgresql using other datatypes.

However, when I tried to insert a binary data, and then try to
fetch the data, I could never get it right.

The following is a snippet of the code that do the insertion and deletion.

the table is created using:

create table test1 (id integer primary key, data bytea not null);

bool
EConnection::insert_blob(unsigned int id, const std::string &filename)
{
std::string command("INSERT INTO test1 (id, data) VALUES (?, ?)");

SQLHSTMT sql_stmt; // Handle for a statement
SQLINTEGER b_ind = SQL_NTS,
id_ind = 0,
sql_error = 0;
SQLRETURN res;

res = SQLAllocStmt(sql_conn, &sql_stmt);
if (res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO) {
return false;
}

SQLCHAR data[102400];
FILE *f = fopen(filename.c_str(), "r");
if (!f)
return false;
size_t size = 0;

size = fread(data, 1, 102400, f);
fclose(f);

res = SQLPrepare(sql_stmt,
(SQLCHAR *)(command.c_str()), SQL_NTS);

if (res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO) {
return false;
}

SQLBindParam(sql_stmt, 1, SQL_C_ULONG, SQL_INTEGER, SIZEOF_LONG, 0,
(void *) &id, &id_ind);

SQLBindParam(sql_stmt, 2, SQL_C_BINARY, SQL_BINARY, size, 0,
(void *) data, &b_ind);

res = SQLExecute(sql_stmt);
if (res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO) {
return false;
}

SQLFreeHandle(SQL_HANDLE_STMT, sql_stmt);

return true;
}

When I called this function, it appears to work.

however, when I tried to retrieve the binary data
and store it in a separate file and compare it to the original
data, the diff tells me tha they're different.

bool
EConnection::get_blob(unsigned int id)
{
std::string command("SELECT data from test1 where id = ?");
SQLHSTMT sql_stmt; // Handle for a statement
SQLRETURN res;
SQLINTEGER sql_error = 0, id_ind = 0;

SQLCHAR data[29403];

res = SQLAllocStmt(sql_conn, &sql_stmt);
if (res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO) {
return false;
}

res = SQLPrepare(sql_stmt, (SQLCHAR *) command.c_str(), SQL_NTS);

if (res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO) {
return false;
}

SQLBindParam(sql_stmt, 1, SQL_C_ULONG, SQL_INTEGER, SIZEOF_LONG,
0, (void *) &id, &id_ind);

SQLBindCol(sql_stmt,1,SQL_C_BINARY, data, sizeof(data), &sql_error);

assert(SQLFetch(sql_stmt) != SQL_NO_DATA);
FILE *f = fopen("output.jpg", "w");
fwrite(data, 1, 29403, f);
fclose(f);

SQLFreeHandle(SQL_HANDLE_STMT, sql_stmt);
return true;
}

I'm running out of ideas as to why this is happening. Anyhelp will
be great.

Thanks in advance.

--
Bill Shui

Browse pgsql-odbc by date

  From Date Subject
Next Message Nisha Joseph 2003-06-02 09:22:12 Re: the proper way of inserting and retrieving odbc data.
Previous Message Hiroshi Inoue 2003-06-01 23:52:31 Re: ODBC 07.03.0100 Incorrect mapping of Int8 fields in Access