Ipedire immissione se record gia presente

domenica 24 gennaio 2010 - 21.26

nikkysixx Profilo | Junior Member

*Impedire "-.-

Salve a tutti,avevo un dubbio basilare, in pratica quando inserisco un campo nel database,vorrei che subito dopo l immissione del testo in una textbox,il programma mi dica se il record è presente e in tal caso ripulisca il campo automaticamente

è possibile?

Un altra soluzione sarebbe rendere il campo chiave primaria ma avrei il fastidioso errore di immisione duplicati,che dovrei gestire tramite eccezioni,e trasformare in una msgbox di avviso meno allarmante :D (che non so fare)

Conoscere entrambi i metodi sarebbe molto interessante

Ringrazio chi rispondera' ;)

Jeremy Profilo | Guru

Ciao.
Certo che è possibile .... ma al momento non posso dirti come, perchè dai veramente poche informazioni riguardo la tecnologia che usi per l'interfacciamento con il database.
Aspettiamo tue nuove in merito.

Facci sapere....
Ciao

nikkysixx Profilo | Junior Member

Ah si scusa,hai ragione,cmq i dati li inserisco scrivendo i dati da inserire in alcune textbox vuote, poi viene premuto un pulsante inserisci che apre una OleDbConnection e tramite un nuovo oggetto OleDbCommand creo la mia insert dandogli come parametri il valore delle textbox vuote



Jeremy Profilo | Guru

Ciao.
A dire il vero mi interessava di più sapere se avevi a disposizione una fonte dati disconessa(dataset) il quale avrebbe reso tutto più "pratico".
Ad ogni modo puoi sempre gestire l'evento Validate (o Validating), e fare una select per verificarne l'esistenza.
Qualora avessi a disposizione un dataset potresti iterare i record della tabella od affidarti a LinqToDataset .... l'alternativa è appoggiarti ad un BindingSource il quale mette a disposizione una proprietà Filter da valorizzare secondo i criteri di selezione dei record.


Facci sapere...
Ciao

nikkysixx Profilo | Junior Member

Si,Utilizzo un dataset ,come dovrei procedere?

Jeremy Profilo | Guru

Una possibile soluzione (forse la più semplice) potrebbe essere questa:
Private Bs as new BindingSource Bs.DataSource=TuoDataset.TuaDataTable 'se il dataset è tipizzato oppure Bs.DataSource=TuoDataset.Tables(Indicedellatabella) 'se il dataset non è tipizzato Bs.Filter="Nomecampo = " & Textbox.text If bs.current is nothing then messagobox.show("non c'è") oppure If bs.Count > 0 then messagebox.show("C'è") scegli tu!!!

Facci sapere....
Ciao

nikkysixx Profilo | Junior Member

Grazie per la velocita'delle tue risposte ,cosi è perfetto credo,l unica dubbio è come fare per far partire il tuo codice in automatico,subito dopo l immissione del testo nella textbox...

Jeremy Profilo | Guru

Te l'ho scritto nel mio secondo post ... puoi gestire l'evento Validate (o Validating) della textbox oppure gli eventi LostFocus,Leave .... scegli tu!!.

Facci sapere...
Ciao

nikkysixx Profilo | Junior Member

Ah scusami,ho letto distrattamente saltando alla tua soluzione
Essendo agli inizi ho diversi dubbi,la maggior parte anche banali,ad esempio puoi spiegarmi cosa fa l istruzione validate?

Cmq ora ci provo e t faccio sapere

Jeremy Profilo | Guru

L'evento Validate viene scatenato DOPO la validazione del testo all'interno della textbox ... quindi può essere usato per questo genere di cose.
L'evento Validating viene scatenato PRIMA(o DURANTE come suggerisce la coniugazione) della validazione del testo all'interno della textbox .... quindi può essere usato nel caso in cui vuoi gestire da codice la validazione del testo.
L'evento LostFocus viene generato nel momento in cui il controllo perde il Focus per passare al controllo successivo.
L'evento Leave viene generato nel momento in cui il controllo perde il Focus a prescindere dal fatto che ci sia o meno un controllo successivo(o almeno io deduco questo).
Ad ogni modo maggiori informazioni le puoi trovare su MSDN.

Facci sapere....
Ciao.

nikkysixx Profilo | Junior Member

Allora ho provato,col tuo metodo ma non ci sono riuscito...cosi ho provato leggendomi l msdn, ad inserire sull evento Leave della mia textbox

Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\prova.mdb")
Dim cmd As New OleDbCommand
Dim returnValue As Object

cmd.CommandText = "Select count(1)from editori where nome = " & TextBox1.Text
cmd.CommandType = CommandType.Text
cmd.Connection = conn

conn.Open()

returnValue = cmd.ExecuteScalar()

If returnValue > 0 Then MsgBox("gia presente")
conn.Close()


Dove ho una tabella editori con nome(testo) che vorrei verificare se gia presente
Dov è l errore?

Jeremy Profilo | Guru

"Select count(*) from editori where nome = " & TextBox1.Text

Facci sapere...
Ciao

jtpsala Profilo | Senior Member

Ponendo il caso che nella form tu abbia alcune TextBox collegate ai relativo campi del tuo database potresti gestire l'eventuale presenza dei nuovi dati immessi nell'evento validing delle TextBox in questo modo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

In pratica non fai altro che dichiarare una nuova connessione al database, in questo caso il database è gestito sa SQL Server 2005, effettui una Select dei campi dei valori di tuo interesse, carichi il risultato in un nuovo BindingSource e se la rige righe contenute nel nuovo Binding sono maggiori popoli le tue TextBox con i dati ricavati, mostrando un messaggio, altrimenti non succede nulla e prosegui con il tuo nuovo inserimento....

Spero che ti sia stato utile.
Pippo

Jeremy Profilo | Guru

GetAsyncKey? ...... Addirittura ....
Esagerato ....dai!

jtpsala Profilo | Senior Member

Scusami quello l'avevo utilizzato per un altro scopo:

If e.KeyCode = Keys.Enter Then
' operazioni da eseguire...
End If



Pippo

nikkysixx Profilo | Junior Member

Ecco ora funziona!Il metodo di jeremy è piu semplice e veloce,ma ho trovato comunque molto interessante il codice di jtpsala che mi studiero'senz altro

Ringrazio entrambi

NetDev Profilo | Newbie

-

NetDev Profilo | Newbie

Ciao, ho la stessa necessità dell'autore del topic e sono alle prime armi. Non ho capito bene la soluzione al suo problema.
Con un dataset come si potrebbe fare? Se invece ritienete sia più pratica la soluzione con la quale ha risolto...potete spiegarmela?

Grazie.

Jeremy Profilo | Guru

Avendo a disposizione un Dataset hai 3 soluzioni che al momento mi vengono in mente .....
1) Iterare tutti i records presenti nella datatable e verificarne il contenuto(bruttina!!)
2) Creare un BindingSource al quale "legherai" la datatable del Dataset ed usarne la Proprietà Filter per filtrare i risultati (trovi tutto il codice nei precedenti post)
3) Usare LinqToDataset(forse è meglio la seconda)
Facci sapere .....
Ciao

NetDev Profilo | Newbie

Grazie per la risposta!

Mi confermi quindi che usare un dataset è la via più comoda?
In ogni caso purtroppo non conosco il Binding Source...è troppo chiederti di postare un esempio che potrebbe fare al caso mio?
Dovrei solo impedire l'inserimento di un dato se questo è già presente nel database.

Grazie ancora.

NetDev Profilo | Newbie

Grazie per la risposta!

Mi confermi quindi che usare un dataset è la via più comoda?
In ogni caso purtroppo non conosco il Binding Source...è troppo chiederti di postare un esempio che potrebbe fare al caso mio?
Dovrei solo impedire l'inserimento di un dato se questo è già presente nel database.

Grazie ancora.

Jeremy Profilo | Guru

Ciao.
Non è la via più comoda ..... è una possibile soluzione .... come ti è stato indicato nell'altro post da Alx_81 potresti anche impostare "chiave primaria" o "Unique" il campo nella tabella del Db .... c'è da dire che in quel caso ti verrebbe sollevata un'eccezione che andrebbe poi gestita opportunamente.
Con la mia soluzione, invece, verifichi l'esistenza per evitare che l'eccezione venga sollevata.
Il codice lo avresti trovato qualche post più su di questo ..... ad ogni modo te lo ripropongo qui sotto:
Private Bs as new BindingSource Bs.DataSource=TuoDataset.TuaDataTable 'se il dataset è tipizzato oppure Bs.DataSource=TuoDataset.Tables(Indicedellatabella) 'se il dataset non è tipizzato Bs.Filter="Nomecampo = " & Textbox.text If bs.current is nothing then messagobox.show("non c'è") oppure If bs.Count > 0 then messagebox.show("C'è") scegli tu!!!

Facci sapere...
Ciao

NetDev Profilo | Newbie

Ciao,

>come ti è stato indicato nell'altro post da Alx_81 potresti anche
>impostare "chiave primaria" o "Unique" il campo nella tabella
>del Db .... c'è da dire che in quel caso ti verrebbe sollevata
>un'eccezione che andrebbe poi gestita opportunamente.

Infatti il prossimo passo è capire come gestire questa eccezione.

>Con la mia soluzione, invece, verifichi l'esistenza per evitare
>che l'eccezione venga sollevata.
>Il codice lo avresti trovato qualche post più su di questo .....
>ad ogni modo te lo ripropongo qui sotto:
>
>Private Bs as new BindingSource
>Bs.DataSource=TuoDataset.TuaDataTable 'se il dataset è tipizzato
>oppure
>Bs.DataSource=TuoDataset.Tables(Indicedellatabella) 'se il dataset
>non è tipizzato
>Bs.Filter="Nomecampo = " & Textbox.text
>
>If bs.current is nothing then messagobox.show("non c'è")
>oppure
>If bs.Count > 0 then messagebox.show("C'è")

Mi interesserebbe capire anche la tua soluzione. Lo avevo visto il codice e avevo postato proprio per averne la spiegazione. :)

Grazie!

Jeremy Profilo | Guru

Ciao.
La spiegazione sta nel codice stesso ..... ma se non ti è chiaro qualcosa ....potresti farmi qualche domanda un pò più specifica.

Facci sapere...
Ciao

NetDev Profilo | Newbie

Ti ringrazio, lo avevo visto il codice ma temo di aver bisogno di una spiegazione completa...non mi è chiaro esattamente cosa faccia.

Grazie ancora.

Jeremy Profilo | Guru

Ciao
Il codice che ho scritto, crea un oggetto BindingSource che è una sorta di "Lista di records" .... la proprietà Filter del BindingSource, permette di filtrare i record presenti, in funzione di alcuni criteri scritti come stringa e con una sintassi simile ad un Query.
Ciao
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5