[unixODBC-support] inputOutput parameter problem in calling stored Procedure
Martin Evans
martin.evans at easysoft.com
Tue Feb 17 09:10:12 GMT 2009
Bartolomeo Nicolotti wrote:
> Hi,
>
> yeeeees, you were really right! It was this
>
> The only thing I see that looks wrong is the call to SQLBindParameter
> where you are passing SQL_NTS as the length but SQL_NTS is not a
> SQLLEN*. I think that should be:
>
> SQLLEN param_length;
> param_length = SQL_NTS;
>
> now it works!!!!
>
> bart at LxPC37:~/download/software/mono/src/test$ ./helloODBCPrep Dunkel siapbn
> ********
> Here1!!
> Here2!!
> Here2!!
> KU INFOTECH siap
> Success!
>
>
> Now I'm going to try with the stored procedure...
>
> many thanks
>
> best regards
>
Just a couple more things I don't recollect you telling us yet. Is this
a 64 bit platform? Have you overloaded your procedure?
Martin
--
Martin J. Evans
Easysoft Limited
http://www.easysoft.com
> Martin Evans-4 wrote:
>> Bartolomeo Nicolotti wrote:
>>> Sorry, but I'm also getting lost in this task of using unixodbc to
>>> accesse
>>> iseries db2. I'd really hope to be able to do prepared statemts with IBM
>>> driver for linux and ODBC. Otherwise I'll have to install Visual Studio
>>> and
>>> Windows.
>>>
>>> To understand where's the problem I wanted to try with plain C program.
>>> In the previous message I attached an helloODBC.c C program taken from
>>> IBM
>>> red book
>>>
>>> http://www.redbooks.ibm.com/abstracts/sg246551.html
>>>
>>> It works, doing the select
>>>
>>> SELECT * FROM VIAGGIFAM.PWKCXM WHERE WKXSCX='KU'
>>>
>>> which as you can see is has no parameters, and the method used is
>>>
>>> /* Do query */
>>> if ((sqe = SQLExecDirect (statement, querystring, SQL_NTS)))
>>> die ("exec direct", sqe);
>>>
>>> and it fetches the results with no errors.
>>>
>>> Then I saved the C source with a new name
>>> http://www.nabble.com/file/p22052714/helloODBCPrep.c helloODBCPrep.c and
>>> modified it to use a prepared statement to do the same select, i.e.
>>>
>>> SELECT * FROM VIAGGIFAM.PWKCXM WHERE WKXSCX=?
>>>
>>> with the parameter value set with
>>> ...
>>> char param1[10]= "KU";
>>> ...
>>> if( sqe= SQLBindParameter(
>>> /*SQLHSTMT StatementHandle*/ statement,
>>> /*SQLUSMALLINT ParameterNumber*/ 1,
>>> /*SQLSMALLINT InputOutputType*/ SQL_PARAM_INPUT,
>>> /*SQLSMALLINT ValueType*/ SQL_C_CHAR,
>>> /*SQLSMALLINT ParameterType*/ SQL_CHAR,
>>> /*SQLULEN ColumnSize*/ 50,
>>> /*SQLSMALLINT DecimalDigits*/ 0,
>>> /*SQLPOINTER ParameterValuePtr*/ param1,
>>> /*SQLINTEGER BufferLength*/ 0,
>>> /*SQLLEN * StrLen_or_IndPtr*/ SQL_NTS)){
>>> die ("bind:", sqe);
>>> }
>>>
>>> This new program has a segmentation fault in SQLExecute, as I can see
>>> from
>>> unixodbc log
>>>
>>> bart at LxPC37:~/download/software/mono/src/test$ ./helloODBCPrep Dunkel
>>> siapbn
>>> *******
>>> Here1!!
>>> Here2!!
>>> Segmentation fault
>>>
>>> I've switched on unixodbc log and I got:
>>>
>>> <pre>
>>>
>>> ODBC14289http://SQLPrepare.c189
>>> Entry:
>>> Statement = 0x80690e0
>>> SQL = http://SELECT * FROM VIAGGIFAM.PWKCXM WHERE WKXSCX=?length = 45
>>> (SQL_NTS)
>>> ODBC14289http://SQLPrepare.c364
>>> Exit:SQL_SUCCESS
>>> ODBC14289http://SQLBindParameter.c193
>>> Entry:
>>> Statement = 0x80690e0
>>> Param Number = 1
>>> Param Type = 1
>>> C Type = 1 SQL_C_CHAR
>>> SQL Type = 1 SQL_CHAR
>>> Col Def = 2
>>> Scale = 0
>>> Rgb Value = 0x80491ae
>>> Value Max = 2
>>> StrLen Or Ind = 0xfffffffd
>>> ODBC14289http://SQLBindParameter.c339
>>> Exit:SQL_SUCCESS
>>> ODBC14289http://SQLExecute.c183
>>> Entry:
>>> Statement = 0x80690e0
>>>
>>>
>>> I think that there's something missing as I couldn't think that the
>>> driver
>>> is not able to do prepared statements, because we use prepared statements
>>> with no proble from java/jdbc both for sql statement and stored
>>> procedures.
>> No one is saying the driver cannot do prepare statements but just
>> because something works in JDBC does not mean it will work in ODBC -
>> they are 2 totally different drivers.
>>
>>> If I can understand why i got a segmentation fault in SQLExecute maybe I
>>> can
>>> find a solution.
>>>
>>> If you can give any help it would be really appreciated
>>>
>>> many thanks
>>>
>>> Best regards
>> The only thing I see that looks wrong is the call to SQLBindParameter
>> where you are passing SQL_NTS as the length but SQL_NTS is not a
>> SQLLEN*. I think that should be:
>>
>> SQLLEN param_length;
>> param_length = SQL_NTS;
>>
>> if( sqe= SQLBindParameter(
>> /*SQLHSTMT StatementHandle*/ statement,
>> /*SQLUSMALLINT ParameterNumber*/ 1,
>> /*SQLSMALLINT InputOutputType*/ SQL_PARAM_INPUT,
>> /*SQLSMALLINT ValueType*/ SQL_C_CHAR,
>> /*SQLSMALLINT ParameterType*/ SQL_CHAR,
>> /*SQLULEN ColumnSize*/ 50,
>> /*SQLSMALLINT DecimalDigits*/ 0,
>> /*SQLPOINTER ParameterValuePtr*/ param1,
>> /*SQLINTEGER BufferLength*/ 0,
>> /*SQLLEN * StrLen_or_IndPtr*/ ¶m_length)){
>> die ("bind:", sqe);
>> }
>>
>> IIRC, SQL_NTS is -3 so passing SQL_NTS as the last argument to
>> SQLBindParameter would cause the driver to read address -3 which could
>> cause a problem.
>>
>> Martin
>> --
>> Martin J. Evans
>> Easysoft Limited
>> http://www.easysoft.com
>> _______________________________________________
>> unixODBC-support mailing list
>> unixODBC-support at mailman.unixodbc.org
>> http://mailman.unixodbc.org/mailman/listinfo/unixodbc-support
>>
>>
>
More information about the unixODBC-support
mailing list