terça-feira, 22 de julho de 2008

Error converting data type varchar to numeric. Update / Insert

 

Está explicito que é um erro de conversão, que é muito comum quando se está trabalhando com casas decimais, pois essas no padrão americano considera (.) ponto no lugar da (,) vírgula e no padrão pt-BR temos exatamente o contrário.

Bom.. se o problema está ocorrendo na camada de acessos aos dados, este pode ser resolvido utilizando parâmetros para passar os valores para a query ao invés de utilizar a montagem "manual" da query, pois passando desta forma o C# se encarrega de converter para o padrão do sql.

Segue um exemplo simples abaixo:

public void UpdateEstoque(Decimal estoqueDeMateriasPrimas, Decimal estoqueDeProdAcabadosFabrica, DateTime mes, Int32 original_cod)
    {
        SqlCommand sc = new SqlCommand("UPDATE mensal SET estoqueDeMateriasPrimas =  @estoqueDeMateriasPrimas , estoqueDeProdAcabadosFabrica = @estoqueDeProdAcabadosFabrica , mes = @mes WHERE (cod = @cod)", conn.Conn);
        sc.Parameters.Add("@estoqueDeMateriasPrimas", SqlDbType.Decimal ).Value = estoqueDeMateriasPrimas ;
        sc.Parameters.Add("@estoqueDeProdAcabadosFabrica", SqlDbType.Decimal ).Value =estoqueDeProdAcabadosFabrica ;
        sc.Parameters.Add("@mes", SqlDbType.DateTime  ).Value = mes;
        sc.Parameters.Add("@cod", SqlDbType.Int).Value = original_cod;
        sc.ExecuteNonQuery();

    }

 

Modo inadequado:

_sql = "UPDATE mensal SET estoqueDeMateriasPrimas =  '" + estoqueDeMateriasPrimas + "', estoqueDeProdAcabadosFabrica = '" + estoqueDeProdAcabadosFabrica + "',  mes = '" + DataConv.PadraoSqlUS(mes) + "' WHERE (cod = " + original_cod + ")";

Nenhum comentário: