none
Converter Nvarchar para tipo de dado money.... RRS feed

  • Pergunta

  • Olá bom dia a todos....

    Estou tendo um problema com a conversão de tipo de dado Nvarchar para Money na minha procedure.... tenho no código da minha aplicação uma variavel que recebe um valor nvarchar... esse valor recebe antes um comando Replace do C# para retirar a virgula e colocar um ponto no valor exemplo 500,00 ficaria assim 500.00 para que no banco fosse gravado no formato money... então envio essa váriavel para a procedure... e lá aparentemente está tudo ok... pois utilizei um convert(money, minhaVariavel) mas a aplicação me envia um erro dizendo que não é possível a converção implicita de valor nvarchar para money.. e me recomenda utilizar a o convert.... mesmo lá na procedure já está tudo convertido.... não sei se tenho que converter na aplicação ou na procedure.... eis a minha procedure:


       CREATE PROCEDURE wpIncluirMaterial
    (
           @Tip_Codigo char(1),
       
           @Mat_Serie varchar(50),
           @For_Cnpj char(14),
           @Mat_NumFatura varchar(10),
           @Mat_DtFatura char(8),
           @Mat_ValorAqs money,
    --       @Mat_ValorVenal money,
           @Mat_NumEmpenho varchar(10),
           @Mat_AnoEmpenho varchar(4),
           @Mat_DtIncorp char(8),
           @TpInc_Codigo  int,
           @Mat_Processo varchar(10),
           @Mat_AnoProcesso varchar(4),
           @Mat_Garantia char(8),
           @SetorAtual char(8),
           @SetorData char(8),
           @Mat_localizado char(1),
           @Mat_StUtilizado char(1),
           @Mat_Obs varchar(150)      
    )
    as
    insert into Material
    (
           Tip_Codigo,
           Mat_Tombo,
           Cla_Codigo,
           Mat_Especificacao,
           Mat_Marca,
           Mat_Modelo,
           Mat_Serie,
           For_Cnpj,
           Mat_NumFatura,
           Mat_DtFatura,
           Mat_ValorAqs,
    --       Mat_ValorVenal,
           Mat_NumEmpenho,     
           Mat_DtIncorp,
           TpInc_Codigo,
           Mat_Processo,
           Mat_Garantia,
           SetorAtual,
           SetorData,
           BaixaData,
           Mat_localizado,
           Mat_StUtilizado,
           Mat_Obs,    
           Mat_Status
    )
    values
    (
           @Tip_Codigo,
           @Mat_Tombo,
           @Cla_Codigo,
           @Mat_Especificacao,
           @Mat_Marca,
           @Mat_Modelo,
           @Mat_Serie,
           @For_Cnpj,
           @Mat_NumFatura,
           @Mat_DtFatura,
           convert(money,  @Mat_ValorAqs),
    --       @Mat_ValorVenal,
           @Mat_AnoEmpenho + @Mat_NumEmpenho ,
           @Mat_DtIncorp,
           @TpInc_Codigo,
           @Mat_AnoProcesso + @Mat_Processo,
           @Mat_Garantia,
           @SetorAtual,
           @SetorData,
           '00000000',
           @Mat_localizado,
           @Mat_StUtilizado,
           @Mat_Obs,
            'A'
    )
    GO



    e no código da aplicação em c#:

     

    string ValorAquisi = txtValorAquisi.Text.Replace(",", "."); // substitui virgula por ponto...

    string dtFatura = txtDtFatura.Text.Substring(6, 4) + txtDtFatura.Text.Substring(3, 2) + txtDtFatura.Text.Substring(0, 2);
    string dtIncorpo = txtDtIncorp.Text.Substring(6, 4) + txtDtIncorp.Text.Substring(3, 2) + txtDtIncorp.Text.Substring(0,2);
    string dtGarantia = txtGarantia.Text.Substring(6, 4) + txtGarantia.Text.Substring(3, 2) + txtGarantia.Text.Substring(0,2);
    string ForCnpj = txtCnpj.Text.Substring(0, 2) + txtCnpj.Text.Substring(3, 3) + txtCnpj.Text.Substring(7, 3) + txtCnpj.Text.Substring(11, 4) + txtCnpj.Text.Substring(16, 2);
    string setorAtual = "31300003"; // Todo Material inicialmente é cadastrado no setor: SECAO DE PATRIMONIO DEPOS. DE BENS P/ DISTRIB. Para posteriormente ser movimentado para outro Setor  

     

    try{

     

    SqlHelper.ExecuteNonQuery(ConfigurationManager.ConnectionStrings["CnPatrimonio"].ConnectionString,
    CommandType.StoredProcedure, "wpIncluirMaterial",

     

    new SqlParameter("@Tip_Codigo", tipMat),
    new SqlParameter("@Mat_Tombo", txtNumtombo.Text),
    new SqlParameter("@Cla_Codigo", txtConta.Text),
    new SqlParameter("@Mat_Especificacao", txtEspecificacao.Text),
    new SqlParameter("@Mat_Marca", txtMarca.Text),
    new SqlParameter("@Mat_Modelo", txtModelo.Text),
    new SqlParameter("@Mat_Serie", txtSerie.Text),
    new SqlParameter("@For_Cnpj", ForCnpj),
    new SqlParameter("@Mat_NumFatura", txtNumFatura.Text),
    new SqlParameter("@Mat_DtFatura", dtFatura),
    new SqlParameter("@Mat_ValorAqs", ValorAquisi),
    // new SqlParameter("@Mat_ValorVenal", txtValorAquisi.Text),
    new SqlParameter("@Mat_NumEmpenho", txtNumEmpenho.Text),
    new SqlParameter("@Mat_AnoEmpenho", txtAnoEmpenho.Text),
    new SqlParameter("@Mat_DtIncorp", dtIncorpo),
    new SqlParameter("@TpInc_Codigo", ddlTipoAquisicao.SelectedValue),
    new SqlParameter("@Mat_Processo", txtNumProcesso.Text),
    new SqlParameter("@Mat_AnoProcesso", txtAnoProcesso.Text),
    new SqlParameter("@Mat_Garantia", dtGarantia),
    new SqlParameter("@SetorAtual", setorAtual),
    new SqlParameter("@SetorData", dtIncorpo),
    new SqlParameter("@Mat_localizado", ddlLocalizado.SelectedValue),
    new SqlParameter("@Mat_StUtilizado", ddlMatUtilizado.SelectedValue),
    new SqlParameter("@Mat_Obs", txtObs.Text));
    executa.mostrarMensagem(
    "Registro incluído com sucesso!!!");

     


    Qualquer ajuda desde já Agradeço....

    sábado, 6 de junho de 2009 16:04

Todas as Respostas

  • Olá Almeida

    Cara verifique se o valor que vc esta enviando p/ proc é numerico mesmo.
    Efetuando os teste abaixo vc verá que não existe problema na conversao de nvarchar p/ money, mas se tem um caracter nao numerico ai ocorreo o problema que vc citou.

    -- correto
    declare @teste nvarchar(10)
    set @teste = '500.00'
    select convert(money,@teste)
    go
    --com problemas
    declare @teste nvarchar(10)
    set @teste = '500.0a'
    select convert(money,@teste)

    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    segunda-feira, 8 de junho de 2009 13:30
  • Olá Almeida

    Cara verifique se o valor que vc esta enviando p/ proc é numerico mesmo.
    Efetuando os teste abaixo vc verá que não existe problema na conversao de nvarchar p/ money, mas se tem um caracter nao numerico ai ocorreo o problema que vc citou.

    -- correto
    declare @teste nvarchar(10)
    set @teste = '500.00'
    select convert(money,@teste)
    go
    --com problemas
    declare @teste nvarchar(10)
    set @teste = '500.0a'
    select convert(money,@teste)

    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    segunda-feira, 8 de junho de 2009 13:31
  • Almeida,

    Você realizou a verificação?


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    segunda-feira, 8 de junho de 2009 18:21
  • Olá pessoal.... desculpe a demora em responder.... pois devido ao prazo de entrega do projeto está se esgotando... estou muito atarefado...rs.... mas encontrei uma outra solução que foi em vez de utilizar o comando replace, utilizar a conversão para double, isso na aplicação, e na procedure continuei como estava. Ex:

     antes:   string ValorAquisi = txtValorAquisi.Text.Replace(",", "."); // substitui virgula por ponto...

    DEPOIS: double ValorAquisi = Convert.ToDouble(txtValorAquisi.Text);

    esta funcionando normalmente.. e gravando no formato money..

    Obrigado pelas respostas....
    terça-feira, 9 de junho de 2009 16:39
  • Almeida,

    Obrigado pelo retorno.


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 9 de junho de 2009 16:53