Colunas grandes Oracle NCLOB ou CLOB com NHibernate

Voce já teve aqueles dias que é necessário um dia inteiro para entender um problema, bom hoje tive um dia mais ou menos assim.

Estava com um problema para salvar um campo com um conteúdo RTF em uma coluna no banco de dados, eu já havia homologado essa rotina em SQL Server, porém no Oracle dependo da forma que era salvo o conteúdo ocorria o seguinte erro:

ORA-01461: can bind a LONG value only for insert into a LONG column

Após pesquisar bastante consegui encontrar o problema, um post me ajudou muito(Link), vamos ao problema.

O Oracle após aceita até 2000 caracteres em um campo varchar ou varchar2, por isso é necessário quando o texto é muito grande é necessário utilizar o NClob.No provider de Oracle do dotNet no NHibernate existe uma validação para campos menores que 4000 caracteres e mais de 2000 caracteres ele adicionar o campo como long ou longRaw e por isso acontece esse erro, esses testes foram efetuados com NHibernate. Atualmente não encontrei nenhum download de fix para corrigir isso.

A minha solução, não é a melhor, foi a seguinte quando o conteúdo estiver no range de 2000 > conteudoRTF && 4000 < conteudoRTF eu faço um padRight até 4001 de caracteres vazio.

if (rtf.Length > 2000 && rtf.Length < 4000)
{
    rtf = rtf.PadRight(4001, ' ');
}

Espero ter ajudado.

Anúncios

Extension Methods

Definição:Métodos extensores para criação de métodos em determinado tipo de Objeto, Interface ou enumerado, não obrigando a ter o fonte do objeto que será extendido.O Conceito de extension methods surgiu junto com LINQ, na versão 3.5 do framework, foi criado devido a necessidade da microsoft colocar metodos em determinadas interfaces, um exemplo é os metodos LINQ(Where, Select ou Join) eles são extension methods da interface IEnumareble<T>.Ao Criar um metodo de extensão em um tipo e esse tipo já possui um metodo com a mesma assinatura, o metodo de extensão não será utilizado, será utilizado o metodo real do tipo.

A ideia é muito simples, criar metodos para um determinado tipo independente da origem do tipo em questão.

Na Pratica: Aonde isso irá me ajudar no trabalho do dia-a-dia correto? Uma aplicação Simples é utilizar para validar o conteúdo de um controle por exemplo:

  • Em um TextBox você poderia colocar o metodo IsEmpty() que iria verificar se o conteúdo do TextBox é vazio, ou o método IsNumber() no mesmo TextBox para validar se o conteúdo é apenas numérico.
  • Em um enumerado qualquer é possivel colocar um metodo para um objeto a partir do valor do enumerado.
Codificação:
Crie uma classe publica estática( precisa ser estática) e adiciona um método estático normalmente, porem adicionar a palavra this no primeiro parâmetro indicando de qual tipo será essa extensão, segue o codigo exemplificado:

 public static class Extensions
    {
        public static bool EhPar(this int numero)
        {
            return numero % 2 == 0;
        }

        public static bool EhImpar(this int numero)
        {
            return numero % 2 != 0;
        }
    }

Os métodos irão aparecer nos objetos desse tipo, nesse caso em qualquer int igual na imagem

Como ira ficar na IDE

Código de exemplo de utilização dos métodos


            int par = 3;
            bool IsImpar = par.EhImpar();
            bool IsPar = par.EhPar();