Loading ...
Sorry, an error occurred while loading the content.

Re: Problemas para gerar statement SQL

Expand Messages
  • danilo.marcondes
    Para ver se o statement estava realmente correto, eu mandei que o Smalltalk gerasse para mim um arquivo texto com ele. Ao abrir o arquivo, vi que o statement
    Message 1 of 6 , Jan 13, 2009
    View Source
    • 0 Attachment
      Para ver se o statement estava realmente correto, eu mandei que o
      Smalltalk gerasse para mim um arquivo texto com ele.
      Ao abrir o arquivo, vi que o statement estava com a sintaxe correta.

      Eu até verifiquei a rotina que pega os registros do banco de dados,
      mas os valores vêm normalmente...

      O problema é realmente na hora de passar o string gerado ou de exibí-
      lo para mim, é aí que ele aparece cortado.

      O pior é que se eu gero um texto desse tamanho de alguma outra forma
      (por exemplo, concatenando informações que eu mesmo tenha digitado),
      ele gera o texto sem problemas também, mas o exibe inteiro.

      Ainda estou procurando algo no VisualAge para ver se acho alguma
      coisa ou a razão do problema.

      Obrigado!

      --- In st-br@yahoogroups.com, "Sebastian Sastre" <ssastre@...> wrote:
      >
      > Olá Danilo,
      > certamente o default de um string *não é* ficar "comido" como para
      ter que
      > pedi-lo enteiro. Ele é o que é.
      > Pode ser que o framework que interfaceia com o teu rdbms esteja te
      fazendo
      > passar um mal momento. Outra coisa pode ser o driver de odbc.
      > Eu tentaría com opçoes ou com alguma ferramenta de diagnostico que
      permita estar
      > 100% certo de que o problema e dentro do st ou fora (drives, rdbms
      encoding
      > issues, etc).
      > Se o string que teu codigo forma executa bem via um cliente
      externo, nao vejo
      > porque questiona lo.
      > hope this helps,
      > Sebastian
      >
      >
      >
      > _____
      >
      > De: st-br@yahoogroups.com [mailto:st-br@yahoogroups.com] En nombre
      de
      > danilo.marcondes
      > Enviado el: Tuesday, January 13, 2009 11:21
      > Para: st-br@yahoogroups.com
      > Asunto: [st-br] Problemas para gerar statement SQL
      >
      >
      >
      > Estou programando uma classe no Smalltalk (VisualAge 6.0), que lê
      um
      > registro de uma tabela em um banco de dados e monta um statement de
      > UPDATE, baseado nos nomes dos campos e nas informações que cada um
      > deles contém.
      >
      > O statement UPDATE é gerado corretamente, e fica com um tamanho de
      > pouco menos de 600 caracteres.
      >
      > Não sei por qual razão, quando o statement é passado para ser
      > executado, o smalltalk "come" o final dele. Dessa forma, quando
      tento
      > executar o UPDATE, o programa me retorna erro de sintaxe.
      >
      > Esse é o meu método:
      >
      > ====================================================================
      > alteraLinha: wrow chave: wchv tabela: wtab
      >
      > | wconweb wtabweb wstm wcr waux wlst |
      >
      > wconweb := AbtDbmSystem activeDatabaseConnectionWithAlias: 'WEBDB'.
      >
      > wtabweb := wconweb openTableNamed: #Tabela ifError: [ :werr |
      > self rc: (self trataErro: werr).
      > ^false
      > ].
      >
      > wlst := wtabweb columnNamesIfError: [ :werr |
      > self rc: (self trataErro: werr).
      > ^false
      > ].
      >
      > wcr := ((String with: (Character value: 13)), (String with:
      > (Character value: 10))).
      > wstm := 'UPDATE ', wtab, ' SET ', wcr.
      >
      > wlst do:[ :wnom |
      >
      > wstm := wstm, wnom, ' = '.
      > wstm := wstm, (self asSql: (wrow at: (wnom
      > asSymbol))).
      > wstm := wstm, ', ', wcr.
      >
      > ].
      >
      > wstm := wstm copyFrom: 1 to: (wstm size - 4).
      > wstm := wstm, ' WHERE ', wchv, ' = ', (self asSql: (wrow at: (wchv
      > asSymbol))).
      >
      > wconweb executeSQLStatement: wstm ifError: [ :werr |
      > self rc: (self trataErro: werr).
      > ^false
      > ].
      >
      > ====================================================================
      >
      > Obs.: O método "self asSql:" apenas transforma a informação que
      > estiver em determinado campo no registro, para incluí-la na
      > formatação correta no statement de update.
      >
      > Não sei se existe algum atributo na classe String que me permita
      > enviar todos os caracteres.
      > Achei um tanto quanto incomum esse evento, mas se alguém souber de
      > alguma coisa, agradeço muito!
      >
      > Obrigado.
      >
    • Jecel Assumpcao Jr
      Danilo, [...] ... [...] ... [...] Aqui você está comendo o final do texto de propósito. E logo na linha seguinte passa a ser o meio do texto de modo que
      Message 2 of 6 , Jan 13, 2009
      View Source
      • 0 Attachment
        Danilo,

        [...]
        > Não sei por qual razão, quando o statement é passado para ser
        > executado, o smalltalk "come" o final dele. Dessa forma, quando tento
        > executar o UPDATE, o programa me retorna erro de sintaxe.
        [...]
        > wstm := wstm copyFrom: 1 to: (wstm size - 4).
        [...]

        Aqui você está "comendo o final do texto" de propósito. E logo na linha
        seguinte passa a ser o meio do texto de modo que imagino que não é disso
        que você está falando. Só achei o -4 meio estranho - você não só apaga a
        ',' e o CR e LF mas também o caracter final do resultado de (self
        asSql: (wrow at: (wnom asSymbol))). É sempre um espaço ou algo assim?

        Eu aproveitaria os recursos interativos do ambiente de programação.
        Execute a expressão passo a passo no "debugger" (sem entrar em cada
        submétodo na primeira vez) e uso os inspetores para ver os detalhes de
        cada objeto envolvido.

        Boa sorte!
        -- Jecel
      • danilo.marcondes
        Olá Jecel! Essa parte, (wstm := wstm copyFrom: 1 to: (wstm size - 4)), onde ele tira os caracteres é proposital, para retirar um AND final do statement.
        Message 3 of 6 , Jan 20, 2009
        View Source
        • 0 Attachment
          Olá Jecel!

          Essa parte, (wstm := wstm copyFrom: 1 to: (wstm size - 4)), onde ele
          tira os caracteres é proposital, para retirar um "AND" final do
          statement.

          Mas um programador da empresa onde trabalho me deu uma ajuda, acho
          que ele já tinha enfrentado algum problema parecido com o meu, hehe.

          Aqui onde trabalho, opero bastante com bancos do DB2 (IBM) e alguns
          do Access. Dessa vez, estava mexendo com um banco MySQL.

          No banco DB2, por exemplo, quando tenho um campo no banco de dados do
          tipo CHAR(15), e digito uma palavra com 10 caracteres, o resto o
          próprio DB2 completa com espaços em branco.
          Porém, se eu tenho mesmo caso em um banco MySQL, ele completa o
          restante com um caracter de valor nulo, que no smalltalk é o
          caracter "(Character value: 0)".

          Esse era o problema: Quando o programa ia concatenando os registros
          no meu statement, e encontrava um campo desse tipo, esse caracter
          nulo "quebrava" a String, e então eu obtia o erro na síntaxe.

          Para solucionar o problema, precisei apenas utilizar o
          método "abtWithoutOccurencesOf: (Character value: 0)", retirando esse
          caracter nulo quando o campo fosse CHAR.

          Agora o programa monta os statements corretamente.

          Achei importante postar essa mensagem, caso alguém enfrente o mesmo
          problema, para não ter de "quebrar a cabeça" como eu, hehe.

          De qualquer forma, muito obrigado!

          Danilo Marcondes

          --- In st-br@yahoogroups.com, "Jecel Assumpcao Jr" <jecel@...> wrote:
          >
          > Danilo,
          >
          > [...]
          > > Não sei por qual razão, quando o statement é passado para ser
          > > executado, o smalltalk "come" o final dele. Dessa forma, quando
          tento
          > > executar o UPDATE, o programa me retorna erro de sintaxe.
          > [...]
          > > wstm := wstm copyFrom: 1 to: (wstm size - 4).
          > [...]
          >
          > Aqui você está "comendo o final do texto" de propósito. E logo na
          linha
          > seguinte passa a ser o meio do texto de modo que imagino que não é
          disso
          > que você está falando. Só achei o -4 meio estranho - você não só
          apaga a
          > ',' e o CR e LF mas também o caracter final do resultado de (self
          > asSql: (wrow at: (wnom asSymbol))). É sempre um espaço ou algo
          assim?
          >
          > Eu aproveitaria os recursos interativos do ambiente de programação.
          > Execute a expressão passo a passo no "debugger" (sem entrar em cada
          > submétodo na primeira vez) e uso os inspetores para ver os detalhes
          de
          > cada objeto envolvido.
          >
          > Boa sorte!
          > -- Jecel
          >
        • Sebastian Sastre
          Brigado por compartilhar Danilo. Foi de fato o case falado em: ...Pode ser que o framework que interfaceia com o teu rdbms esteja te fazendo passar um mal
          Message 4 of 6 , Jan 20, 2009
          View Source
          • 0 Attachment
            Brigado por compartilhar Danilo. Foi de fato o case falado em:
            "...Pode ser que o framework que interfaceia com o teu rdbms esteja te fazendo passar um mal momento..."
            Ainda bem que voces consiguiram desmitificar essa!
            abraço,
            Sebastian
             


            De: st-br@yahoogroups.com [mailto:st-br@yahoogroups.com] En nombre de danilo.marcondes
            Enviado el: Tuesday, January 20, 2009 10:11
            Para: st-br@yahoogroups.com
            Asunto: [st-br] Re: Problemas para gerar statement SQL

            Olá Jecel!

            Essa parte, (wstm := wstm copyFrom: 1 to: (wstm size - 4)), onde ele
            tira os caracteres é proposital, para retirar um "AND" final do
            statement.

            Mas um programador da empresa onde trabalho me deu uma ajuda, acho
            que ele já tinha enfrentado algum problema parecido com o meu, hehe.

            Aqui onde trabalho, opero bastante com bancos do DB2 (IBM) e alguns
            do Access. Dessa vez, estava mexendo com um banco MySQL.

            No banco DB2, por exemplo, quando tenho um campo no banco de dados do
            tipo CHAR(15), e digito uma palavra com 10 caracteres, o resto o
            próprio DB2 completa com espaços em branco.
            Porém, se eu tenho mesmo caso em um banco MySQL, ele completa o
            restante com um caracter de valor nulo, que no smalltalk é o
            caracter "(Character value: 0)".

            Esse era o problema: Quando o programa ia concatenando os registros
            no meu statement, e encontrava um campo desse tipo, esse caracter
            nulo "quebrava" a String, e então eu obtia o erro na síntaxe.

            Para solucionar o problema, precisei apenas utilizar o
            método "abtWithoutOccurenc esOf: (Character value: 0)", retirando esse
            caracter nulo quando o campo fosse CHAR.

            Agora o programa monta os statements corretamente.

            Achei importante postar essa mensagem, caso alguém enfrente o mesmo
            problema, para não ter de "quebrar a cabeça" como eu, hehe.

            De qualquer forma, muito obrigado!

            Danilo Marcondes

            --- In st-br@yahoogroups. com, "Jecel Assumpcao Jr" <jecel@...> wrote:
            >
            > Danilo,
            >
            > [...]
            > > Não sei por qual razão, quando o statement é passado para ser
            > > executado, o smalltalk "come" o final dele. Dessa forma, quando
            tento
            > > executar o UPDATE, o programa me retorna erro de sintaxe.
            > [...]
            > > wstm := wstm copyFrom: 1 to: (wstm size - 4).
            > [...]
            >
            > Aqui você está "comendo o final do texto" de propósito. E logo na
            linha
            > seguinte passa a ser o meio do texto de modo que imagino que não é
            disso
            > que você está falando. Só achei o -4 meio estranho - você não só
            apaga a
            > ',' e o CR e LF mas também o caracter final do resultado de (self
            > asSql: (wrow at: (wnom asSymbol))). É sempre um espaço ou algo
            assim?
            >
            > Eu aproveitaria os recursos interativos do ambiente de programação.
            > Execute a expressão passo a passo no "debugger" (sem entrar em cada
            > submétodo na primeira vez) e uso os inspetores para ver os detalhes
            de
            > cada objeto envolvido.
            >
            > Boa sorte!
            > -- Jecel
            >

          Your message has been successfully submitted and would be delivered to recipients shortly.