The initialisation of the host variable seems to be okay. Perhaps the param[i].size
does not match the real size of param[i].buf for some i?

For further analysis please send your cpc program and a corresponding precompiler 
trace.

Regards,

Thomas Simenec
SAP Labs Berlin

-----Original Message-----
From: Claus-Thomas Buhl [mailto:[EMAIL PROTECTED]
Sent: Donnerstag, 17. Juli 2003 18:06
To: [EMAIL PROTECTED]
Cc: Simenec, Thomas
Subject: Re: Storing binary data in LONG (BYTE) columns in ESQL/C


Ok, I converted my procedure to use a cursor and fixed allocation and
initialisation for the SQLLongDesc (see below for what I did in detail).
Now my program sometimes crashes in the PUTVAL statement with stack
being:

Program received signal SIGSEGV, Segmentation fault.
0x402421af in memcpy () from /lib/libc.so.6
#1  0x40961793 in pr04LongPutData ()
#2  0x40961fde in pr04LongInsertLongVarchar ()
#3  0x40962616 in pr04LongPutvalData ()
#4  0x409629cd in pr04LongPutvalInput ()
#5  0x4094fa22 in pr01cEnd ()
#6  0x40957832 in pr01SQLExecute ()
#7  0x40954ffb in pr01PrecomExecute ()
#8  0x4094cb98 in sqlCPCExecute ()

I suspect the error in the initialisation of the host variable for the
long column or it may also be a bug:
           
 ldesc->szBuf = param[i].buf;
 ldesc->cbBufMax = param[i].size;
 ldesc->cbBufLen = param[i].size;
 ldesc->cbColLen = param[i].size;

 ha->hostvartype=sqlvlongdesc;
 ha->hostvaraddr=ldesc;
 ha->hostcolsize = sizeof (SQLLongDesc);
 ha->collength = sizeof (SQLLongDesc);


Here my changes in detail:

1. added
     EXEC SQL DECLARE cursupd CURSOR FOR stmtupd;
     if (sqlca.sqlcode!=0){return;}
   between the PREPARE and DESCRIBE statement

2. replaced
     SQLLongDesc *ldesc = (SQLLongDesc *)alloca(sizeof(SQLLongDesc));
   by
     SQLLongDesc *ldesc = (SQLLongDesc *)malloc(sizeof(SQLLongDesc));

3. added
     ldesc->cbColLen = param[i].size;

4. replaced
     EXEC SQL EXECUTE stmtupd USING DESCRIPTOR;
   by
     EXEC SQL OPEN cursupd USING DESCRIPTOR KEEP;
   and

5. replaced 
     EXEC SQL PUTVAL stmtupd USING DESCRIPTOR;
   by
     EXEC SQL PUTVAL cursupd USING DESCRIPTOR;

Regards,

CTB

"Simenec, Thomas" schrieb:
> 
> Hi,
> 
> you have to use a cursor to use long data operations with sqlda.
> 
> E.g. use the following sequence:
> 
>   EXEC SQL PREPARE stmtupd from :stmt;
>   EXEC SQL DECLARE :C1 CURSOR FOR stmtupd;
>   EXEC SQL DESCRIBE stmtupd;
>   EXEC SQL OPEN :C1 USING DESCRIPTOR KEEP;
>   EXEC SQL PUTVAL :C1 USING DESCRIPTOR;
> 
> The keyword KEEP at the end of the OPEN statement keeps the long columns open
> for inserting data by the use of following PUTVALs.
> 
> Regards,
> 
> Thomas Simenec
> SAP Labs Berlin
> 
> -----Original Message-----
> From: Claus-Thomas Buhl [mailto:[EMAIL PROTECTED]
> Sent: Mittwoch, 16. Juli 2003 18:32
> To: [EMAIL PROTECTED]
> Subject: Storing binary data in LONG (BYTE) columns in ESQL/C
> 
> I am using the C/C++ precompiler of SAP DB 7.3.0.34 and want
> to store binary data in LONG (BYTE) columns.
> I have the following ESQL/C code snippet, there are no database errors
> at runtime, but the data isn't stored. What am I doing wrong ?
> 
> int Update (char * sqlstmt, tparam param[], int nparam) {
>   EXEC SQL BEGIN DECLARE SECTION;
>     char * stmt;
>     char stmtupd[8];
>   EXEC SQL END DECLARE SECTION;
>   sqlvartype *ha;
>   int longcols=0;
> 
>   stmt = sqlstmt;
>   EXEC SQL PREPARE stmtupd FROM  :stmt;
>   if (sqlca.sqlcode!=0){return 1;}
> 
>   EXEC SQL DESCRIBE stmtupd;
>   if (sqlca.sqlcode!=0){return 1;}
> 
>   for (i=0;i<nparam;i++){
>     ha = &sqlda.sqlvar[i];
>     if (ha->col.colislong) {
>       SQLLongDesc *ldesc = (SQLLongDesc *)alloca(sizeof(SQLLongDesc));
>       ldesc->szBuf = param[i].buf;
>       ldesc->cbBufMax = param[i].size;
>       ldesc->cbBufLen = param[i].size;
> 
>       ha->hostvartype=sqlvlongdesc;
>       ha->hostvaraddr=ldesc;
>       ha->hostcolsize = sizeof (SQLLongDesc);
>       ha->collength = sizeof (SQLLongDesc);
> 
>       longcols = 1;
>     } else {
>       ...
>     }
>   }
> 
>   EXEC SQL EXECUTE stmtupd USING DESCRIPTOR;
>   if (sqlca.sqlcode!=0 && sqlca.sqlcode!=100) {return 1;}
> 
>   if (longcols) {
>     EXEC SQL PUTVAL stmtupd USING DESCRIPTOR;
>     if (sqlca.sqlcode!=0 && sqlca.sqlcode!=100){return 1;}
>   }
> 
>   return 0;
> }
> 
> Regards,
> 
> CTB
> --
> _______
> \o/|\o/   Claus-Thomas Buhl
>    |      Diplom-Informatiker
> \_____/   mailto:[EMAIL PROTECTED]
> 
> H.E.I. GmbH | Wimpfener Strasse 23 | D-68259 Mannheim
> Fon: +49-(0)621-795141 | Fax: +49-(0)621-795161 | mailto:[EMAIL PROTECTED]
> http://www.h-e-i.de && http://www.hei.biz && http://www.radpage.com
> _______________________________________________
> sapdb.general mailing list
> [EMAIL PROTECTED]
> http://listserv.sap.com/mailman/listinfo/sapdb.general

-- 
_______
\o/|\o/   Claus-Thomas Buhl
   |      Diplom-Informatiker
\_____/   mailto:[EMAIL PROTECTED]

H.E.I. GmbH | Wimpfener Strasse 23 | D-68259 Mannheim
Fon: +49-(0)621-795141 | Fax: +49-(0)621-795161 | mailto:[EMAIL PROTECTED]
http://www.h-e-i.de && http://www.hei.biz && http://www.radpage.com
_______________________________________________
sapdb.general mailing list
[EMAIL PROTECTED]
http://listserv.sap.com/mailman/listinfo/sapdb.general

Reply via email to