2011-08-15 12 views
5

Al utilizar NHibernate 3.1 con SQL Server y Oracle DBs, necesitamos almacenar una cadena de texto de más de 4000 caracteres. El texto es en realidad XML, pero eso no es importante; solo queremos tratarlo como texto sin formato. Con SQL Server, esto es fácil. Declaramos la columna como NVARCHAR (MAX) y el mapa que de esta manera:Asignación de una cadena de texto larga en Oracle y NHibernate

<property name="MyLongTextValue" length="100000"/> 

El uso de la propiedad length dice NHibernate esperar una cadena que puede ser superior a 4.000 caracteres.

Por mi vida, no puedo encontrar la manera de hacer que esto funcione en Oracle 11g. Intenté declarar la columna como XMLTYPE y LONG sin éxito. En el primer caso, terminamos con ORA-01461: puede vincular un valor LONG solo para insertarlo en una columna LONG cuando intente insertar una fila. En el segundo caso, los datos se insertan correctamente pero vuelven como una cadena vacía al realizar consultas.

¿Alguien sabe cómo hacer esto? La respuesta debe ser compatible tanto con SQL Server como con Oracle. Preferiría no tener que escribir extensiones personalizadas como tipos de usuario y subclases de controladores. Gracias.

+0

Debe utilizar NTEXT para el servidor SQL, nvarchar (max) es probable que no manejar más de 4000 caracteres. –

+0

@YavorShahpasov ¿por qué piensas que NVARCHAR (MAX) no manejará más de 4000 caracteres? Los documentos dicen "max indica que el tamaño máximo de almacenamiento es 2^31-1 bytes (2 GB)". Eso debería ser suficiente para 1073741823 caracteres más o menos. – phoog

+0

Fui engañado por el hecho de que permite 1-4000 caracteres. Estás en lo correcto y max permitirá hasta 2GB. –

Respuesta

6

que puedes usar algo como esto

<property name="MyLongTextValue" length="100000" type="StringClob" 
not-null="false"/> 

Esto debería funcionar con Oracle tipo CLOB y tipo SqlServer NTEXT.

Asegúrese de que la propiedad de su modelo es anulable

public virtual string MyLongTextValue {get;set;} 

Siempre se debe utilizar el Oracle.DataAccess cuando se trata de CLOBs

0

Usted puede estar interesado en este article.

<property column="`LARGE_STRING`" name="LargeString" type="StringClob" sql-type="NCLOB" /> 
2

Para quién puede interesarle, he resuelto mi problema después de la etapa 3 de this article:

3. correcta a través de cartografía atributos: type="AnsiString"

Normalmente podemos utilizar type="String" por defecto para CLOB/NCLOB. Intente usar>type="AnsiString" si los dos pasos anteriores no funcionan.

<property name="SoNhaDuongPho" column="SO_NHA_DUONG_PHO" type="AnsiString"/>

En mi caso lo fijo con FluentNHibernate:

.CustomType("AnsiString") 
Cuestiones relacionadas