Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Query con campi Null
lunedì 09 agosto 2010 - 08.24
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
jekisi
Profilo
| Senior Member
460
messaggi | Data Invio:
lun 9 ago 2010 - 08:24
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
211
messaggi | Data Invio:
lun 9 ago 2010 - 08:42
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
28
messaggi | Data Invio:
lun 9 ago 2010 - 09:00
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
208
messaggi | Data Invio:
lun 9 ago 2010 - 09:22
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
460
messaggi | Data Invio:
lun 9 ago 2010 - 10:44
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
208
messaggi | Data Invio:
lun 9 ago 2010 - 10:57
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
460
messaggi | Data Invio:
mar 10 ago 2010 - 10:47
1427_Per forum.zip
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
208
messaggi | Data Invio:
mar 10 ago 2010 - 11:00
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/
Torna su
Stanze Forum
Elenco Threads
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 !