REGISTROS COM CAMPO TIPO MEMO

ABREU 15/01/2017 10:26:47
#470712
Bom dia para todos,

Fiz um aplicativo em VB.Net 2012 para cadastramento de jurisprudência usando o Access 2007. Porém, estou tendo dificuldade no que, a princípio, deveria ser a coisa mais simples: incluir e atualizar registros.

O app não aceita mais do que 255 caracteres no campo Memo, ou seja: trata o campo Memo como se fosse um campo Texto limitando o número de caracteres.

Se coloco até 255 caracteres no campo Memo, o app salva o registro normalmente. Mas se excedo esse número, ele emite a seguinte mensagem de erro:

Erro de sintaxe (operador faltando) na expressão de consulta [ô][ô]ADMINISTRATIVO E PROCESSUAL CIVIL. AÇÃO POPULAR. IRREGULARIDADES FORMAIS AVERIGUADAS NO PROCEDIMENTO LICITATÓRIO, QUE NÃO ENSEJARAM, CONTUDO, DANO AO ERÁRIO, CONFORME RECONHECIDO EM PERÍCIA JUDICIAL E PELO TCE DE MINAS GERAIS. IMPOSSIBILIDADE DE CONDENAÇ[ô].

A mensagem aponta para a linha em negrito no código abaixo usado para atualizar os registros:

Dim conectaBD As New OleDbConnection
Dim ds As New DataSet

conectaBD.ConnectionString = [Ô]Provider=Microsoft.ACE.OLEDB.12.0;[Ô] _
& [Ô]Data Source=BDJurisprudencia.accdb;Jet OLEDB:System database=system.mdw;[Ô]

conectaBD.Open()
ds.Reset()
Dim SQL As String = [Ô]Update T033 set [Ô] _
& [Ô] Assunto = [ô][Ô] & txtAssunto.Text & [Ô][ô],[Ô] _
& [Ô] Ementa = [ô][Ô] & txtEmenta.Text & [Ô][ô],[Ô] _
& [Ô] TipNumRec = [ô][Ô] & txtTipNumRec.Text & [Ô][ô],[Ô] _
& [Ô] Tribunal = [ô][Ô] & txtTribunal.Text & [Ô][ô],[Ô] _
& [Ô] OrgJul = [ô][Ô] & txtOrgJul.Text & [Ô][ô],[Ô] _
& [Ô] Relator = [ô][Ô] & txtRelator.Text & [Ô][ô],[Ô] _
& [Ô] DatPub = [ô][Ô] & txtDatPub.Text & [Ô][ô],[Ô] _
& [Ô] Fonte = [ô][Ô] & txtFonte.Text & [Ô][ô][Ô] _
& [Ô] where Id = [Ô] & lblId.Text
Dim adapter As New OleDbDataAdapter(SQL, conectaBD)
adapter.Fill(ds)
conectaBD.Close()

O campo Memo está na linha & [Ô] Ementa = [ô][Ô] & txtEmenta.Text & [Ô][ô],[Ô] _

Em anexo segue um print da tabela no Access.

Alguém já passou por esse problema para me dar uma ajuda e resolvê-lo?
JABA 15/01/2017 12:40:47
#470714
Se o texto possuir mais do que 3450 caracteres, ele vai dar erro mesmo. Veja se não é isso.

Outra coisa que pode estar acontecendo é o seu texto possuir apóstrofo (aspas simples), daí o erro.
ABREU 15/01/2017 16:24:34
#470722
Caro Jaba,

O texto que entra nesse campo só contém os caracteres do nosso idioma: ç, acentuação, etc.. Nada de aspas ou apóstrofos.
Por outro lado, já verifiquei que o erro ocorre com mais do que 255 e mesmo com menos do que 3450 caracteres.
Sinceramente, não sei o que pode estar ocorrendo. Seria um erro de programação? Seria erro de configuração do Access? Ou seria uma gafe da Microsoft?
Não faço a menor ideia.
De qualquer forma, muito obrigado pela atenção. Vou continuar investigando...
MARCOSLING 15/01/2017 19:01:25
#470724
Passa um debug e posta o conteudo da variável sql
COQUITO 15/01/2017 20:26:57
#470728
Tente assim.txtementa.text.tostring, assim ele vai interpretar qualquer evento em.string para capturar o valor
JABA 15/01/2017 20:52:53
#470729
Talvez exista alguma palavra reservada do ACCESS dentro de sua String. Faça um teste assim pra ver se vai:

& [Ô] Ementa = [ô]AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[Ô] & & [Ô][ô],[Ô] _
KERPLUNK 15/01/2017 23:52:53
#470735
Resposta escolhida
1 - Para comandos SQL de INSERT, UPDATE e DELETE, utilize OleDbConnection e OleDbCommand e não OleDbAdapter.
2 - Quando usar o OleDbCommand, use-o com blocos using para garantir que tanto a conexão quando o comando SQL serão finalizados e dispensados de forma correta.
3 - Não use concatenação de dados, mas sim comandos parametrizados. Isso garante que você estará seguro de ataques de SQL Injection, elimina a necessidade de análise dos valores por caracteres que podem descaracterizar a sua query no momento da concatenação como o apóstrofo, por exemplo.
Em suma, ficaria algo como:

Using cn As New OleDbConnection([Ô]Provider=Microsoft.ACE.OLEDB.12.0;Data Source=BDJurisprudencia.accdb;Jet OLEDB:System database=system.mdw;[Ô])
Using cmd As New OleDbCommand([Ô]Update T033 set Assunto = @assunto, Ementa = @ementa, TipNumRec = @tiponumrec, Tribunal = @tribunal, OrgJul = @orgjul, Relator = @relator, DatPub = @datapub, Fonte = @fonte where Id = @id[Ô])
cmd.Parameters.AddWithValue([Ô]@assunto[Ô], txtAssunto.Text)
cmd.Parameters.AddWithValue([Ô]@ementa[Ô], txtEmenta.Text)
cmd.Parameters.AddWithValue([Ô]@tipnumrec[Ô], txtTipNumRec.Text)
cmd.Parameters.AddWithValue([Ô]@tribunal[Ô], txtTribunal.Text)
cmd.Parameters.AddWithValue([Ô]@orgjul[Ô], txtOrgJul.Text)
cmd.Parameters.AddWithValue([Ô]@relator[Ô], txtRelator.Text)
cmd.Parameters.AddWithValue([Ô]@datpub[Ô], txtDatPub.Text)
cmd.Parameters.AddWithValue([Ô]@fonte[Ô], txtFonte.Text)
cmd.Parameters.AddWithValue([Ô]@id[Ô], txtId.Text)

cmd.ExecuteNonQuery()
End Using
End Using
ABREU 11/02/2017 15:07:09
#471575
Olá, amigos.
Enfim consegui retornar ao tópico.
Aos 70 anos, a saúde sempre prega peças, e dessa vez a barra foi pesada, mas agora está tudo bem.
Verifiquei as alternativas do COQUITO e do JABA e fico agradecido, mas não obtive êxito.
Segui a sugestão do KERPLUNK e utilizei OleDbConnection e OleDbCommand.
A princípio, acusou o erro “Propriedade Connection não inicializada”. Então, inicializei a conexão usando [cn.Open()], e defini essa conexão para o comando usando [cmd.Connection = cn].
O código funcionou satisfatoriamente. Foi tecnicamente correto o que fiz?
Eu nunca havia utilizado OleDbConnection, OleDbCommand e comandos parametrizados. A técnica é nova para mim e gostaria de utilizá-la em todos os meus trabalhos daqui para frente, porque é realmente melhor, bem mais funcional e mais profissional.

Caro KERPLUNK, poderia ajudar-me a utilizá-la também com os comandos INSERT e DELETE?
Desde já, muito grato!
KERPLUNK 11/02/2017 21:28:25
#471586
A lógica é exatamente a mesma para qualquer comando SQL. Você define o comando e seus parâmetros e executa. Não esqueça também de usar blocos using, pois os objetos OleDbConnection e OleDbCommand, herdam de IDisposable.
ABREU 12/02/2017 07:24:16
#471596
Ótimo!
Vou começar agora mesmo.
Muito obrigado.
SINCLAIR 12/02/2017 11:26:13
#471597
Colega ABREU,

Quanto à parte técnica, os colegas COQUITO, JABA e KERPLUNK já te auxiliaram bem. Não se fará necessário um apontamento meu, visto que com eles estais muito bem auxiliado.

Entretanto, faço uso deste espaço para te parabenizar pela educação, visível por suas saudações ao iniciar tópicos, ao agradecer os colegas e, também, por usar língua portuguesa de forma correta, o que indica que também fez bom uso do seu tempo enquanto estudante, para hoje poder comunicar-se bem. Foi uma decisão sábia, a sua, plantar boas sementes para fazer boa colheita. Parabéns e boa sorte em seus códigos!

Tudo de bom.

Página 1 de 2 [15 registro(s)]
Tópico encerrado , respostas não são mais permitidas