[ 
http://issues.apache.org/jira/browse/IBATISNET-66?page=comments#action_65731 ]
     
Roberto Rabe commented on IBATISNET-66:
---------------------------------------

Had some slight issues with Oracle and MS OracleClient & ODP.NET 10g providers 
and the new code in 
IBatisNet.DataMapper.Configuration.ParameterMapping.ParameterMap.SetParameter():

if (parameterValue.GetType() != typeof(string) &&
    parameterValue.GetType() != typeof(Guid) &&
    !parameterValue.GetType().IsPrimitive)
{
    value = ObjectProbe.GetPropertyValue(value, mapping.PropertyName);

    if (value != null && value.GetType() == typeof(byte[]))
    {
        MemoryStream stream = new MemoryStream((byte[])value);

        value = stream.ToArray();
    }
}

Since the System.Type of the Order_Id column (resultMap tests) returned by 
Oracle is Decimal, the check on on !IsPrimitive returns true.  Then it mistakes 
the object to be some sort of domain/business class named Decimal with a 
property named value, and an exception is thrown when probing the object.  The 
code has been updated to do a check for Decimal and DateTime (since string and 
Guid are already checked):

if (parameterValue.GetType() != typeof(string) &&
    parameterValue.GetType() != typeof(Guid) &&
    parameterValue.GetType() != typeof(Decimal) &&
    parameterValue.GetType() != typeof(DateTime) &&
    !parameterValue.GetType().IsPrimitive)

Code passed tests with Oracle & MS OracleClient | ODP.NET 10g; MySql & ByteFx; 
MSSQL & SqlClient; PostgreSQL & Npgsql 0.7.  Didn't get to check OLEDB and ODBC 
though.



> #value# moniker not recognized when called something else like #ProductId#
> --------------------------------------------------------------------------
>
>          Key: IBATISNET-66
>          URL: http://issues.apache.org/jira/browse/IBATISNET-66
>      Project: iBatis for .NET
>         Type: Bug
>     Reporter: Ron Grabowski
>     Assignee: Gilles Bayon
>     Priority: Minor

>
> The Dev Guide:
>  http://prdownloads.sourceforge.net/ibatisnet/DevGuide.pdf?download
> has the following text on page 16:
>  The name "value" is simply a placeholder, you can use another moniker if you 
> like.
> That means it should be possible to re-write this:
> <!-- .NET -->
> <statement id=”insertProduct” parameter=”System.Integer”>
>  select * from PRODUCT where PRD_ID = #value#
> </statement>
> as this:
> <!-- .NET -->
> <statement id=”insertProduct” parameter=”System.Integer”>
>  select * from PRODUCT where PRD_ID = #ProductId#
> </statement>
> or even like this:
> <!-- .NET -->
> <statement id=”insertProduct”>
>  select * from PRODUCT where PRD_ID = #ProductId#
> </statement>
> It looks like the dev guide mistakenly uses "parameter" instead of 
> "parameterClass" in its example and "insertProduct" should be called 
> "getProduct". Page 16, Example 22.
> When #ProductId# is used, "PreparedStatement" is logged but not "Parameters" 
> or "Types". No exceptions are thrown.
> I think its important to keep the parameter name the user entered in their 
> sql map instead of simply replacing it with "value":
>  // GOOD
>  PreparedStatement : [select * from PRODUCT where PRD_ID = ?]
>  Parameters: [param0=['ProductId',19]]
>  Types: [param0=[String, System.Int32]]
>  // NOT SO GOOD
>  PreparedStatement : [select * from PRODUCT where PRD_ID = ?]
>  Parameters: [param0=['value',19]]
>  Types: [param0=[String, System.Int32]]
> Here is another example showing #value# renamed to #year# in a <select> 
> statement:
> http://tinyurl.com/886oq
> http://opensource.atlassian.com/confluence/oss/display/IBATIS/How+do+I+get+around+the+N+Plus+1+selects+problem%3F

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to