Jump to content
dipacheco

Caracteres especiais SQL

Recommended Posts

dipacheco

Boas pessoal... td bem?

Ha alguma maneira de o meu prog aceitar caracteres que possam entrar em conflito com as strings de inserção por exemplo?? É que tnh varios nomes na BD que contêm ' ou & ou % ... e quando aparece um desses caracteres acontece borrada!... ha alguma maneira de contornar isto sem mudar o nome dos dados da BD??

Share this post


Link to post
Share on other sites
Caça

Tens de colocar parênteses

SELECT [CAMPO1], [CAMPO2] FROM [TABELA]


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dipacheco

parênteses rectos?? no vb certo??

tipo isto...

inserir = "INSERT INTO [Tabela]([Numero],[Nome1]) VALUES ('" & TextBox4.Text & "','" & TextBox1.Text & "')"
command = New SqlCommand(inserir, connect)
command.executeNonQuery

Share this post


Link to post
Share on other sites
dipacheco

nao funciona na mesma... o caracter especial é o ;

ou sera q estou a fazer algo mal?? so estou a colocar parêntesis rectos no nome da tabela e dos campos que podem ter conflito... nos outros nao coloquei. tenho de colocar em todos?

Share this post


Link to post
Share on other sites
Caça

Pensei que na tua questão estavas-te a referir ao nome das tabelas/colunas..

Se esse carácter vier de uma das textboxes, tens de usar parâmetros, alias, devias sempre usar parâmetros :P


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dipacheco

outra vez a situaçao dos parametros... lol

eu n faço ideia como usar parametros sinceramente e faz-m mt confusao!

Share this post


Link to post
Share on other sites
Caça

Existem muitos exemplos espalhados pelo fórum, faz uma pesquisa


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dipacheco

como faço um text.replace de aspas??

textbox1.text.replace("""," polegadas")

isto nao dá por ficam 3 aspas seguidas...

Share this post


Link to post
Share on other sites
Caça

Isso não é solução, o trabalho que vais ter a colocar isso em todo o programa e criares parâmetros em todas as tuas consultas é o mesmo

Se fores persistente e não quiseres usar parâmetros, substitui os caracteres especiais por outros, o problema é que sempre que fores ler os registos à BD, tens de fazer o inverso


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Rechousa

Se esse carácter vier de uma das textboxes, tens de usar parâmetros, alias, devias sempre usar parâmetros :P

Totalmente de acordo! Não só resolves o problema do ponto e vírgula, como plicas e ataque de SQL Injection.

eu n faço ideia como usar parametros sinceramente e faz-m mt confusao!

Pesquisa e se tiveres dúvidas é só dizeres.

A questão até é simples, basicamente é constituída por duas coisas:

1) Definição dos parâmetros na Query, exemplo:

inserir = "INSERT INTO [Tabela]([Numero],[Nome1]) VALUES (@Numero, @Nome1)"

2) Adicionar os parâmetros à SQL Command, exemplo:

command = New SqlCommand(inserir, connect)
command.Parameters.AddWithValue("@Numero", TextBox4.Text)
command.Parameters.AddWithValue("@Nome1", TextBox1.Text)
command.executeNonQuery


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
Caça

(...)Não só resolves o problema do ponto e vírgula, como plicas e ataque de SQL Injection.(...)

Muito cuidado com isto :P


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dipacheco

rechousa... percebi o exemplo que deste... mas imagina que tenho um insert com 20 campos em q so 3 é que podem ter caracteres especias... tenho de passar tudo por parametros ou basta passar esses 3?? no caso de serem apenas esses 3 os simbolos da @ e dos [] so vao para esses campos tambem? obrigado.

Share this post


Link to post
Share on other sites
Caça

Deves fazer em todos para prevenir futuros erros, senão de vez em quando vai dar o estouro


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dipacheco

mas isso vai aumentar exponencialmente as linhas de codigo do meu programa! eheh

eu tenho muitos inserts ao longo do programa... mas se tem que ser, tem que ser! :P

Share this post


Link to post
Share on other sites
Rechousa

mas isso vai aumentar exponencialmente as linhas de codigo do meu programa! eheh

Mas reduz-te o número de dores de cabeça  :wallbash: eheheh

eu tenho muitos inserts ao longo do programa... mas se tem que ser, tem que ser! :D

Aposta nisso, a sério! Ganhas a longo prazo. E o trabalho não é muito, porque a tua instrução SQL fica mais fácil de ler (não tens plicas, concatenação de strings, enfim, aquela confusão toda, tens apenas parâmetros separados por vírgula) e a única coisa que tens que fazer é adicionar o valor do parâmetro em baixo, nothing else!

Vá, bom trabalho com essa alteração no código.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
Caça

E se quiseres ter ainda menos trabalho usa Entity Framework, isto se a tua BD não for em Access :D


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dipacheco

a BD é em sql! entity framework... vais dar a dica sobre para q serve e um mini exemplo?? ahahah

Share this post


Link to post
Share on other sites
Caça

Isto é para o teu novo projecto, caso tenhas... Agora continua com o que estás a fazer


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dipacheco

estranho... com este método nem consigo inserir nada... lol é que nem com caracteres especiais nem sem!

                    inserir = "INSERT INTO [Facturas]([Numero],[Datadia],[Datames],[Dataano],[Cliente],[Nome1],[Nome2],[Morada1],[Morada2],[Codigopostal],[NIF],[Condicoesfacturacao],[Descricao],[Process]) VALUES (@Numero,@Datadia,@Datames,@Dataano,@Cliente,@Nome1,@Nome2,@Morada1,@Morada2,@Codigopostal,@NIF,@Condicoesfacturacao,@Descricao,'True')"
                command = New SqlCommand(inserir, connect)
                command.Parameters.AddWithValue("@Numero", TextBox4.Text)
                command.Parameters.AddWithValue("@Datadia", DateTimePicker1.Value.Day)
                command.Parameters.AddWithValue("@Datames", DateTimePicker1.Value.Month)
                command.Parameters.AddWithValue("@Dataano", DateTimePicker1.Value.Year)
                command.Parameters.AddWithValue("@Cliente", TextBox1.Text)
                command.Parameters.AddWithValue("@Nome1", nome1)
                command.Parameters.AddWithValue("@Nome2", nome2)
                command.Parameters.AddWithValue("@Morada1", morada1)
                command.Parameters.AddWithValue("@Morada2", morada2)
                command.Parameters.AddWithValue("@Codigopostal", codigopostal)
                command.Parameters.AddWithValue("@NIF", NIF)
                command.Parameters.AddWithValue("@Condicoesfacturacao", condi)
                command.Parameters.AddWithValue("@Descricao", TextBox5.Text)

Share this post


Link to post
Share on other sites
Caça

Estás a fazer o ExecuteNonQuery?


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Rechousa

O teu erro não estará ao definir o valor 'True' para o campo Process?

Se o tipo de dados é BIT, então deves usar 1 ou 0.

E qual é a mensagem de erro? Não retornou msg de erro?


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

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.