Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con Store_Procedure SQL Server

Ciao a Tutti!!!
Ho creato una Stored_Procedure di Aggiornamento con SQL Server.
Il mio problema consiste nel richiamare questa procedura in VB, in cui devo
passare due paramentri, mvarIDLingua e mvarLingua.
Per ora ho scritto cosě:
 
      Dim cmd As New ADODB.Command
      Dim mioPar As New ADODB.Parameter
      Dim rs As New ADODB.Recordset
 
      cmd.ActiveConnection = miaConn
      cmd.CommandText = "sp_AggiornaLingua"
      cmd.CommandType = adCmdStoredProc
      Set rs = cmd.Execute(, mvarIDLingua)
 
      Set rs = Nothing
      Set cmd = Nothing
ma non va bene:(. Come si potrebbe fare?
Grazie a Tutti!!!!!
 
--------------------------------
Inviato via 
http://usenet.libero.it

Prova con
cmd.CommandText = "sp_AggiornaLingua " &  mvarIDLingua & "," & mvarLingua.

 cmd.CommandText = "sp_AggiornaLingua " & mvarIDLingua & "," & mvarLingua.
 
In questo modo mi dice: "Errore di sintassi".
Grazie lo stesso!


Devi usare gli oggetti parameter per passare gli argomenti
alla tua stored procedure ... altirmenti non funge.
Se guardi sulla documentazione on line ci sono degli esempi
molto chiari.
Alternativa puoi usare solamente l'oggetto command, passando
il commandtext in cui dentro utilizzi la stored procedure di sql
server chiamata sp_executesql che ti permette di passare
in un unica chiamata tutto quanto.
Il pro č che č piů veloce e la stored sql mette in cache il comnando
cosě che poi alla successiva chiamata deve solo eventualmente
cambiare gli argomenti con quelli nuovi che gli fornisci ... il contro
č che deve perdere un pň di tempo per farti una funzioncina
che ti crea la stringa da passare al commandtext in maniera
sintatticamente corretta tanto per vb che per sql server.
Saluti
Andrea

Sto utilizzando i parametri come hai detto tu, ma mi ha generato un errore,
quando vado a passargli il secondo parametro,"Il tipo di valore utilizzato
dall'applicazione non è valido per l'operazione corrente", che significa?


 In questo modo mi dice: "Errore di sintassi".
Molto strano.
Al limite, prova a mettere:
cmd.CommandText = "exec sp_AggiornaLingua " & mvarIDLingua & "," &
mvarLingua
Una annotazione: mvarIDLingua e mvarLingua sono numerici senza decimali, per
cui è più corretto usare cstr(....).
Se non sono numerici senza decimali, ad esempio hanno i decimali, o peggio
ancora sono stringhe, va modificata la cosa.
Ciao
Alberto

 Grazie a Tutti!!!!!
Prego
Andrea

Dunque, hai ragione, sucsa, perchè non ho postato di nuovo il codice,
 ora ho scritto così:
Dim cmd As New ADODB.Command
      Dim mioPar As New ADODB.Parameter
      Dim rs As New ADODB.Recordset
 
      cmd.ActiveConnection = miaConn
      cmd.CommandText = "sp_AggiornaLingua"
      cmd.CommandType = adCmdStoredProc
      cmd.parameters(0).value= mvarIDLingua
      cmd.parameters(1).value= mvarIDLingua
      Set rs = cmd.Execute(, mvarIDLingua)
 
      Set rs = Nothing
      Set cmd = Nothing
 
e l'errore "Il tipo di valore utilizzato dall'applicazione non è valido per
l'operazione corrente", ora viene generato sul secondo parametro.
Mi chiedo, potrebbe dipendere dalla store_procedure?
Codice della store_procedure:
CREATE PROCEDURE [sp_AggiornaLingua]
 (@mioIDLingua [int],
  @miaLingua [varchar](50))
 
AS UPDATE [dbArchivio].[dbo].[tbLingue]
 
SET [Lingua] = @miaLingua
 
WHERE
 ( [IDLingua] = @mioIDLingua)
GO


   @miaLingua [varchar](50))
Secondo me ti stai incasinando pesantemente con i tipi di variabili.
Verifica cosa è stringa e cosa è intero.
Ciao
Alberto

Scusate, il secondo parametro è Lingua no IDLingua.
 
  cmd.parameters(1).value= mvarLingua



Allora prova ad eseguire senza ripetere inutilmente un parametro, che tra
l'altro mi sembra anche in una posizione sbagliata:
Set rs = cmd.Execute
Ciao
Alberto

Significa che nel dichiarare l'oggetto parameter ... quando
gli specifichi di che tipo è la colonna che conterrà quel
dato ... devi verificare che il dato sia compatibile con
il db ... altrimenti ti genera l'errore che segue.
Per chiarirci ... non puoi specificare ad ado che stai passando
una data e gli dici di utilizzare un dato di tipo advarchar.
Ciao
Andrea

Dunque ho cambiato, i parametri li passo cosě:
Dim cmd As New ADODB.Command
Dim mioPar As New ADODB.Parameter
Dim rs As New ADODB.Recordset
 
      cmd.ActiveConnection = miaConn
      cmd.CommandType = adCmdStoredProc
      cmd.CommandText = "Exec sp_AggiornaLingua ?,?"
      cmd.Parameters.Append cmd.CreateParameter("mioIDLingua", adBigInt,
adParamInput, , mvarIDLingua)
      cmd.Parameters.Append cmd.CreateParameter("miaLingua", adWChar,
adParamInput, 50, mvarLingua)
           Set rs = cmd.Execute()
 
      Set rs = Nothing
      Set cmd = Nothing
ma mi dice argomento non facoltativo nell'esecuzione del command. Che dovrei
fare?


 fare?
Insisto.
Ma sei sicura che non funzioni:
Dim cmd As New ADODB.Command
Dim mioPar As New ADODB.Parameter
Dim rs As New ADODB.Recordset
      cmd.ActiveConnection = miaConn
      cmd.CommandType = adCmdStoredProc
      cmd.CommandText = "Exec sp_AggiornaLingua " & cstr(mvarIDLingua) &
",'" & left(replace(mvarLingua,"'","''"),50) & "'"
      Set rs = cmd.Execute()
      Set rs = Nothing
      Set cmd = Nothing
Secondo me deve funzionare....
Ciao
Alberto

 ha scritto nel messaggio
Dimenticavo. Si scrive:
Set cmd.ActiveConnection = miaConn
anzichè
cmd.ActiveConnection = miaConn
Ciao
Alberto

Ho fatto come dici tu ma non funziona:(
Genera errore qua :
 cmd.CommandText = "Exec sp_AggiornaLingua " & cstr(mvarIDLingua) &
",'" & left(replace(mvarLingua,"'","''"),50) & "'"
dicendo:"Errore di sintassi o violazione di accesso ai dati".
Grazie cmq!


 dicendo:"Errore di sintassi o violazione di accesso ai dati".
Dà errore nella composizione della stringa?
Prima ancora dell'Execute?
Allora dimentichiamo Sql-Server, che non ha assolutamente colpa.
Concentriamoci sui tipi dei dati.
Prova a scrivere:
Debug.Print mvarIDLingua
Debug.Print mvarLingua
prima della riga che hai riportato sopra, e postami il risultato.
Ciao
Alberto

 Debug.Print mvarLingua
"cinese"
i valori sono giusti, ma l'errore è sempre quello: "Errore di sintassi o
violazione di accesso".
Non capisco cosa c'è che non va!:(


 Set rs=cmd.Execute
A questo punto, ultimo tentativo.
Se la tua Stored Procedure non ritorna record, togli il Set rs=
Togli anche il cmd.commandtype
Diventa:
Dim cmd As New ADODB.Command
Dim mioPar As New ADODB.Parameter
      set cmd.ActiveConnection = miaConn
      cmd.CommandText = "Exec sp_AggiornaLingua " & cstr(mvarIDLingua) &
",'" & left(replace(mvarLingua,"'","''"),50) & "'"
      cmd.Execute()
      Set cmd = Nothing

       cmd.Execute()
Scusa:
cmd.Execute
(senza parentesi)
Ciao
Alberto

Grandeeee Alberto!!!!!!!!!!
Funziona tutto!!!! Inserimento, modifica e cancellazione dei dati!!!!! Non
mi sembra vero:)
Due curiosità:
1) perchè la procedura funziona non usando il recordset? anche sulla guida
il recordset e il command vengono usati insieme per richiamare la
store_procedure.
2) Tu hai scritto Dim mioPar As New ADODB.Parameter, ma se poi non si usa
perchè viene dichiarato?
Cmq Grazieeeee Mille a te a tutti gli altri che mi hanno aiutato!!!


 store_procedure.
perchè quella specifica stored procedure non restituisce un recordset (non
contiene comandi select)
Salutoni
Sergio

 perchè viene dichiarato?
Ho dimenticato di cancellarlo.
Resta da capire come mai ti abbia dato errore nella creazione della stringa,
in una occasione.
Ciao
Alberto

Non avendo il ddl del tuo db ... ti posto un esempio
creato al volo per il mio di db.
E' molto rozzo, ma l'ho fatto di proposito per
aiutarti a capire.
Db_conn è il mio oggetto connection ... aperto verso
il db.
    Dim cmd As ADODB.Command
    Dim prm As ADODB.Parameter
    Dim error_item As ADODB.Errors
    Dim i As Integer
    Dim c As String
    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = db_conn
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "CREATE_FUNCTION"
    Set prm = cmd.CreateParameter("@RETURN_STATUS", adInteger,
adParamReturnValue)
    cmd.Parameters.Append prm
    Set prm = cmd.CreateParameter("@P_FNC_DESCR", adVarChar, adParamInput,
10, "SCAD")
    cmd.Parameters.Append prm
    Set prm = cmd.CreateParameter("@P_ERRORE", adVarChar, adParamOutput,
2000)
    cmd.Parameters.Append prm
    cmd.Execute , , adExecuteNoRecords
    For Each error_item In db_conn.Errors
      Debug.Print db_conn.Errors(i).Description
      Debug.Print db_conn.Errors(i).NativeError
    Next
    i = cmd.Parameters("@return_status")
    c = cmd.Parameters("@P_ERRORE")
    Set prm = Nothing
    Set cmd = Nothing
Ciao
Andrea

 in una occasione.
Questo non l'ho capito neanche io, ora funziona tutto e il problema non si è
ripresentato.
Grazie ancora a Tutti per gli aiuti!!!!
P.S.
Un saluto particolare a CSSoft!!!! CiAooo!!! :)
Ciao...Ciao!!!
