Jump to content
williamjda

[RESOLVIDO] - UPDATE SQL - Para alterar um documento (.RTF)

Recommended Posts

williamjda

Amigos, boa tarde. 

Bom tenho uma aplicação que cria documentos. Como se fosse um word. Estes documentos são visualizados em um crystalreport. Com isso os mesmo mantem toda a formatação de texto. E no crystalReport ele visualiza documentos do tipo RTF.

Para gravar o documento funciona normalmente. Porem não consigo alterar o documento. Segue abaixo o update que estou a utilizar.

 'FECHA A CONEXÃO COM O BANCO
        ConectionBD.Close()

        Try

            'CHECA A CONECTION STRING PARA GRAVAR OS DADOS NO BANCO DE DADOS
            Dim cmd As SqlCommand = ConectionBD.CreateCommand

            'QUERY PARA GRAVAR NO BANCO DE DADOS
            Using com As New SqlCommand("UPDATE Cadastro_Modelo_Documento SET (nomedocumento, descricao, empresa, dataregistro, login) values (@nomedocumento, @descricao, @empresa, @dataregistro, @login)", ConectionBD)
                com.Parameters.AddWithValue("@nomedocumento", Cadastro_Modelo_Documento_Editor.NomeDocumento)
                com.Parameters.AddWithValue("@descricao", Cadastro_Modelo_Documento_Editor.txtdescricao.Rtf)
                com.Parameters.AddWithValue("@empresa", System.txtempresa.Text)
                com.Parameters.AddWithValue("@dataregistro", Now.Date)
                com.Parameters.AddWithValue("@login", System.txtlogin.Text)

                ConectionBD.Open()
                com.ExecuteNonQuery()

                'FECHA A CONEXÃO COM O BANCO DE DADOS
                ConectionBD.Close()

                'RETORNA O MENSAGE DE OK APOS GRAVAR NO BANCO
                MsgBox("Registro alterado com sucesso.", MsgBoxStyle.Information, "ATENÇÃO !!!")

            End Using

        Catch ex As Exception
            'RETORNA A MENSAGE DE ERRO CASO O COMANDO NÃO CONSIGA GRAVAR NO BANCO
            MsgBox(ex.Message, MsgBoxStyle.Exclamation, "UPDATE_Modelo_Documento_Alterar")

            'FECHA A CONEXÃO COM O BANCO
            ConectionBD.Close()

        End Try

O erro que ocorre é este: Incorrect Sintaxe near '('. 

Sei que a mensagem é bem clara ao dizer que tem uma sintase incorreta ou um erro na query. Mas já tentei de tudo. Se eu retirar tudo que for do padrão RTF ai funciona. Alguém poderia me ajudar. Grato.

Att;

William

Edited by williamjda
Erro no texto

Share this post


Link to post
Share on other sites
williamjda

É isso mesmo. Verifiquei e quando eu removo as palavras com acentuação ele grava. Mas quando tem acentuação não. Também troquei o UPDATE.

 Dim cmd As SqlCommand = ConectionBD.CreateCommand
            cmd.CommandText = ("UPDATE Cadastro_Modelo_Documento SET " _
                                         & "descricao = '" & Cadastro_Modelo_Documento_Editor.txtdescricao.Rtf & "'," _
                                         & "empresa = '" & System.txtempresa.Text & "'," _
                                         & "dataregistro = '" & Mid(Date.Now, 7, 4) & "/" & Mid(Date.Now, 4, 2) & "/" & Mid(Date.Now, 1, 2) & "'," _
                                         & "login = '" & System.txtlogin.Text & "'" _
                                         & " WHERE iddocumento = '" & Cadastro_Modelo_Documento.DataGrid_Dados.CurrentRow.Cells(0).Value & "'")

            'ABRE A CONEXÃO COM O BANCO
            ConectionBD.Open()

            'EXECUTA O COMANDO DO UPDATE 
            cmd.ExecuteNonQuery()

            'FECHA A CONEXÃO COM O BANCO
            ConectionBD.Close()

Bom agora só não entendo porque ele não permite alterar a com acentuação mas permite gravar com acentuação.

Share this post


Link to post
Share on other sites
M6

O comando de UPDATE está errado.

O erro que te está a dar é bastante claro e se fores ver a documentação do comando UPDATE vais perceber isso.

Vê aqui como se usa o comando UPDATE: http://www.w3schools.com/sql/sql_update.asp


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
williamjda

Olá amigo. M6. Bom não estou a ver onde está o erro no UPDATE que enviei. Poderia me mostrar onde você vê o erro. E pelos testes que fiz não há um erro na query, mas ocorre um erro quando o campo descrição contem palavras com acentuação. Pois este campo tem propriedades RTF. No crystalReport.

Como disse o insert funciona mas o UPDATE não.

Pois este é o UPDATE para o SQL que mencionei acima. Os 2 são a mesma coisa:

UPDATE Cadastro_Modelo_Documento SET 
descricao = 'Descrição do texto', 
empresa = '1', 
dataregistro = '2016/11/29', 
login = 'nomelogin' WHERE iddocumento = '2'

 

Atenciosamente;

William

Share this post


Link to post
Share on other sites
M6

Ah, desculpa, não tinha visto que tinhas uma versão nova.

Creio o teu problema são os acentos, verifica o encoding definido para a tabela/campo (depende da base de dados que estiveres a usar).

PS: qual é a mensagem de erro que dá?

Edited by M6

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
williamjda

Gravei no banco de dados a palavra animação. Conforme eu havia dito o INSERT funciona.

No campo descricao da tabela ele grava assim: {\rtf1\ansi\ansicpg1252\deff0\deflang1046{\fonttbl{\f0\fnil\fcharset0 Arial;}}  \viewkind4\uc1\pard\fs18 Teste\par  }  

Ao tentar alterar o texto com o UPDATE a resposta que tenho é: Incorrect syntax near 'e7'.

Mas se eu alterar a palavra animação para animacao ele faz o UPDATE.

 

 

Share this post


Link to post
Share on other sites
M6

Fácil, tens de fazer o escape das plicas.


O campo descrição guarda o conteúdo do ficheiro RTF (um RTF não é mais do que um ficheiro de texto com tags específica, tipo latex) e quando tens um RTF cujo conteúdo é apenas a palavra "animação" tens

{\rtf1\ansi\ansicpg1252\deff0\deflang2070{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang22\f0\fs22 amina\'e7\'e3o\par
}

Se reparares, tens \'e7\'e3o no meio do texto. Quando tentas executar o comando de SQL ele acha a ' antes do e7 e acha que estás a fechar a string, e como e7 não é algo que o parser esteja à espera, tens um erro de sintaxe.

Para resolveres, basta que substituas todas as ' por '' no texto que vais meter no campo.

 


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
williamjda
13 minutos atrás, M6 disse:

Fácil, tens de fazer o escape das plicas.


O campo descrição guarda o conteúdo do ficheiro RTF (um RTF não é mais do que um ficheiro de texto com tags específica, tipo latex) e quando tens um RTF cujo conteúdo é apenas a palavra "animação" tens


{\rtf1\ansi\ansicpg1252\deff0\deflang2070{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang22\f0\fs22 amina\'e7\'e3o\par
}

Se reparares, tens \'e7\'e3o no meio do texto. Quando tentas executar o comando de SQL ele acha a ' antes do e7 e acha que estás a fechar a string, e como e7 não é algo que o parser esteja à espera, tens um erro de sintaxe.

Para resolveres, basta que substituas todas as ' por '' no texto que vais meter no campo.

 

Mas quando eu removo as ' do meu codigo acima, ele continua dando erro proximo a \. Porem se colocar outra " não consigo referencia o textbox no codigo SQL.

Share this post


Link to post
Share on other sites
williamjda

o codigo do vb é este:

Dim cmd As SqlCommand = ConectionBD.CreateCommand
            cmd.CommandText = ("UPDATE Cadastro_Modelo_Documento SET " _
                                         & "descricao = '" & Cadastro_Modelo_Documento_Editor.txtdescricao.Rtf & "'," _
                                         & "empresa = '" & System.txtempresa.Text & "'," _
                                         & "dataregistro = '" & Mid(Date.Now, 7, 4) & "/" & Mid(Date.Now, 4, 2) & "/" & Mid(Date.Now, 1, 2) & "'," _
                                         & "login = '" & System.txtlogin.Text & "'" _
                                         & " WHERE iddocumento = '" & Cadastro_Modelo_Documento.DataGrid_Dados.CurrentRow.Cells(0).Value & "'")

            'ABRE A CONEXÃO COM O BANCO
            ConectionBD.Open()

            'EXECUTA O COMANDO DO UPDATE 
            cmd.ExecuteNonQuery()

            'FECHA A CONEXÃO COM O BANCO
            ConectionBD.Close()

Conforme disse se eu remover as ' simples o erro fica proximo a \ e se colocar outra " dupla ele não referencia o campo textbox

Share this post


Link to post
Share on other sites
M6

Tens de fazer escape de todos os carateres especiais que possam estar a comprometer a sintaxe do comando update.
A melhor forma que tens para fazer o debug é veres o comando tal como vai ser executado e fazeres o mesmo diretamente na base de dados. Assim vais vendo os erros que vais tendo e vais implementando as correções necessárias que tens de fazer na tua aplicação.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
williamjda

Consegui. O código ficou assim.


        Try
            Dim cmd As SqlCommand = ConectionBD.CreateCommand
            Using com As New SqlCommand("UPDATE Cadastro_Modelo_Documento SET" _
                                        & " descricao = @descricao" _
                                        & " WHERE iddocumento = '" & Cadastro_Modelo_Documento.DataGrid_Dados.CurrentRow.Cells(0).Value & "'", ConectionBD)


                com.Parameters.AddWithValue("@descricao", Cadastro_Modelo_Documento_Editor.txtdescricao.Rtf)
                'ABRE A CONEXÃO COM O BANCO DE DADOS
                ConectionBD.Open()
                'VALIDA OS CAMPOS E EXECUTA O COMANDO
                com.ExecuteNonQuery()
                'FECHA A CONEXÃO COM O BANCO
                ConectionBD.Close()
            End Using


        Catch ex As Exception
            'EM CASO DE ERRO, RETORNA A MENSAGEM
            MsgBox(ex.Message, MsgBoxStyle.Exclamation, "1 - UPDATE_Modelo_Documento_Alterar")

            'FECHA A CONEXÃO COM O BANCO
            ConectionBD.Close()
        End Try

Obrigado a todos.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.