Query con campi Null

lunedì 09 agosto 2010 - 08.24

jekisi Profilo | Senior Member

Salve a tutto il forum, avrei 2 seguenti problemi con questa query:

Ho scritto questa query

sql = "Insert Into [Tabella1] (Dataconsegna, Cliente, Indirizzo, Cap, Città, Prov, Variazione,
NumeroDocumento, SerieDocumento) Values ('" & DATATextBox.Text & "', '" & DITTATextBox.Text & "',
'" & INDIRIZZOTextBox.Text & "', '" & CAPTextBox.Text & "', '" & CITTATextBox.Text & "',
'" & PRTextBox.Text & "', '" & VARIAZIONETextBox.Text & "', '" & NUMEROTextBox.Text & "',
'" & SERIETextBox.Text & "')"

Il problema sta che avvolte il Campo CLIENTE, può avere degli ACCENTI, APICI, ECC.., e li mi da errore.
Il secondo problema e che il campo SERIEDOCUMENTO può essere anche col VALORE NULLO.
Ricordo vagamente l' uso di OR NULL o IS NULL nella query, ma non mi ricordo bene la sintassi.
Apparte questo campo (ancora da inserire), avrei anche i campi TELEFONO, FAX, EMAIL, che anche, avvolte,
possono essere dal valore nullo.

Come devo specificare queste due cose nella query?


Distinti Saluti Fabio Messina

darkeric Profilo | Senior Member

ciao potresti specificare l'errore che ti da? che DB utilizzi?

per la seconda domanda invece ti basta che nel DB specifichi che possono essere NULL

Fako Profilo | Newbie

Se usi SQL SERVER:
per il primo problema nei caratteri speciali come l'apice puoi utilizzare o per c# il carattere di escape \' oppure su vb forse devi raddoppiare il carattere quindi '', oppure fare un replace dei caratteri speciali con un altro.
per il secondo problema se il campo sul database non può essere null allora devi per forza avere un valore quindi :
1. o rendi nullable il campo sul db
2. controlli se prima dell'inserimento il campo è null e metti un valore.
3. puoi inserire sul db un valore di default automatico sul quel campo in modo che se non viene specificato nell'insert allora prende il valore di default.

Ciao

sanbiz Profilo | Senior Member

Il consiglio che ti posso dare è quello di evitare di utilizzare sql dinamico.
Quindi diciamo che scarterei l'idea di crearmi una stringa con l'intera istruzione di insert, non solo per un semplice problema di apici o null, ma per un discorso più complesso e delicato quale l'sql inject (v. http://blogs.dotnethell.it/sandro/SQL-Injection__2111.aspx)

Diciamo, inoltre, che il tuo post è un po' carente di informazioni, in primis: quale database stai utilizzando?

Passiamo ora al lato operativo: come procedere quindi?

Partiamo dal presupposto che la base dati sia SQL, anche se il discorso è molto simile in ambiente Access.
Ti consiglio vivamente di utilizzare (lato server) Stored Procedures in ambiente SQL e query parametriche in Access, in modo da utilizzare degli oggetti Parameters (lato client) che valorizzerai a tuo piacere senza troppi problemi.

Un esempio molto sintetico:
Dim cmd As SqlCommand = cn.CreateCommand
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "miaStoredProcedureSuSQL"
cmd.parameters.add("@mioParametro", SqlDbType.Int).value=mioValoreNumerico
cmd.parameters.add("@mioParametro", SqlDbType.VarChar).value=miaTextBox.text ' potrà contenere anche apici o caratteri strani
cmd.ExecuteNonQuery()

Se il database fosse Access, dovrai semplicemente modificare il namespace facendo riferimento a System.Data.OleDb e non più a System.Data.SQLClient

Dim cmd as OleDBCommand=cn.CreateCommand
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "miaQuerySuAccess"
cmd.parameters.add("@mioParametro", OleDbType.Integer).value=mioValoreNumerico
cmd.parameters.add("@mioParametro", OleDbType.VarChar).value=miaTextBox.text ' potrà contenere anche apici o caratteri strani
cmd.ExecuteNonQuery()

Trovi tutte le indicazioni sui Books On Line sul sito Microsoft

cmd.parameters.add("@mioParametro", SqlDbType.VarChar).value=miaTextBox.text ' potrà contenere anche apici o caratteri strani
cmd.ExecuteNonQuery()
--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

jekisi Profilo | Senior Member

Il db un Mdb.
L' errore è il seguente:

Errore di sintassi (operatore mancante) nell'espressione della query ''SOCIETA' 2006 di Rodonò Giuseppe & C. -S.a.s.', 'Via Castelnuovo n°101', '93010', 'RESUTTANO', 'CL', 'Idem', '3', 'A')'.
Per quanto riguarda un campo con caratteri speciali.

Errore di sintassi (operatore mancante) nell'espressione della query ''CEFALU'', 'PA', 'Idem', '3', ' ')'.

Qui penso che è perchè Serie documento ha un valore null.

Ma che il campo potrebbe essere nullo lo devo specificare sul Dataset?

Distinti Saluti Fabio Messina


sanbiz Profilo | Senior Member

Così è un po' troppo generico. Prova a postare la dichiarazione dell'oggetto command e dell'assegnazione dei rispettivi parametri.


Una precisazione: seguendo la strada dell'oggetto oledbcommand mi aspetto che tu abbia già query di insert parametrica in Access, giusto?

--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

jekisi Profilo | Senior Member

Allego il progetto, qualcuno è può essere gentile nel sistemarmi questa query?

La form interessata è la form4 alla pressione del Button Stampa.

Grazie mille in anticipo.

Distinti Saluti Fabio Messina

sanbiz Profilo | Senior Member

Prima di tutto permettimi un'osservazione: non ha senso utilizzare un datareader per per eseguire una query di eliminazione, nè per query di inserimento.
Io modificherei il sorgente così:

Cn.Open()
sql = "Delete * from Tabella1"
cmd = New OleDb.OleDbCommand(sql, Cn)
cmd.ExecuteNonQuery

sql = "Insert Into ...."
cmd = New OleDb.OleDbCommand(sql, Cn)
cmd.ExecuteNonQuery
Cn.Close()

Questo come prima cosa.
Poi, ripeto, preparerei una query parametrica sul tuo database chiamata per esempio "miaQueryDiInserimento" e definirei un command come di seguito.


cmd = New OleDb.OleDbCommand
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "miaQueryDiInserimento"
cmd.Parameters.Add("@DataConsegna", OleDb.OleDbType.Date).Value = CDate(DATATextBox.Text)
cmd.Parameters.Add("@Cliente", OleDb.OleDbType.VarChar).Value = DITTATextBox.Text
cmd.Parameters.Add("@Indirizzo", OleDb.OleDbType.VarChar).Value = INDIRIZZOTextBox.Text
....
cmd.ExecuteNonQuery()

Nota che utilizzando dei parametri non ti devi preoccupare di gestire le virgolette o apici ecc., basta che gli passi il valore nel formato specificato nella definizione del command.



--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5