[unixODBC-dev] Calling a store procedure

Martin J. Evans bohica at ntlworld.com
Thu Feb 23 09:12:42 GMT 2012


On 23/02/2012 03:05, Jaime Stuardo wrote:
> Hello… I am trying to call a SQL Server 2005 stored procedure by mean of
> a C++ application running under RedHat Linux. unixODBC is installed
> correctly since I can connect to the database.
>
> When I run SQLExecDirect, the returned value is an error. So, here are
> the questions:
>
> ·Why does an error occur?
>
> ·Why does the SQLGetDiagRec function cannot return the actual error? If
> I generate an error passing a string instead of a date in the second
> parameter, the error is: [FreeTDS][SQL Server]Error converting data type
> varchar to datetime. That means ExtractError function I implemented is
> correct.
>
> This is the code with SQLExecDirect:
>
>      ret = SQLExecDirect(stmt, (SQLCHAR *) query.c_str(), SQL_NTS);
>
>      if (!SQL_SUCCEEDED(ret)) {
>
>          StoreSocket::ExtractError("SQLExecDirect", stmt, SQL_HANDLE_STMT);
>
>          return false;
>
>      }
>
> Where query is:
>
> execute usp_contrato_actualiza_aclaracion 'uno', '2012-02-22', 'dos',
> 'tres', 'cuatro', '2012-02-14', 'cinco', 'seis', 'siete', 'ocho',
> 'nueve', 'diez', 'once'
>
> And the body of ExtractError is:
>
> **************************
>
> void StoreSocket::ExtractError(
>
>          char *fn,
>
>          SQLHANDLE handle,
>
>          SQLSMALLINT type) {
>
>      SQLINTEGER i = 0;
>
>      SQLINTEGER native;
>
>      SQLCHAR state[ 7 ];
>
>      SQLCHAR text[256];
>
>      SQLSMALLINT len;
>
>      SQLRETURN ret;
>
>      do {
>
>          ret = SQLGetDiagRec(type, handle, ++i, state, &native, text,
>
>                  sizeof (text), &len);
>
>          if (SQL_SUCCEEDED(ret)) {
>
>              printf("%s:%ld:%ld:%s\n", state, i, native, text);
>
>          }
>
>      } while (ret == SQL_SUCCESS);
>
> }
>
> **************************
>
> Any help will be greatly appreciated,
>

In my experience freeTDS sometimes returns an error and then there are 
no diagnostics. I added a special case to Perl's DBD::ODBC because of it 
which raises an error when an ODBC call fails and there are no diagnostics.

Martin



More information about the unixODBC-dev mailing list