Brian,

If you summarize/resend the patches, preferably with documentation and
patches to the tests to validate the patches, I would be likely to put
them in at least the subversion repository and roll out a proper patch
if things look good.

Jeff
 

> -----Original Message-----
> From: Brian Becker [mailto:[EMAIL PROTECTED] 
> Sent: Wednesday, September 28, 2005 11:33 AM
> To: Martin J. Evans; Lee Anne Lester
> Cc: dbi-users@perl.org
> Subject: RE: Numeric value out of range error
> 
> Sorry you were missing the outcome on that whole issue.  We 
> decided to take off the odbc_default_bind_type that we had 
> set to 12 and returned it back to 0 to let the DBD do the 
> SQLDescribeParam as it was designed.
> We also applied the patch that you sent previously which does 
> address the issue.  
> 
> The issue with dates is just that it has to be in the 
> specific format (is 9075) which is a problem for us but 
> unrelated to the issue at hand...we are simply describing it 
> as varchar and letting the database figure it out on its own. 
>  This is however why we are describing our own params.
> 
> The SQL Describe param ordinal thing has to do with Stored 
> procedure calls for SQL Server.  The order your proc defines 
> it attributes is the order they are described in so for example
> 
> Create procedure someproc as
> Field1 as int
> Field2 as varchar
> ...
> 
> If you try and call someproc @Field2=?, @Field1=? -- the 
> fields are described incorreclty by SQLDescribeParam (Field2 
> as int and Field1 as varchar). This seems odd as they were 
> given the attribute names so you would think it could be 
> matched up by name -- but it simply does it by position.  
> This was confirmed with Microsoft.
> 
> So to bring us back we have applied both patches -- the 
> Isnull from a while back and this most recent one.  Both were 
> described as "hacks" and we are concerned putting these into 
> production not knowing if these will make it into the next 
> version or if we will need to re-apply these "hacks" to the 
> code and risk it breaking something else in the newer 
> versions (some variable changes name or new condition block 
> is added or who knows what else).  
> 
> Hope that cleared things up.
> 
> Brian Becker
> Jaeb Center for Health Research
> 15310 Amberly Drive
> Suite 350
> Tampa, FL 33647
> tel: 813-975-8690
> fax: 813-975-8761
> email: [EMAIL PROTECTED]
> http://www.jaeb.org
> 
> 
> 
> -----Original Message-----
> From: Martin J. Evans [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, September 28, 2005 11:03 AM
> To: Lee Anne Lester
> Cc: dbi-users@perl.org
> Subject: RE: Numeric value out of range error
> 
> 
> On 28-Sep-2005 Lee Anne Lester wrote:
> > Thanks for the suggestions.  Because of issues with date formats and
> > also the fact that SQLDescribeParam is based on ordinal position and
> not
> > name, the default binding behavior will not always work for 
> us.  Also,
> > we are trying to avoid having everything default to varchar.
> 
> I am tempted to ask what the issues you refer to are. The only one I
> know
> about is the NULL issue Brian Becker reported in July - for which I
> posted a
> patch for DBD::ODBC to this group.
> 
> Brian did seem to indicate at the time you were setting
> odbc_default_bind_type
> - which also prevents DBD::ODBC from calling SQLDescribeParam.
> 
> > Is it
> > possible the patch you are suggesting will be implemented 
> in a future
> > release of the DBD::ODBC module?
> 
> You can always lobby Jeff and he will probably lobby me for a proper
> patch.
> But there is the previous patch (I refer to above) as well and I think
> that
> didn't end up anywhere because after presenting the problem and a fix
> being
> provided, odbc_default_bind_type was introduced.
> 
> Martin
> --
> Martin J. Evans
> Easysoft Ltd, UK
> Development
> 
> 
> > Lee Anne
> > 
> > -----Original Message-----
> > From: Martin J. Evans [mailto:[EMAIL PROTECTED] 
> > Sent: Wednesday, September 28, 2005 5:18 AM
> > To: Lee Anne Lester
> > Cc: dbi-users@perl.org
> > Subject: RE: Numeric value out of range error
> > 
> > On 27-Sep-2005 Lee Anne Lester wrote:
> >> I am getting a "Numeric value out of range error" when 
> specifically 
> >> binding a placeholder for a decimal column as a decimal type. I'm 
> >> using DBD::ODBC connecting to Microsoft SQL Server from a Solaris
> > machine.
> >> The value being bound is 10.00.  The settings in database are
> > precision
> >> 5 and a scale 2.   I have found that I don't get the error 
> as long as
> >> there are no numbers to the left of the decimal.  Example:  A value
> of
> >> .5 works.
> >> 
> >> Can anyone advise how to make this work?  Is there a way to define
> the
> > 
> >> precision and scale when calling bind_param?
> >> 
> >> Thanks in advance for any help.
> >> 
> >> Lee Anne Lester
> >> 
> >> 
> > SQL> create table jaeb (FieldDecimal numeric(5,2)) insert into jaeb 
> > SQL> values ('10.00') insert into jaeb values (10.00) select * from
> jaeb
> > +-------------+
> >| FieldDecimal|
> > +-------------+
> >| 10.00       |
> >| 10.00       |
> > +-------------+
> > SQLRowCount returns 2
> > 2 rows fetched
> > 
> > So you can insert without binding OK but as you say:
> > 
> >#!/usr/local/bin/perl -w
> > use DBI;
> > my $dbh = DBI->connect('dbi:ODBC:test', 'Martin_Evans', 'easysoft');
> my
> > $sql = q/insert into jaeb values (?)/; my $sth = 
> $dbh->prepare($sql);
> > $sth->bind_param(1, 10.00, {TYPE=>3}); $sth->execute();
> > 
> > fails.
> > 
> > Changing the bind_param to remove the forcing the type to 
> SQL_NUMERIC
> > 
> > $sth->bind_param(1, 10.00);
> > 
> > appears to insert correctly but a string "10" is still 
> passed in (I'd
> > presume this is because 10.00 is converted to "10").
> > Passing 10.98 also works correctly. In these cases the parameter is
> > bound as SQL_C_CHAR, SQL_VARCHAR.
> > 
> > The actual problem appears to be:
> > 
> > 
> SQLBindParameter(0x8258ea0,1,1(Input::),1,3,5,5,0x82580f0,5,0x82580d0)
> > 
> > i.e. bind parameter 1 as input, ValueType=SQL_C_CHAR,
> > ParameterType=SQL_NUMERIC, ColumnSize=5, DecimalDigits=5. This
> instructs
> > MS SQL Server to convert your SQL_C_CHAR string into a numeric 5,5
> > before inserting - this will not fit.
> > 
> > Interestingly, your trace shows "cbColDef=2, scale=2," and I cannot
> > reproduce this.
> > 
> > The problem is that you are saying this parameter must be a
> SQL_NUMERIC
> > but there is no way to specify a scale and DBD::ODBC does not use
> > SQLDescribeParam when you force a bind type.
> > 
> > This could be changed to work but it is not a 5 minute job to do
> > properly. The patch (to _dbd_rebind_ph) below makes it work 
> but it is
> a
> > bit of a hack:
> > 
> >          case SQL_TIME:
> >          case SQL_TYPE_TIME:
> >             /* fSqlType = SQL_VARCHAR;*/
> >             break;
> > +         case SQL_NUMERIC:
> > +         case SQL_DECIMAL:
> > +          
> > +              if (phs->sv_buf && *phs->sv_buf) {
> > +                   char *cp;
> > +                 cp = strchr(phs->sv_buf, '.');
> > +                 if (cp) {
> > +                      ibScale = 0;
> > +                      cp++;
> > +                      while (*cp != '\0' && isdigit(*cp)) {
> > +                          cp++;
> > +                          ibScale++;
> > +                      }
> > +                 }
> > +               }
> > +            break;
> >          case SQL_TIMESTAMP:
> >          case SQL_TYPE_TIMESTAMP:
> > 
> > 
> > Why not just pass your parameters in as strings and leave the
> parameter
> > type off the bind call.
> > 
> > Martin
> > --
> > Martin J. Evans
> > Easysoft Ltd, UK
> > Development
> > 
> > 
> >> SAMPLE CODE
> >> =============
> >>#!/usr/local/bin/perl -Tw
> >> 
> >> use strict;
> >> use DBI;
> >> 
> >> my $dsn = "dbi:ODBC:dsn_IRB";
> >> 
> >> our $dbh = DBI->connect($dsn, '', '', {AutoCommit=>0, 
> RaiseError=>1, 
> >> FetchHashKeyName=>'NAME_uc'});
> >> 
> >> unlink('dbitrace.log') if(-e 'dbitrace.log');
> >> 
> >> DBI->trace(9, 'dbitrace.log');
> >> 
> >> my $sth = $dbh->prepare(q{INSERT INTO tblDecimalTest 
> (FieldDecimal) 
> >> VALUES (?)});
> >> 
> >> $sth->bind_param(1, 10.00, {TYPE=>3} );
> >> 
> >> $sth->execute();
> >> 
> >> $sth->finish;
> >> 
> >> $dbh->commit;
> >> 
> >> $dbh->disconnect;
> >> ~
> >> 
> >> 
> >> 
> >> VERSIONS
> >> =========
> >> 
> >> Microsoft SQL Server  2000 - 8.00.2039 (Intel X86) 
> >>       May  3 2005 23:18:38 
> >>       Copyright (c) 1988-2003 Microsoft Corporation
> >>       Standard Edition on Windows NT 5.0 (Build 2195: 
> Service Pack 4)
> >> 
> >> unixODBC version: 2.2.7 using EasySoft ODBC bridge
> >> 
> >> Perl Version = 5.008007
> >> DBI Version = 1.48
> >> DBD::ODBC Version = 1.13
> >> 
> >> 
> >> OUTPUT FROM TRACE - LEVEL 9
> >> ============================
> >>     DBI 1.48-nothread default trace level set to 0x0/9 (pid 5169)
> >>     >> prepare     DISPATCH (DBI::db=HASH(0x25300c) rc1/1 @2 g0
> > ima2201
> >> pid#5169) at ./insert.pl line 14
> >>     -> prepare for DBD::ODBC::db (DBI::db=HASH(0x25300c)~0x260a18 
> >> 'INSERT INTO tblDecimalTest (FieldDecimal) VALUES (?)')
> >>     New DBI::st (for DBD::ODBC::st, parent=DBI::db=HASH(0x260a18),
> > id=)
> >>     
> dbih_setup_handle(DBI::st=HASH(0x260b20)=>DBI::st=HASH(0x1b9d48),
> >> DBD::ODBC::st, 260b2c, Null!)
> >>     dbih_make_com(DBI::db=HASH(0x260a18), 136f30, 
> DBD::ODBC::st, 212,
> 
> >> 0) thr#0
> >>     dbih_setup_attrib(DBI::st=HASH(0x1b9d48), Err,
> >> DBI::db=HASH(0x260a18)) SCALAR(0x1face0) (already defined)
> >>     dbih_setup_attrib(DBI::st=HASH(0x1b9d48), State,
> >> DBI::db=HASH(0x260a18)) SCALAR(0x1fad40) (already defined)
> >>     dbih_setup_attrib(DBI::st=HASH(0x1b9d48), Errstr,
> >> DBI::db=HASH(0x260a18)) SCALAR(0x1fad10) (already defined)
> >>     dbih_setup_attrib(DBI::st=HASH(0x1b9d48), TraceLevel,
> >> DBI::db=HASH(0x260a18)) 0 (already defined)
> >>     dbih_setup_attrib(DBI::st=HASH(0x1b9d48), FetchHashKeyName,
> >> DBI::db=HASH(0x260a18)) 'NAME_uc' (already defined)
> >>     dbih_setup_attrib(DBI::st=HASH(0x1b9d48), HandleSetErr,
> >> DBI::db=HASH(0x260a18)) undef (not defined)
> >>     dbih_setup_attrib(DBI::st=HASH(0x1b9d48), HandleError,
> >> DBI::db=HASH(0x260a18)) undef (not defined)
> >>     initializing sth query timeout to 0
> >>     ignore named placeholders = 0
> >>     dbd_preparse scanned 1 distinct placeholders
> >>     SQLPrepare returned 0
> >> 
> >>     dbd_st_prepare'd sql f2787256, ExecDirect=0
> >>       INSERT INTO tblDecimalTest (FieldDecimal) VALUES (?)
> >>     <- prepare= DBI::st=HASH(0x260b20) at ./insert.pl line 14
> >>     >> bind_param  DISPATCH (DBI::st=HASH(0x260b20) rc1/1 
> @4 g0 ima1
> >> pid#5169) at ./insert.pl line 16
> >>     -> bind_param for DBD::ODBC::st 
> (DBI::st=HASH(0x260b20)~0x1b9d48
> 1
> > 
> >> 10 HASH(0x1209b8)) bind 1 <== '10' (attribs: 
> HASH(0x1209b8)), type 3
> >>     <- bind_param= 1 at ./insert.pl line 16
> >>     >> execute     DISPATCH (DBI::st=HASH(0x260b20) rc1/1 @1 g0
> > ima1041
> >> pid#5169) at ./insert.pl line 18
> >>     -> execute for DBD::ODBC::st (DBI::st=HASH(0x260b20)~0x1b9d48)
> >>     dbd_st_execute (outparams = 0)...
> >> bind 1 <== 10 (size 2/3/0, ptype 6, otype 1, sqltype 3) bind 1 <== 
> >> '10' (len 2/2, null 0)
> >>     bind 1: CTy=1, STy=DECIMAL, CD=2, Sc=2, VM=2.
> >>     SQLBindParameter: idx = 1: fParamType=1, name=1, fCtype=1, 
> >> SQL_Type = 3, cbColDef=2, scale=2, rgbValue = 13ddc0, cbValueMax=2,
> > cbValue = 2
> >>     Param value = 10
> >>    rebind check char Param 1 (10)
> >>     dbd_st_execute (for hstmt 2787256 before)...
> >>     dbd_st_execute (for hstmt 2787256 after, rc = -1)...
> >> dbd_error: err_rc=-1 rc=0 s/d/e: 2787256/2497728/2496296
> >> dbd_error: SQL-22003 (native 0): [unixODBC][Microsoft][ODBC SQL
> Server
> > 
> >> Driver]Numeric value out of range (SQL-22003)
> >> dbd_error: err_rc=-1 rc=0 s/d/e: 0/2497728/2496296
> >> dbd_error: err_rc=-1 rc=0 s/d/e: 0/0/2496296 st_execute/SQLExecute 
> >> error -1 recorded: [unixODBC][Microsoft][ODBC SQL Server 
> >> Driver]Numeric value out of range (SQL-22003)(DBD:
> >> st_execute/SQLExecute err=-1)
> >>     !! ERROR: -1 '[unixODBC][Microsoft][ODBC SQL Server
> Driver]Numeric
> > 
> >> value out of range (SQL-22003)(DBD: st_execute/SQLExecute err=-1)'
> >> (err#0)
> >>     <- execute= undef at ./insert.pl line 18
> >>     >> DESTROY     DISPATCH (DBI::st=HASH(0x260b20) rc1/1 
> @1 g0 ima4
> >> pid#5169)
> >>     <> DESTROY(DBI::st=HASH(0x260b20)) ignored for outer handle
> (inner
> >> DBI::st=HASH(0x1b9d48) has ref cnt 1)
> >>     >> DESTROY     DISPATCH (DBI::st=HASH(0x1b9d48) rc1/1 
> @1 g0 ima4
> >> pid#5169)
> >>     -> DESTROY for DBD::ODBC::st (DBI::st=HASH(0x1b9d48)~INNER)
> >>    SQLFreeStmt called, returned 0.
> >>        ERROR: -1 '[unixODBC][Microsoft][ODBC SQL Server
> Driver]Numeric
> > 
> >> value out of range (SQL-22003)(DBD: st_execute/SQLExecute err=-1)'
> >> (err#0)
> >>     <- DESTROY= undef
> >>     DESTROY (dbih_clearcom) (sth 0x260b20, com 0x2a8690, imp
> >> DBD::ODBC::st):
> >>        FLAGS 0x180191: COMSET Warn RaiseError PrintError PrintWarn 
> >>        PARENT DBI::db=HASH(0x260a18)
> >>        KIDS 0 (0 Active)
> >>        IMP_DATA undef
> >>        NUM_OF_FIELDS -1
> >>        NUM_OF_PARAMS 1
> >>     dbih_clearcom 0x260b20 (com 0x2a8690, type 3) done.
> >> 
> >>     -- DBI::END
> >>     >> disconnect_all DISPATCH (DBI::dr=HASH(0x1fa794) rc1/4 @1 g0
> >> ima801 pid#5169) at
> >> /usr/perl5.8.7/lib/site_perl/5.8.7/sun4-solaris/DBI.pm 
> line 677 via 
> >> ./insert.pl line 0
> >>     -> disconnect_all for DBD::ODBC::dr
> >> (DBI::dr=HASH(0x1fa794)~0x25303c)
> >>     <- disconnect_all= '' at
> >> /usr/perl5.8.7/lib/site_perl/5.8.7/sun4-solaris/DBI.pm 
> line 677 via 
> >> ./insert.pl line 0
> >> !   >> DESTROY     DISPATCH (DBI::db=HASH(0x260a18) rc1/1 
> @1 g0 ima4
> >> pid#5169) during global destruction
> >> !   -> DESTROY for DBD::ODBC::db (DBI::db=HASH(0x260a18)~INNER)
> >> ** auto-rollback due to disconnect without commit returned 1
> >>   DBD::ODBC Disconnected!
> >>        ERROR: -1 '[unixODBC][Microsoft][ODBC SQL Server
> Driver]Numeric
> > 
> >> value out of range (SQL-22003)(DBD: st_execute/SQLExecute err=-1)'
> >> (err#0)
> >> !   <- DESTROY= undef during global destruction
> >>     DESTROY (dbih_clearcom) (dbh 0x25300c, com 0x136f30, imp global
> >> destruction):
> >>        FLAGS 0x180191: COMSET Warn RaiseError PrintError PrintWarn 
> >>        PARENT DBI::dr=HASH(0x25303c)
> >>        KIDS 0 (0 Active)
> >>        IMP_DATA undef
> >>     dbih_clearcom 0x25300c (com 0x136f30, type 2) done.
> >> 
> >> !   >> DESTROY     DISPATCH (DBI::dr=HASH(0x25303c) rc1/1 
> @1 g0 ima4
> >> pid#5169) during global destruction
> >> !   -> DESTROY in DBD::_::common for DBD::ODBC::dr
> >> (DBI::dr=HASH(0x25303c)~INNER)
> >> !   <- DESTROY= undef during global destruction
> >>     DESTROY (dbih_clearcom) (drh 0x1fa794, com 0x136460, imp global
> >> destruction):
> >>        FLAGS 0x100215: COMSET Active Warn PrintWarn AutoCommit 
> >>        PARENT undef
> >>        KIDS 1 (1 Active)
> >>        IMP_DATA undef
> >>     dbih_clearcom 0x1fa794 (com 0x136460, type 1) done.
> >> 
> >> !   >> DESTROY     DISPATCH (DBI::dr=HASH(0x1fa794) rc1/1 
> @1 g0 ima4
> >> pid#5169) during global destruction
> >> !   <> DESTROY for DBI::dr=HASH(0x1fa794) ignored (inner 
> handle gone)
> >> !   >> DESTROY     DISPATCH (DBI::db=HASH(0x25300c) rc1/1 
> @1 g0 ima4
> >> pid#5169) during global destruction
> >> !   <> DESTROY for DBI::db=HASH(0x25300c) ignored (inner 
> handle gone)
> >> 
> >> 
> >> 
> 

Reply via email to