Store Procedure parametrizzate e eseguzione

sabato 26 luglio 2008 - 11.17

Mau67 Profilo | Expert

Salve, programmo in visual studio 2005 professional e SqlServer 2005 da autodidatta, ho un problema molto importante per me, ma magari di
estrema semplicità per voi.

Mi spiego, ho circa 10 store procedure sul mio database in SQLServer 2005 che voglio mandare in esecuzione da un form contenente
una combobox dalla quale seleziono il mese e un textbox dove digito l'anno questi due sono i parametri che le store procedure devono essere agganciate
e mandate in esecuzione tramite la pressione di un button.


Primo problema vorrei parametrizzare tutte le SP in base a mese e anno e non so come si fa;

Secondo problema quando le mando in esecuzione il parametro che deve essere agganciato è per quanto riguarda il mese uso una combobox e per l'anno uso
una textbox inserite in un form;

Terzo problema vorrei se la cosa è possibile quando mando in esecuzione tutte le SP che il programma controllasse se la i dati siano stati inseriti nella
tabella e qundi mandasse in esecuzione la successiva SP e cosi via e se una delle SP non completasse il trasferimento dei dati bloccasse tutto;

Terzo problema mi piacerebbe che quando vanno in esecuzione le SP sul form si vedesse o con un ProgressBar o con altro il comportamento dell'esecuzione.

Vi posto una delle store procedure e il codice inserito nel button per mandararle in esecuzione.

una delle store procedure:

ALTER PROCEDURE dbo.MissioneInserisci

AS
INSERT INTO Indennità
(CodiceFiscale, Grado, Cognome, Nome, LuogoNascita, DataNascita, EnteAppartenenza, IndirizzoEnte, CapEnte, LuogoEnte, PaeseCoord, CinEstero,
Cin, Abi, Cab, CC, LivParCod, Sistema, Missione, InizioMissione, Giorni, Mese, Anno, Motivo, OreOmnicomprensiva, Importo, FondoCredito,
ContoEntrataTesoro, Irpef, TotLordo, TotFC, TotCET, TotNettoRit, TotIrpef, NettoMano, ForzaArmata, Retribuzione)
SELECT Anagrafica.CodiceFiscale, Anagrafica.Grado, Anagrafica.Cognome, Anagrafica.Nome, Anagrafica.LuogoNascita, Anagrafica.DataNascita,
Anagrafica.EnteAppartenenza, Anagrafica.IndirizzoEnte, Anagrafica.CapEnte, Anagrafica.LuogoEnte, Anagrafica.PaeseCoord, Anagrafica.CinEstero,
Anagrafica.Cin, Anagrafica.Abi, Anagrafica.Cab, Anagrafica.CC, Anagrafica.LivParCod, Anagrafica.Sistema, Anagrafica.Missione,
Anagrafica.InizioMissione, 30 AS Giorni, CalcolaMissione.Mese, CalcolaMissione.Anno,
'Indennità Omnicomprensiva (art.9 O.P.C.M. n. 3682 del 10 giugno 2008)' AS Motivo, Missione.OreOmnicomprensiva, Gradi.Importo,
Tassazione.FondoCredito, Tassazione.ContoEntrataTesoro, Gradi.Irpef, Gradi.Importo * Missione.OreOmnicomprensiva AS TotLordo,
Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.FondoCredito / 100 AS TotFC,
Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.ContoEntrataTesoro / 100 AS TotCET,
(Gradi.Importo * Missione.OreOmnicomprensiva - Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.FondoCredito / 100)
- Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.ContoEntrataTesoro / 100 AS TotNettoRit,
((Gradi.Importo * Missione.OreOmnicomprensiva - Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.FondoCredito / 100)
- Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.ContoEntrataTesoro / 100) * Gradi.Irpef / 100 AS TotIrpef,
((Gradi.Importo * Missione.OreOmnicomprensiva - Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.FondoCredito / 100)
- Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.ContoEntrataTesoro / 100)
- ((Gradi.Importo * Missione.OreOmnicomprensiva - Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.FondoCredito / 100)
- Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.ContoEntrataTesoro / 100) * Gradi.Irpef / 100 AS NettoMano, Anagrafica.ForzaArmata,
'M' AS Retribuzione
FROM Anagrafica INNER JOIN
Missione ON Anagrafica.CodMissione = Missione.Missione INNER JOIN
Gradi ON Anagrafica.Grado = Gradi.Grado AND Anagrafica.LivParCod = Gradi.LivParCod AND Anagrafica.ForzaArmata = Gradi.ForzaArmata INNER JOIN
Tassazione ON Anagrafica.Sistema = Tassazione.Sistema CROSS JOIN
CalcolaMissione
WHERE (Anagrafica.CodMissione <= 500)
GROUP BY Anagrafica.CodiceFiscale, Anagrafica.Grado, Anagrafica.Cognome, Anagrafica.Nome, Anagrafica.EnteAppartenenza, Anagrafica.IndirizzoEnte,
Anagrafica.CapEnte, Anagrafica.LuogoEnte, Anagrafica.PaeseCoord, Anagrafica.CinEstero, Anagrafica.Cin, Anagrafica.Abi, Anagrafica.Cab,
Anagrafica.CC, Anagrafica.LivParCod, Anagrafica.Sistema, Anagrafica.Missione, Anagrafica.InizioMissione, CalcolaMissione.Mese,
CalcolaMissione.Anno, Missione.OreOmnicomprensiva, Gradi.Importo, Tassazione.FondoCredito, Tassazione.ContoEntrataTesoro, Gradi.Irpef,
Gradi.Importo * Missione.OreOmnicomprensiva, Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.FondoCredito / 100,
Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.ContoEntrataTesoro / 100,
(Gradi.Importo * Missione.OreOmnicomprensiva - Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.FondoCredito / 100)
- Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.ContoEntrataTesoro / 100,
((Gradi.Importo * Missione.OreOmnicomprensiva - Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.FondoCredito / 100)
- Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.ContoEntrataTesoro / 100) * Gradi.Irpef / 100,
((Gradi.Importo * Missione.OreOmnicomprensiva - Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.FondoCredito / 100)
- Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.ContoEntrataTesoro / 100)
- ((Gradi.Importo * Missione.OreOmnicomprensiva - Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.FondoCredito / 100)
- Gradi.Importo * Missione.OreOmnicomprensiva * Tassazione.ContoEntrataTesoro / 100) * Gradi.Irpef / 100, Anagrafica.FineMissione,
Anagrafica.Pagamento, Gradi.Ordine, Anagrafica.LuogoNascita, Anagrafica.DataNascita, Anagrafica.ForzaArmata
HAVING (Anagrafica.FineMissione = 'No') AND (Anagrafica.Pagamento = 'Bonifico')
ORDER BY Gradi.Ordine, Anagrafica.Cognome

return

IL CODICE INSERITO NEL BUTTON PER MANDARE IN ESECUZIONE TUTTE LE STORE PROCEDURE


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Me.MeseComboBox.Text = "" Then
MsgBox("Seleziona mese da pagare")

Else
If Me.AnnoTextBox.Text = "" Then
MsgBox("Inserisci l'anno di riferimento")

Else

Me.Validate()
Me.CalcolaMissioneBindingSource.EndEdit()
Me.CalcolaMissioneTableAdapter.Update(Me.DatabaseDataSet.CalcolaMissione)



With ProgressBar1
.Visible = True
.Minimum = 1
.Maximum = 100000
.Value = 1
.Step = 1

For i As Integer = .Minimum To .Maximum
' Perform one step of the action being tracked.
.PerformStep()
Next i


' Imposta le variabili stringa per la connessione e per
' due query SQL; crea un'istanza dell'oggetto SqlConnection

Dim qrySelezione, conConnetti As String
conConnetti = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Programmi\TEOR\Database.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True; "

Dim conConnessione As New SqlConnection(conConnetti)




qrySelezione = "SELECT dbo.Anagrafica.CodiceFiscale, dbo.Anagrafica.Grado, dbo.Anagrafica.Cognome, dbo.Anagrafica.Nome, dbo.Anagrafica.Missione, dbo.Anagrafica.CodMissione , dbo.Anagrafica.Pagamento, dbo.Presenze.Giorni, dbo.Presenze.Mese, dbo.Presenze.Anno FROM dbo.Anagrafica INNER JOIN dbo.Presenze ON dbo.Anagrafica.CodiceFiscale = dbo.Presenze.CodiceFiscale WHERE (dbo.Anagrafica.CodMissione >= 510) AND (dbo.Presenze.Giorni > 0) AND (dbo.Presenze.Liquidata = 'No')"



' Svuota la casella ListView1 e
' la casella di testo
ListView1.Items.Clear()
TextBox1.Text = ""

' Crea un Dataset provvisorio, utilizzando la connessione
' predefinita, una nuova istanza dell'Oggetto SqlCommand e una
' nuova istanza degli oggetti Dataset e SqlDataAdapter.
' Carica di dati il Dataset.
conConnessione.Open()
Dim cmdComando1 As New SqlCommand(qrySelezione, conConnessione)
Dim dsDataSet0 As New DataSet
Dim daAdattatore0 As New SqlDataAdapter
daAdattatore0.SelectCommand = cmdComando1
daAdattatore0.Fill(dsDataSet0)

' Crea il Dataset di lavoro nello stesso modo di quello
' provvisorio, utilizzando la stessa connessione, ma
' un argomento diverso per la nuova istanza di SqlCommand.
' Crea una nuova istanza di Dataset e di SqlDataAdapter
' Carica di dati il Dataset
Dim cmdComando As New SqlCommand(qrySelezione, conConnessione)
Dim dsDataSet As New DataSet
Dim daAdattatore As New SqlDataAdapter
daAdattatore.SelectCommand = cmdComando
daAdattatore.Fill(dsDataSet)

' Utilizza entrambi i DataSet per contare tutte le righe
' presenti nella tabella InizioMissione e tutte le righe
' ottenute con la seconda query
' Inserisce i valori ottenuti nella casella di testo
' TextBox1 e quindi elimina il primo Dataset

Dim dsRiga As DataRow
Dim intConta0, intConta As Integer
intConta0 = dsDataSet0.Tables(0).Rows.Count
intConta = dsDataSet.Tables(0).Rows.Count
TextBox1.Text = intConta & " Indennità che saranno calcolate su " & intConta0
dsDataSet0.Dispose()

' Svuota la casella ListView1,
' imposta la casella TextBox1
' e azzera il contatore intConta

intConta = 0
ListView1.Items.Clear()


For Each dsRiga In dsDataSet.Tables(0).Rows
ListView1.Items.Add(dsRiga("CodiceFiscale"))
ListView1.Items(intConta).SubItems.Add(dsRiga("Cognome"))
ListView1.Items(intConta).SubItems.Add(dsRiga("Nome"))
ListView1.Items(intConta).SubItems.Add(dsRiga("Missione"))
ListView1.Items(intConta).SubItems.Add(dsRiga("CodMissione"))
ListView1.Items(intConta).SubItems.Add(dsRiga("Pagamento"))
intConta = intConta + 1
Next

' Terminiamo il lavoro libero le risorse
' di memoria e di elaborazione chiudendo
' la connessione ed eliminando il DataSet

dsDataSet.Dispose()
conConnessione.Close()

If intConta = 0 Then

MsgBox("Nessuna Missione da calcolare")

Else

If MessageBox.Show("Vuoi calcolare l'omnicomprensiva?", "Liquida omnicomprensiva", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) = Windows.Forms.DialogResult.Yes Then
With ProgressBar1
.Visible = True
.Minimum = 1
.Maximum = 100000
.Value = 1
.Step = 1

For i As Integer = .Minimum To .Maximum
' Perform one step of the action being tracked.
.PerformStep()
Next i




Try
Dim ConnectionString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Programmi\TEOR\Database.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
Dim SqlConn As SqlClient.SqlConnection = New SqlClient.SqlConnection(ConnectionString)
Dim SqlCommand As New SqlClient.SqlCommand
SqlCommand.CommandTimeout = 15
SqlCommand.CommandType = CommandType.Text
SqlCommand.Connection = SqlConn
SqlCommand.CommandText = "EXEC dbo.MissioneInserisciPresenza"
SqlConn.Open()
SqlCommand.ExecuteNonQuery()
SqlConn.Close()
SqlConn.Dispose()
Catch ex As Exception
End Try


Try
Dim ConnectionString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Programmi\TEOR\Database.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
Dim SqlConn As SqlClient.SqlConnection = New SqlClient.SqlConnection(ConnectionString)
Dim SqlCommand As New SqlClient.SqlCommand
SqlCommand.CommandTimeout = 15
SqlCommand.CommandType = CommandType.Text
SqlCommand.Connection = SqlConn
SqlCommand.CommandText = "EXEC dbo.MissioneInserisciContantiPresenze"
SqlConn.Open()
SqlCommand.ExecuteNonQuery()
SqlConn.Close()
SqlConn.Dispose()
Catch ex As Exception
End Try


Try
Dim ConnectionString As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Programmi\TEOR\Database.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
Dim SqlConn As SqlClient.SqlConnection = New SqlClient.SqlConnection(ConnectionString)
Dim SqlCommand As New SqlClient.SqlCommand
SqlCommand.CommandTimeout = 15
SqlCommand.CommandType = CommandType.Text
SqlCommand.Connection = SqlConn
SqlCommand.CommandText = "EXEC dbo.PresenzaLiquidata"
SqlConn.Open()
SqlCommand.ExecuteNonQuery()
SqlConn.Close()
SqlConn.Dispose()
Catch ex As Exception
End Try



.Visible = False

End With

MessageBox.Show("OK IL CALCOLO DELLA MISSIONE E' STATO COMPLETATO CON SUCCESSO", "CONFERMA", MessageBoxButtons.OK, MessageBoxIcon.Information)

End If
End If

.Visible = False
End With

End If
End If

End Sub


Spero di essere stato chiaro ringrazio in anticipo


Perfavore è molto urgente aiutatemi
Mau67

Cteniza Profilo | Guru

Per inserire i parametri sulle stored procedure (guarda la documentazione online) devi cambiare le stored:
ALTER PROCEDURE myprocedure
@Anno Int
AS
SELECT xxxx FROM mytable WHERE table.mycampoanno = @Anno

Mau67 Profilo | Expert

Ok ma per mandarla in esecuzione la stored come faccio?

Dove e come aggancio la combobox e la textbox al parametro? da un button nella form?

Ciao grazie
Mau67

Cteniza Profilo | Guru

Beh nei comandi devi aggiungere il parametro al sql command
MySqlCommand.Parameters.AddWithValue("@Anno",myVarAnno)

Se invece intendevi "filtrare" i dati per anno dopo l'estrazione devi intervenire sul bindingsource impostando RowFilter = "anno = " & combobox.text
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