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
