From: Sam O'Connor <samoc@netspace.net.au>
To: pgsql-interfaces@postgreSQL.org <pgsql-interfaces@postgreSQL.org>
Subject: type error inserting large obj, Win32 ODBC
Date: Mon, 22 Mar 1999 15:09:18 +1100
Message-ID: <36F5C26E.49702D13@netspace.net.au> (raw)
I'm having a problem getting large objects to work with the IDS ODBC
driver from MS VC++.
I'm Using the MFC CRecordset class to talk to the ODBC driver.
When I try to add a record with a large object stored in a CLongBinary
I get the message below ( see dbms output). If I dont flag the column as
dirty and not NULL, causing the blob to be ignored, the rest of the row
gets updated properly. When I do flag the blob dirty and not NULL then
the driver returns SQL_NEED_DATA in the MFC code and causes
SendLongBinaryData to be called. This sends all the data through then
just before exiting calls SQLParamData again which fails with the error
message.
Below is the error message, the MS code, my setup info and my code.
If anyone can point out what I am doing wrong I would greatly appreciate
it.
If anyone has a completly different better way to do it that would be
just as good.
Some working example code would be best of all.
(If any extra information would be useful I'd be happy to provide it.)
Thanks
Sam O'Connor
---- dbms output ----
ERROR: parser: attribute 'bitmap' is of type 'lo' but expression is of
type 'int4'
You will need to rewrite or cast the expression (1)
---- MS code that is called just before error ----
// Check for another DATA_AT_EXEC
AFX_ODBC_CALL(::SQLParamData(hstmt, &pv));
if (!Check(nRetCode))
{
TRACE0("Error: failure handling long binary value during
update.\n");
ThrowDBException(nRetCode, hstmt);
}
---- environment ----
PostgreSQL ODBMS 6.4.2
MS VC++6.0 (Using MFC CRecordset class to access ODBC) (Win95)
PostgreSQL ODBC driver from IDS version 6.40.0004 1/8/99
Connection options:
No boxes checked, IF version 6.4
Driver options:
Disable Genetic Optimiser
KSQO
Unknown size: Maximum
Text as LongVarChar
Bool as char
cache size: 100
max VarChar: 254
max LongVarChar: 4094
Sys table prefixes: dd_;
---- database setup ----
create type lo (
internallength=4,
externallength=10,
input=int4in,
output=int4out,
default='',
passedbyvalue
);
create table image (
document_id int2,
document_version int2,
image_name text,
bitmap lo,
primary key (document_id, document_version, image_name)
);
---- calling code ----
m_pSet is an uploadDIBSet* (see source below)
CFile file;
file.Open("c:\\test.dib", CFile::modeRead);
m_pSet->AddNew();
m_pSet->m_document_id = 1;
m_pSet->m_document_version = 2;
m_pSet->m_image_name = "Test image name two";
m_pSet->m_bitmap.m_hData = LoadDIBFile (file,
&(m_pSet->m_bitmap.m_dwDataLength));
m_pSet->SetFieldDirty(&(m_pSet->m_bitmap));
m_pSet->SetFieldNull(&(m_pSet->m_bitmap), FALSE);
m_pSet->Update();
---- uploadDIBSet.h ----
class CUploadDIBSet : public CRecordset
{
public:
CUploadDIBSet(CDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CUploadDIBSet)
int m_document_id;
int m_document_version;
CString m_image_name;
CLongBinary m_bitmap;
public:
virtual CString GetDefaultConnect();
virtual CString GetDefaultSQL();
virtual void DoFieldExchange(CFieldExchange* pFX);
};
---- uploadDIBSet.cpp ----
#include "stdafx.h"
#include "uploadDIB.h"
#include "uploadDIBSet.h"
IMPLEMENT_DYNAMIC(CUploadDIBSet, CRecordset)
CUploadDIBSet::CUploadDIBSet(CDatabase* pdb) : CRecordset(pdb) {
m_document_id = 0;
m_document_version = 0;
m_image_name = _T("");
m_nFields = 4;
m_nDefaultType = snapshot;
}
CString CUploadDIBSet::GetDefaultConnect() {
return _T("ODBC;DSN=");
}
--
Sam O'Connor, Melbourne Australia
mail: Sam@OConnor.net
web: Sam.OConnor.net
--
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-interfaces@postgresql.org
Cc: samoc@netspace.net.au
Subject: Re: type error inserting large obj, Win32 ODBC
In-Reply-To: <36F5C26E.49702D13@netspace.net.au>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox