[ASP.Net] query parametrizzate

venerdì 31 marzo 2006 - 09.00

BrandonHeat Profilo | Junior Member

Ciao!!
Il mio programma si appoggia ad un db di access, la cosa che volevo fare è fare elaborare i dati direttamente dal db (passando alle query i parametri necessari direttamente da codice) anzichè farli elaborare dalla pagina web stessa..
Come posso fare? Premetto che uso ADO per la connessione al db..
Grazie mille, spero possiate aiutarmi a risolvere il mio problemuccio..
Ciao!!
Brandon Heat

alx_81 Profilo | Guru

Ciao!
tu vorresti elaborare i dati passati da web con logiche access piuttosto che elaborarle sul web stesso?
ho capito bene?
Ad esempio stored procedure in access?
Alx81 =)

BrandonHeat Profilo | Junior Member

Ciao!
Si, vorrei fare delle query direttamente in access, (quindi i dati vengono elaborati dal motore di access) e da codice vorrei passare a queste query i parametri necessari per farle eseguire..
Per la connessione al db uso ado..
Grazie mille!!
Ciao!!
Brandon Heat

alx_81 Profilo | Guru

Se si tratta di cose semplici (tipo un passaggio di parametri), basta utilizzare l'oggetto command e passare i parametri al comando.

Ad esempio:

QUERY ACCES
select * from tabella where id = ? and data = ? (puoi fare anche insert, delete e update)

IN VB
imports system.data.oledb

...

'crei la connessione
'crei il command (objcmd ad esempio)

objcmd.parameters.Add("@par1",OledbDataType.Integer).value = tuavariabileID
objcmd.parameters.Add("@par2",OledbDataType.Date).value = tuavariabileData

Dim dr as oledbdatareader = objcmd.executereader()
'nel dr hai i dati (se si tratta di una select)

se si tratta di logiche più impegnative, credo tu debba scrivere stored procedure in access, ma non posso esserti di aiuto..



Alx81 =)

BrandonHeat Profilo | Junior Member

Innanzitutto grazie mille..
io ho fatto così, è una cosa semplice ma non mi funziona magari mi sai dire il perchè:

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

Quando arrivo all'istruzione command.parameters.append.. il programma mi va in errore..cosa sbaglio?Come modifico il codice?Inoltre ho notato che command.parameters.add..non esiste come istruzione, ho solo append..uso visual studio 2005 e magari nn c'è..
Ti ringrazio davvero per il tuo aiuto!!
Ciao!!!
Brandon Heat

alx_81 Profilo | Guru

tu usi ado, non ado.net..

ho capito..


io userei l'oledbcommand di ado.net..
e se non lo conosci ti esorto a documentarti =)


cmq.. che errore ti da?
Alx81 =)

BrandonHeat Profilo | Junior Member

L'errore che mi da è:

InvalidCastException was unhandled by user code
Unable to cast COM object of type 'ADODB.InternalParameter' to class type ''. Instances of types that represent COM components cannot be cast to types that do not represent COM components; however they can be cast to interfaces as long as the underlying COM component supports QueryInterface calls for the IID of the interface.

Il fatto è che non riesco ad usare ado.net, se creo oledb non funziona..
Grazie...
Brandon Heat

alx_81 Profilo | Guru

eccoti lo script rivisitato =)

Dim rsUtenti As New ADODB.Recordset
Dim con As New ADODB.Connection
Dim rsAssegnazioni As New ADODB.Recordset
Dim strCon As String
Dim strsql As String
Dim command As New ADODB.Command
Dim testo As String

strCon = "connstring"
con.Open(strCon)
command.ActiveConnection = con
testo = ""
strsql = "Select * from tabella"
rsUtenti.Open(strsql, con)
'non serve, c'è già il ciclo
'If Not rsUtenti.EOF Then
'-------------------------------
'inutile
'rsUtenti.MoveFirst()
'-------------------------------
Do While Not rsUtenti.EOF
command.CommandText = "Select * from tabella"
command.Parameters.Append(command.CreateParameter("primo", ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamInput, 10))
command.Parameters.Append(command.CreateParameter("secondo", ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamInput, 10))
rsAssegnazioni.Open(command)
'Inutile vedi sopra
'If rsAssegnazioni.EOF = False And rsAssegnazioni.BOF = False Then
'rsAssegnazioni.MoveFirst()
Do While Not rsAssegnazioni.EOF
testo = testo & rsUtenti.Fields("datalogin").Value & ";" & rsAssegnazioni.Fields("userid").Value & vbCrLf
rsAssegnazioni.MoveNext()
Loop
'End If
rsAssegnazioni.Close()
rsUtenti.MoveNext()
Loop
'End If
rsUtenti.Close()
Alx81 =)

BrandonHeat Profilo | Junior Member

Ok ti ringrazio..volendo usare ado.net invece come faccio?
Ti rompo le palle per l'ultima volta..
Grazie mille!!!!
Brandon Heat

alx_81 Profilo | Guru

modalità connessa

'Dim rsUtenti As New ADODB.Recordset
Dim DrUtenti As OleDbDataReader
'Dim con As New ADODB.Connection
Dim objConn As New OleDbConnection("Provider=SQLNCLI.1;Integrated Security=SSPI;Initial Catalog=TESTS;Data Source=CREMS44\SQLEXPRESS")
objConn.Open()
'Dim rsAssegnazioni As New ADODB.Recordset
Dim DrAssegnazioni As OleDbDataReader
Dim strsql1 As String = "Select * from logins"
Dim strsql2 As String
'Dim command As New ADODB.Command
Dim objCmd1 As New OleDbCommand(strsql1, objConn)
Dim objCmd2 As OleDbCommand
Dim testo As String

'con.Open(strCon)
'Command.ActiveConnection = con
testo = ""


'rsUtenti.Open(strsql, con)
DrUtenti = objCmd1.ExecuteReader()
Do While DrUtenti.Read()

'aggiungi i filtri come facevi prima
strsql2 = "Select * from logins"

objCmd2 = New OleDbCommand(strsql2, objConn)

'Command.Parameters.Append(Command.CreateParameter("primo", ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamInput, 10))
'Command.Parameters.Append(Command.CreateParameter("secondo", ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamInput, 10))
objCmd2.Parameters.Add("primo", OleDbType.VarChar, 10).Value = DrUtenti("UserId")
objCmd2.Parameters.Add("secondo", OleDbType.VarChar, 10).Value = DrUtenti("datalogin")

'rsAssegnazioni.Open(Command)
DrAssegnazioni = objCmd2.ExecuteReader()

Do While DrAssegnazioni.Read()
testo = testo & DrAssegnazioni("userid").ToString() & ";" & DrAssegnazioni("userid").ToString() & vbCrLf
Loop

objCmd2.Dispose()
Loop



modalità disconnessa (db in memoria locale)

'Dim rsUtenti As New ADODB.Recordset
Dim DtUtenti As New DataTable
'Dim con As New ADODB.Connection
Dim objConn As New OleDbConnection("Provider=SQLNCLI.1;Integrated Security=SSPI;Initial Catalog=TESTS;Data Source=CREMS44\SQLEXPRESS")
objConn.Open()
'Dim rsAssegnazioni As New ADODB.Recordset
Dim DtAssegnazioni As New DataTable
Dim strsql1 As String = "Select * from logins"
Dim strsql2 As String
'Dim command As New ADODB.Command
Dim objCmd1 As New OleDbCommand(strsql1, objConn)
Dim objCmd2 As OleDbCommand
Dim DA1 As New OleDbDataAdapter(objCmd1)
Dim DA2 As OleDbDataAdapter
Dim Dr1 As DataRow
Dim Dr2 As DataRow
Dim testo As String

'con.Open(strCon)
'Command.ActiveConnection = con
testo = ""


'rsUtenti.Open(strsql, con)
DA1.Fill(DtUtenti)
For Each Dr1 In DtUtenti.Rows
strsql2 = "Select * from logins"

objCmd2 = New OleDbCommand(strsql2, objConn)

'Command.Parameters.Append(Command.CreateParameter("primo", ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamInput, 10))
'Command.Parameters.Append(Command.CreateParameter("secondo", ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamInput, 10))
objCmd2.Parameters.Add("primo", OleDbType.VarChar, 10).Value = Dr1("UserId")
objCmd2.Parameters.Add("secondo", OleDbType.VarChar, 10).Value = Dr1("datalogin")

DA2 = New OleDbDataAdapter(objCmd2)
'rsAssegnazioni.Open(Command)
DA2.Fill(DtAssegnazioni)

For Each Dr2 In DtAssegnazioni.Rows
testo = testo & Dr2("userid").ToString() & ";" & Dr2("userid").ToString() & vbCrLf
Next

objCmd2.Dispose()
Next



se ti può andare...
e ora pretendo un "accetta la risposta"
Alx81 =)

BrandonHeat Profilo | Junior Member

Grazie mille per la tua pazienza e per la tua soluzione!
Ti sono debitore!!

Ed ora si che avrai il tuo "Accetta risposta", ci mancherebbe altro!!!
Grazie ancora!!!
Ciao!!
Brandon Heat

BrandonHeat Profilo | Junior Member

Scusami, sarò un rompiballe però ho provato quanto mi hai suggerito e non funziona!
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Scusa davvero se ti rompo ancora, però non so come farlo funzionare!
Grazie mille!!
Brandon Heat

alx_81 Profilo | Guru

dvi impostare i parametri per il command 1..
così non funziona proprio perchè non li hai dichiarati..
io nn li ho messi perchè nn avevo parametri..
ma tu devi farlo..ok???

devi usare la parameters.add(),
come ho fatto all'interno dl ciclo..

scusami se ti rispondo di fretta.. ma sono in aeroporto e torno dall'irlanda fa unasettimana.. ok?

ciao!!!
Alx81 =)

BrandonHeat Profilo | Junior Member

Figurati, non devi scusarti di nulla, sei già fin troppo gentile a portare pazienza e ad aiutarmi!!
Cmq ho aggiunto i due parametri, con il parameters.add (gli ho aggiunti prima dell'istruzione drutenti=objcmd1.executereader()).. ora però mi da un errore del tipo "NullReferenceException was unhandled by user code - Object reference not set to an instance of an object"..come faccio a far si che non mi dia più errori e funzioni correttamente?Queste maledette query parametriche mi stanno uccidendo!
Grazie mille per la tua disponibilità!!!
Ciao!!!
Brandon Heat

alx_81 Profilo | Guru

ciao! sono tornato..
hai provato?
Alx81 =)

BrandonHeat Profilo | Junior Member

Ciao!Bentornato!!
E' andato bene il viaggio?spero di si!!
Comunque non sono ancora riuscito a risolvere purtroppo..Sto davvero impazzendo!Ho provato anche quest'altro codice ma nn mi funziona:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

C'è da dire che quest'errore me lo da da quando ho inserito la riga cmd.CommandType=Data.CommandType.StoredProcedure, senza quella riga invece mi da il solito errore, cioè mancano alcuni valori per alcuni parametri necessari..nn so più che fare purtroppo, spero che mi aiuterai a risolvere questo dilemma atroce..
Grazie mille!

Brandon Heat

alx_81 Profilo | Guru

prova così..

Dim testo As String = ""
Dim appdataInizio As String, appdataFine As String
'Dim dataInizio, dataFine --> i tipi!!!!
'inutile --> Dim dataInizio As Date, dataFine As Date
'Dim con --> i tipi!!!!
Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Prova.mdb;Persist Security Info=False")
'inutile
'Dim strCon As String
'strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Prova.mdb;Persist Security Info=False"
'con = New OleDbConnection
'con.connectionstring = strCon
'inutile --> Dim prm As OleDbParameter
Dim drQuery As OleDbDataReader
'la connesione la passo nel costruttore
con.Open()
Dim cmd As New OleDbCommand("Select * from Query where (DataInizio < ?) and (DataFine > ?)", con)

appdataInizio = "01/12/2005"
appdataFine = "31/12/2005"

' non è una stored procedure ma una query normale
'cmd.CommandType = Data.CommandType.StoredProcedure
'aggiungo i parametri
cmd.Parameters.Add("datainizio", OleDbType.Date).Value = Convert.ToDateTime(appdataInizio)
cmd.Parameters.Add("datafine", OleDbType.Date).Value = Convert.ToDateTime(appdataFine)
'prm = New OleDbParameter
'prm.Direction = Data.ParameterDirection.Input
'prm.DbType = Data.DbType.Date
'appdataInizio = "01/12/2005"
'appdataFine = "31/12/2005"
'dataInizio = Convert.ToDateTime(appdataInizio)
'dataFine = Convert.ToDateTime(appdataFine)
'prm.Value = dataInizio
'cmd.Parameters.Add(prm)
'prm = New OleDbParameter
'prm.Direction = Data.ParameterDirection.Input
'prm.DbType = Data.DbType.Date
'prm.Value = dataFine
'cmd.Parameters.Add(prm)
'cmd.Connection = con
'con.open()
'qui mi da errore : conversion from string "Select * from Query" to type integer is not valid
drQuery = cmd.ExecuteReader()
testo = ""
Do While (drQuery.Read)
testo += drQuery("SerialNumber").tostring + Chr(9) + drQuery("DataInizio").ToString + Chr(9) + drQuery("DataFine").ToString
Loop
drQuery.Close()
con.Close()
'il dispose
con.Dispose()
Alx81 =)

BrandonHeat Profilo | Junior Member

Il problema era che bisognava mettere il nome della query a cui si faceva riferimento nel cmd.commandtext..in questo modo funziona!!!
Grazie mille per la tua disponibilità e il tuo aiuto!!!
Ciao grazie ancora!!!!!!!
Brandon Heat
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