<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.18.3">
</HEAD>
<BODY>
Hi,<BR>
<BR>
I'm trying unixodbc with mono on ubuntu to call a stored procedure on a DB2 for iseries (as/400):<BR>
<BR>
<BR>
With this code (c#): <BR>
<BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string comandoAS2=&quot;{CALL GIANLUCA.provacs( ? )}&quot;; <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OdbcCommand command2 = conn.CreateCommand(); <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; command2.CommandText= comandoAS2; <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; command2.CommandType=CommandType.StoredProcedure; <BR>
<BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OdbcParameter param1 = command2.Parameters.Add(&quot;@PAR1&quot;, OdbcType.Char, 2); <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; param1.Direction= ParameterDirection.InputOutput; <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; param1.Value=&quot;AA&quot;; <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.Console.WriteLine(&quot;Eseguo:&quot;+comandoAS2); <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; command2.ExecuteNonQuery(); <BR>
<BR>
and this OdbcCommand.Prepare (i've modified the source code of mono System.Data to do debbungin printing only): <BR>
<BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void Prepare() <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.Console.WriteLine(&quot;OdbcCommand.Prepare: begins!&quot;); <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ReAllocStatment (); <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OdbcReturn ret; <BR>
<BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.Console.WriteLine(&quot;OdbcCommand.Prepare: Just before libodbc.SQLPrepare&quot;); <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret = libodbc.SQLPrepare(hstmt, CommandText, CommandText.Length); <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.Console.WriteLine(&quot;OdbcCommand.Prepare: Just after libodbc.SQLPrepare&quot;); <BR>
<BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ((ret!=OdbcReturn.Success) &amp;&amp; (ret!=OdbcReturn.SuccessWithInfo)){ <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.Console.WriteLine(&quot;OdbcCommand.Prepare: Throwing connection.CreateOdbcException&quot;); <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw connection.CreateOdbcException (OdbcHandleType.Stmt, hstmt); <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prepared = true; <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.Console.WriteLine(&quot;OdbcCommand.Prepare: ends!&quot;); <BR>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <BR>
<BR>
when running I get: <BR>
<BR>
siap@LxPC54:~/dwn/src/test$ mono helloODBCCommand.exe <BR>
Hello, Dunkel <BR>
Eseguo:CALL QGPL.WBC022(9)&nbsp;&nbsp;&nbsp;&nbsp; &lt;------ this is another call<BR>
ExecuteNonQuery <BR>
ExecSQL.Parameters.Count:0 <BR>
ExecSQL not prepared || Parameters.Count &gt;0 <BR>
Eseguo:{CALL GIANLUCA.provacs( ? )} <BR>
ExecuteNonQuery <BR>
ExecSQL.Parameters.Count:1 <BR>
Just before Prepare <BR>
OdbcCommand.Prepare: begins! <BR>
OdbcCommand.Prepare: Just before libodbc.SQLPrepare <BR>
OdbcCommand.Prepare: Just after libodbc.SQLPrepare <BR>
OdbcCommand.Prepare: Throwing connection.CreateOdbcException <BR>
System.Data.Odbc.OdbcException: ERROR [42S02] [unixODBC][IBM][iSeries Access ODBC Driver][DB2 UDB]SQL0204 - PROVACS in GIANLUCA di tipo *N non trovato. <BR>
&nbsp; at System.Data.Odbc.OdbcCommand.Prepare () [0x00000] <BR>
&nbsp; at (wrapper remoting-invoke-with-check) System.Data.Odbc.OdbcCommand:Prepare () <BR>
&nbsp; at System.Data.Odbc.OdbcCommand.ExecSQL (System.String sql) [0x00000] <BR>
&nbsp; at System.Data.Odbc.OdbcCommand.ExecuteNonQuery (Boolean freeHandle) [0x00000] <BR>
&nbsp; at System.Data.Odbc.OdbcCommand.ExecuteNonQuery () [0x00000] <BR>
&nbsp; at (wrapper remoting-invoke-with-check) System.Data.Odbc.OdbcCommand:ExecuteNonQuery () <BR>
&nbsp; at helloODBC.Main (System.String[] args) [0x00000] <BR>
<BR>
The message means that libodbc.SQLPrepare searches for a no parameters PROVACS stored procedure, but it has 1!<BR>
<BR>
If I use <BR>
<BR>
string comandoAS2=&quot;{CALL GIANLUCA.provacs( 'AA' )}&quot;; <BR>
<BR>
the program is executed correctly<BR>
<BR>
It seems that libodc.SQLPrepare statement can't say to db2 that there's a paramtere, could you please tell me where's the source of this method in unixodbc source tree?<BR>
<BR>
Many thanks<BR>
<BR>
Best regards.<BR>
<BR>
<BR>
<BR>
<TABLE CELLSPACING="0" CELLPADDING="0" WIDTH="100%">
<TR>
<TD>
<PRE>
-- 
Bartolomeo Nicolotti
SIAP s.r.l.
<A HREF="http://www.siapcn.it">www.siapcn.it</A>
v.S.Albano 13 12049
Trinit&#224;(CN) Italy
ph:+39 0172 652553
centralino: +39 0172 652511
fax: +39 0172 652519
</PRE>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>