Pssare ArrayList a funzioni

lunedì 05 gennaio 2009 - 00.34

ans66 Profilo | Junior Member

Non riesco a passare i valori di due ArrayList a due funzioni e cioe` var & TpPar che rimangono putroppo sempre = nothing. Non comprende dove sto sbagliando. Grazie per l'aiuto.

Dim var As New ArrayList
var.Add(DaTrovare)
var.Add(TextBox1.Text)

'tipo param=0 String
' 1 Date
' 2 Integer
' 3 currency
Dim TpPar As New ArrayList
TpPar.Add(0)
TpPar.Add(1)

dt = LanciaQ(QNorm, QualiQ, var, Quer, TpPar)

'Funzione 1
--------------------------
Public Function LanciaQ(ByVal QNorm As String, ByVal QQ As Integer, Optional ByVal Variabili As ArrayList = Nothing, _
Optional ByVal QStringa As String = vbNullString, _
Optional ByVal tipoParam As ArrayList = Nothing) As System.Data.DataTable

Dim dt As New System.Data.DataTable
Try

Select Case QQ
Case Is = 0
dt = RilasciaDataSet_connParam2(QNorm)
Case Is = 1
dt = RilasciaDataSet_connParam2(QStringa)
If dt.Rows.Count >= 1 AndAlso Not DBNull.Value.Equals(dt.Rows(0).Item(0)) _
Then nrRec = RilasciaNrRec(dt.Rows(0).Item(0), QNorm)
Case Is = 2
dt = RilasciaDataSet_connParam2(QStringa)
nrRec = 0
Case Else
dt = RilasciaDataSet_connParam2(QNorm)
End Select


Return dt

Catch ex As Exception
GestioneErrori(Err.Number, ex, "LanciaQ")
Return dt
End Try

End Function

Funzione 2
-------------------------------------------
Public Function RilasciaDataSet_connParam2(ByVal stringaArriv As String, Optional ByVal Variabili As ArrayList = Nothing, Optional ByVal tipoParam As ArrayList = Nothing) As System.Data.DataTable
Dim dt As New System.Data.DataTable
Dim ds As New System.Data.DataSet
Dim prm As New OleDb.OleDbParameter
'tipo param=0 dbstring
' 1 Date
' 2 Integer
' 3 currency

Try
' ci sono variabili passate con ? Variabili() non e` null
'If Not DBNull.Value.Equals(Variabili(0)) Then
If Not IsNothing(Variabili) Then
OleDbConnection1.ConnectionString = connDB
Dim da As New Data.OleDb.OleDbDataAdapter
Dim objCmd As New OleDb.OleDbCommand(stringaArriv, OleDbConnection1)

For i As Integer = 0 To Variabili.Count - 1
If IsNothing(tipoParam) OrElse tipoParam.Item(0) = 0 Then
prm = New OleDb.OleDbParameter
prm.DbType = DbType.String
prm.Value = Variabili.Item(i)
objCmd.Parameters.Add(prm)
ElseIf tipoParam.Item(i) = 1 Then
prm = New OleDb.OleDbParameter
prm.DbType = DbType.DateTime
prm.Value = Variabili.Item(i)
objCmd.Parameters.Add(prm)
ElseIf tipoParam.Item(i) = 2 Then
prm = New OleDb.OleDbParameter
prm.DbType = DbType.Int32
prm.Value = Variabili(i)
objCmd.Parameters.Add(prm)
ElseIf tipoParam.Item(i) = 3 Then
prm = New OleDb.OleDbParameter
prm.DbType = DbType.Currency
prm.Value = Variabili.Item(i)
objCmd.Parameters.Add(prm)
End If
Next

da = New Data.OleDb.OleDbDataAdapter(objCmd)
da.Fill(ds)
dt = ds.Tables(0)

If dt.Rows.Count = 0 Then
NonceDataTable = True
Else
NonceDataTable = False
End If

Else
' Non ci sono variabili passate con ? Variabili() e` null
OleDbConnection1.ConnectionString = connDB
OleDbCommand1.CommandText = stringaArriv

OleDbCommand1.Connection = OleDbConnection1
OleDbDataAdapter1.SelectCommand = OleDbCommand1

OleDbDataAdapter1.Fill(ds)

dt = ds.Tables(0)

If dt.Rows.Count = 0 Then
NonceDataTable = True
Else
NonceDataTable = False
End If

End If

Return dt

Catch ex As Exception
GestioneErrori(Err.Number, ex, "RilasciaDataSet_connParam")
Return dt
End Try
End Function
Rispondi citando Nuovo messaggio


luigidibiasi Profilo | Guru

Ciao,
ma i riferimenti a nothing te li ritrovi nella seconda funzione giusto?

LanciaQ la chiami correttamente passandogli tutti i parametri però all'interno di quest'ultima quando richiami RilasciaDataSet_connParam2 passi solo il primo argomento lasciando gli altri opzionali con il valore di default nothing.

credo tu debba modificare questa chiamata all'interno di lanciaQ
>dt = RilasciaDataSet_connParam2(QNorm)
con questa
>dt = RilasciaDataSet_connParam2(QNorm,variabili,tipoParam)


ans66 Profilo | Junior Member

Grazie..avevi ragione ho corretto

ans66 Profilo | Junior Member

Ciao LuigiDiBiasi,

Partendo dalla funzione che hai visto sto cercando di creare una mia libreria per inserimento / aggiornamento / cancellazione. Tutto bene con Insert, quando faccio partire SelectCommand con parametri ho questo errore: [Fill: la proprietà SelectCommand.Connection non è stata inizializzata]. Allego il codice.

luigidibiasi Profilo | Guru

Ciao,
non ho VS sottomano per poter provare il codice ma a occhio credo che il problema si verifichi sia con la select con parametri (case IS=EnumQuery.SelectWithParameter) che con quella senza parametri ( Case Is = EnumQuery.SelectWithoutParameter) perchè mi sembra di notare che manchi l'apertura della connessione cosa che invece fai con in insert-update-delete (case 0 or 2 )

Prova inserendo OleDbCon.Open() dopo la riga OleDbCon.ConnectionString = ConnDB


Return Nothing Case Is = EnumQuery.SelectWithParameter ' Select con Parametri OleDbCon = New OleDb.OleDbConnection OleDbCon.ConnectionString = ConnDB '' qui manca l'apertura della connessione OleDbCon.Open() OleDbAdpt = New OleDb.OleDbDataAdapter Oledbcom = New OleDb.OleDbCommand(Quer, OleDbCon) LanciaParametri(prm, StrutDaPassare) OleDbAdpt = New Data.OleDb.OleDbDataAdapter(Oledbcom) OleDbAdpt.Fill(ds) 'errore dt = ds.Tables(0) Return dt

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

ans66 Profilo | Junior Member

ciao,

Anch'io ci avevo pensato. Ho provato un po' tutto anche l'apertura della connessione ma il problema persiste ti faccio vedere:
(Ho verificato il passaggio dei parametri con un ciclo For Next e oledbcom.Parameter(i).Value)

OleDbCon = New OleDb.OleDbConnection
Oledbcom = New OleDb.OleDbCommand

OleDbCon.ConnectionString = ConnDB
Oledbcom.CommandText = Quer
Oledbcom.Connection = OleDbCon

OleDbCon.Open()
LanciaParametri(prm, StrutDaPassare)
OleDbAdpt.SelectCommand = Oledbcom
OleDbAdpt.Fill(ds) 'errore
dt = ds.Tables(0)
Beep()
MessageBox.Show(MsAfineAz, MsAfineAz, MessageBoxButtons.OK, MessageBoxIcon.Information)
MessageBox.Show(dt.Rows.Count)
Return dt

ans66 Profilo | Junior Member

Ho risolto con un approccio diverso:

LanciaParametri(prm, StrutDaPassare)
OleDbAdpt = New OleDb.OleDbDataAdapter(Oledbcom) 'parametri passati
OleDbAdpt.SelectCommand.CommandText = Quer
OleDbAdpt.SelectCommand.Connection = OleDbCon
OleDbCon.Open()
OleDbAdpt.SelectCommand.ExecuteNonQuery()
OleDbAdpt.Fill(ds) 'errore
dt = ds.Tables(0)
Beep()

cosi` funziona

Grazie
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