[VB.NET] Utilizzare una funzione all'interno di una query di selezione...

mercoledì 16 settembre 2009 - 12.05

Carlotta87 Profilo | Newbie

Ciao a tutti,
sono nuova nel forum. Ho praticamente scaravoltato tutto Internet ma non sono riuscita a trovare una soluzione al mio problema; premetto che programmo da pochissimo con VB.NET quindi può anche darsi che io non abbia capito niente, per cui vi chiedo di avere pazienza.
Allora: ho crato un'applicazione che si connette a un database Access [2002] molto semplice. Riesco a popolare il database tranquillamente attraverso OleDbConnection e le varie query di selezione, update, delete ecc. Il problema sorge nel momento in cui cerco di eseguire una query di selezione che utilizza una funzione che ho creato io all'interno di un modulo. Vi posto il codice della query e del modulo che contiente la funzione incriminata chiamata Levenshtein:

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


TermineRiga(x) fa parte di un array di stringhe che viene esaminato attraverso un ciclo For in cui cerco di eseguire la query che dovrebbe utilizzare TermineRiga(x) per confrontarla con i record della mia tabella.

Module Algoritmo Function Min3(ByVal a As Integer, ByVal b As Integer, ByVal c As Integer) As Integer Dim temp As Integer temp = a If b < temp Then temp = b If c < temp Then temp = c Min3 = temp End Function 'algoritmo di Levenshtein per calcolare la similitudine tra due stringhe Public Function Levenshtein(ByVal a As String, ByVal b As String) As Integer Dim d(,) As Integer Dim i As Integer, j As Integer Dim c As Integer If Len(a) = 0 Then Levenshtein = Len(b) Exit Function End If If Len(b) = 0 Then Levenshtein = Len(a) Exit Function End If ReDim d(0 To Len(a), 0 To Len(b)) For i = 0 To Len(a) d(i, 0) = i Next i For j = 0 To Len(b) d(0, j) = j Next j For i = 1 To Len(a) For j = 1 To Len(b) If Mid$(a, i, 1) = Mid$(b, j, 1) Then c = 0 Else c = 1 End If d(i, j) = Min3(d(i - 1, j) + 1, d(i, j - 1) + 1, d(i - 1, j - 1) + c) Next j Next i Levenshtein = d(Len(a), Len(b)) End Function End Module

Nel programma la funzione Levenshtein viene vista tranquillamente il problema è che quando cerco di eseguire la query
cmd.ExecuteNonQuery()
mi si presenta il seguente errore: Funzione 'Levenshtein' non definita nell'espressione.
Ora è molto probabile che io stia sbagliando qualcosa, ma non ho trovato nulla che possa aiutarmi a capire come devo fare per utilizzare questa funzione nella query. Mi potete aiutare?
Abbiate pazienza!
ciao, carlotta

luigidibiasi Profilo | Guru

Ciao,

>>Il problema sorge nel momento in cui cerco di eseguire
>una query di selezione che utilizza una funzione che ho creato
>io all'interno di un modulo. Vi posto il codice della query e
>del modulo che contiente la funzione incriminata chiamata Levenshtein:

La funzione levenshtein è locale al progetto VB.NET ... il motore di database access non la conosce ( e non credo implementi funzioni del genere) quindi non puoi passarla tramite la stringa sql. (se la implementa cercati il nome ed è fatta!)

>>(non so se sia possibile definire funzioni o stored in access quindi ti consiglio la soluzione più semplice)

Carica in memoria tutti i dati usando la query semplice

>sql = "SELECT [Codice voce],[Nome termine] FROM [Associazione PDC - Lista termini]

ti carichi due strutture di tipo dizionario KEY=[Codice Voce] VALUE= [Nome Termine]

dim dict1 as dictionary(of string,string)
dim dict2 as dictionary(of string,string)


[ciclo di read sui risultati della query] (while oggettoRecordset.read o non so come li stai scorrendo...)
dict1.add(CodiceVoce,CampoDAConfrontare)
dict2.add(CodiceVoce,CampoDAConfrontare)
[fine ciclo] (end while)


Essendo i due dizionari uguali ti basta scorrerne uno con un ciclo for each : (ipotizzo codicevoce stringa)

dim RisultatiFiltrati as arraylist=new arraylist
dim it as keyvaluepair(of string,string)
for each it in Dict1

if Levenshtein(it.value,dict2(it.key))>0
'
RisultatiFiltrati.add(it.key) ' Levenshtein ritorna > 0 quindi è un risultato che ci interessa
end if

next it


Alla fine del ciclo RisultatiFiltrati conterrà solo i [Codice Voce] che soddisfano il filtro Levenshtein > 0

scusa per la poca chiarezza del codice ma non mi son mai collegato con .net ad un db access :D

Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/
http://www.dibiasi.it/

Carlotta87 Profilo | Newbie

Grazie! proverò a far così e poi ti so dire!

Carlotta87 Profilo | Newbie

Eccomi qui: Luigidibiasi sono riuscita a fare come mi avevi suggerito, grazie mille dell'aiuto! 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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5