For IDbDataParameter.Size we have the following documentation on MSDN:
The maximum size, in bytes, of the data within the column. The default
value is inferred from the the parameter value.

While for DbParameter.Size (which implements the above) we have (excerpt):
The DbType and Size properties of a parameter can be inferred by
setting Value. Therefore, you are not required to specify them.
However, they are not exposed in DbParameter property settings. For
example, if the size of the parameter has been inferred, Size does not
contain inferred value after statement execution.

NHibernate (in AbstractStringType) relies on the behavior in the last
sentence above: Size does not contain inferred value after statement
execution.

I don't now if the Sybase provider inherits from DbParameter or
implement IDbDataParameter directly, but in either case it has
different behavior, namely exposing an inferred Size value. What we
can try to fix this is to make the SybaseAseClientDriver set an
explicit parameter  length. If you want to experiment with this, you
should subclass the driver and override GenerateCommand() - see
SqlClientDriver for inspiration. I don't have Sybase myself so it
would be great if you could look into this.

/Oskar


2012/11/19 Michael Fan <[email protected]>:
> I could not believe it in the beginning. But that is the fact.
>
> I was updating a collection into a database table. One of the field in the
> collection is a string type.
> I debugged into nHibernate 3.3.1 code, (see my initial post). My column
> width in the table (hbm mapped) is 220. But I found that parameter.Size ,
> which should have been set to 220 , was actually set to 15, which is the
> length of the string "Atlanta AAA Ltd", the value of this field at the first
> row of the collection.
> I set the string other length as well, parameter.Size was always set to that
> length.
>
> I could not debug any furthur into IDbDataParameter , because I don't have
> the source code.
>
> Michael Fan
>
> =========================
> On Monday, November 19, 2012 11:07:29 AM UTC-5, Oskar Berggren wrote:
>>
>> 2012/11/19 Michael Fan <[email protected]>
>>
>> > IDbDataParameter parameter.Size is set to the length of the string of
>> > the first row in collection, instead of the column size defined in the 
>> > table
>>
>> How do you conclude "set to the length of the string of the first row
>> in collection"? I don't quite get that part.
>>
>> NH will not set the parameter size according to the column size in the
>> table, but some drivers will set the parameter size based on the
>> length attribute from your mapping. However, the SybaseAseClientDriver
>> does not appear to do that.
>>
>>
>> Could it be that the Sybase ADO.NET provider has a provider specific
>> behavior of changing parameter.Size when the value is assigned?
>>
>> /Oskar
>
> --
> You received this message because you are subscribed to the Google Groups
> "nhusers" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/nhusers/-/Q244PhTV6eYJ.
>
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/nhusers?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to