none
(Visual Studio 2008 – SQL SERVER 2005 EXPRESS) Mauvais retour des erreurs d'une procédure stockée RRS feed

  • Question

  • Bonjour,

    Voici ma procédure stockée

    ALTER PROCEDURE dbo.StoredProcBackup
    	-- Gestion des erreurs
    	@ErrNum INT OUTPUT, 
    	@ErrMsg NVARCHAR(4000) OUTPUT,
    	@ErrSev INT OUTPUT,
    	@ErrSta INT OUTPUT,
    	@ErrLin INT OUTPUT,
    /*
    	Cette procédure attend un nom (il peut être générique) de base à sauvegarder par BACKUP
    		Elle recherche le nom de cette base 
    			Et lance le BACKUP pour toutes les bases trouvées
    	Elle attend également le chemin et le nom du fichier sortie, sous forme Chemin complet\NomSortie.BAK			
    */	
    	@BaseCherche varchar(50),
    	@cheminBackup varchar(50)
    AS
    BEGIN TRY
    	DECLARE @nomDate varchar(50); 
    		SET @nomDate = (SELECT REPLACE(CONVERT(varchar(50),getdate(),103),'/','_')); 
    	DECLARE @databaseName VARCHAR(150); 
    	DECLARE
    		tables_cursor CURSOR FAST_FORWARD FOR 
    		--	Select pour faire une sauve de toutes les bases Attention, dans ce cas il faut personaliser @cheminBackup pour chaque base
    		--SELECT [name] FROM sys.sysdatabases WHERE [name] <> 'master' AND [name] <> 'model' AND [name] <> 'msdb' AND [name] <> 'tempdb' 
    		SELECT [name] FROM sys.sysdatabases WHERE [name] LIKE '%' +@BaseCherche+'%'
    	OPEN tables_cursor 
    	FETCH
    	NEXT FROM tables_cursor INTO @databaseName 
    	WHILE
    		@@FETCH_STATUS = 0 
    		BEGIN
    		--EXEC ('BACKUP DATABASE [' + @databaseName + '] TO DISK = ''' + @cheminBackup + @databaseName + '.BAK'' WITH NOFORMAT, NOINIT, NAME = N''Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10'); 
    		-- OK EXEC ('BACKUP DATABASE [' + @databaseName + '] TO DISK = ''E:\MaBase.BAK''' );
    		EXEC ('BACKUP DATABASE [' + @databaseName + '] TO DISK = ''' + @cheminBackup + ''' WITH NOFORMAT, NOINIT, NAME = N''Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10');  
    		-- Debug 
    		--PRINT 'BACKUP DATABASE [' + @databaseName + ']'
    	FETCH
    	NEXT FROM tables_cursor INTO @databaseName 
    	END
    	CLOSE tables_cursor 
    	DEALLOCATE tables_cursor
    END TRY
    BEGIN CATCH
        SELECT 
            ERROR_NUMBER() AS ErrorNumber,
            ERROR_MESSAGE() AS ErrorMessage,
            ERROR_SEVERITY() AS ErrorSeverity,
            ERROR_STATE() as ErrorState,
            ERROR_LINE() as Errorline;
    	 
        SELECT  @ErrNum = ERROR_NUMBER(),
                @ErrMsg = ERROR_MESSAGE(),
                @ErrSev = ERROR_SEVERITY(),
                @ErrSta = ERROR_STATE(), 
                @ErrLin = ERROR_LINE();
    END CATCH
    RETURN

    Voici les résultats de son exécution quand je la lance par le menu DONNEES/EXECUTER

    [dbo].[StoredProcBackup] en cours d'exécution ( @ErrNum = 0, @ErrMsg = 0, @ErrSev = 0, @ErrSta = 0, @ErrLin = 0, @BaseCherche = .mdf, @cheminBackup = E:\toto.bak ).
    
    12 pour cent traités.
    21 pour cent traités.
    30 pour cent traités.
    43 pour cent traités.
    51 pour cent traités.
    60 pour cent traités.
    73 pour cent traités.
    82 pour cent traités.
    90 pour cent traités.
    184 pages traitées pour la base de données 'E:\MESDOCUMENTSD\VISUALBASIC\VB2008\PROJETSTESTESSAI\SQL_ESSAIS - COPIE\SQL_ESSAIS\BIN\DEBUG\FIC\DBTEST_SQL.MDF', fichier 'dbTest_Sql' dans le fichier 21.
    100 pour cent traités.
    1 pages traitées pour la base de données 'E:\MESDOCUMENTSD\VISUALBASIC\VB2008\PROJETSTESTESSAI\SQL_ESSAIS - COPIE\SQL_ESSAIS\BIN\DEBUG\FIC\DBTEST_SQL.MDF', fichier 'dbTest_Sql_log' dans le fichier 21.
    BACKUP DATABASE a traité avec succès 185 pages en 0.185 secondes (8.192 Mo/s).
    12 pour cent traités.
    21 pour cent traités.
    30 pour cent traités.
    42 pour cent traités.
    51 pour cent traités.
    60 pour cent traités.
    73 pour cent traités.
    81 pour cent traités.
    90 pour cent traités.
    184 pages traitées pour la base de données 'E:\MESDOCUMENTSD\VISUALBASIC\VB2008\PROJETSTESTESSAI\SQL_ESSAIS\SQL_ESSAIS\BIN\DEBUG\FIC\DBTEST_SQL.MDF', fichier 'dbTest_Sql' dans le fichier 22.
    100 pour cent traités.
    3 pages traitées pour la base de données 'E:\MESDOCUMENTSD\VISUALBASIC\VB2008\PROJETSTESTESSAI\SQL_ESSAIS\SQL_ESSAIS\BIN\DEBUG\FIC\DBTEST_SQL.MDF', fichier 'dbTest_Sql_log' dans le fichier 22.
    BACKUP DATABASE a traité avec succès 187 pages en 0.151 secondes (10.094 Mo/s).
    ErrorNumber ErrorMessage                                                                                                                                                                                                                                                     ErrorSeverity ErrorState  Errorline   
    ----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------- ----------- ----------- 
    3013        BACKUP DATABASE s'est terminé anormalement.                                                                                                                                                                                                                      16            1           1           
    Aucune ligne n'est affectée.
    (1 ligne(s) retournée(s)
    @ErrNum = 3013
    @ErrMsg = BACKUP DATABASE s'est terminé anormalement.
    @ErrSev = 16
    @ErrSta = 1
    @ErrLin = 1
    @RETURN_VALUE = 0
    Exécution de [dbo].[StoredProcBackup] terminée.

    Voici le lancement de cette procédure stockée dans ma FORM

    Dim wFicSortie As String = NomBase
                wFicSortie = Replace(wFicSortie, "mdf", "bak")
                wFicSortie = "E:\" & wFicSortie
                sqlRequete = "StoredProcBackup"
                SqlCmd = New SqlCommand(sqlRequete, SqlConx, Sqltrans)
                Dim wcheminBackup As New SqlParameter("@cheminBackup", wFicSortie)
                wcheminBackup.Direction = Data.ParameterDirection.Input
                SqlCmd.Parameters.Add(wcheminBackup)
                Dim wBaseCherche As New SqlParameter("@BaseCherche", "t")
                wBaseCherche.Direction = Data.ParameterDirection.Input
                SqlCmd.Parameters.Add(wBaseCherche)
                '   Gestion des erreurs
                Dim ErrNum As New SqlParameter("@ErrNum", 0)
                ErrNum.Direction = Data.ParameterDirection.Output
                SqlCmd.Parameters.Add(ErrNum)
                Dim ErrMsg As New SqlParameter("@ErrMsg", " ")
                ErrNum.Direction = Data.ParameterDirection.Output
                SqlCmd.Parameters.Add(ErrMsg)
                Dim ErrSEV As New SqlParameter("@ErrSev", 0)
                ErrNum.Direction = Data.ParameterDirection.Output
                SqlCmd.Parameters.Add(ErrSEV)
                Dim ErrSta As New SqlParameter("@ErrSta", 0)
                ErrNum.Direction = Data.ParameterDirection.Output
                SqlCmd.Parameters.Add(ErrSta)
                Dim ErrLin As New SqlParameter("@ErrLin", 0)
                ErrNum.Direction = Data.ParameterDirection.Output
                SqlCmd.Parameters.Add(ErrLin)
                SqlCmd.CommandType = CommandType.StoredProcedure
                SqlCmd.ExecuteNonQuery()
                Me.Cursor = Cursors.Default
                If SqlCmd.Parameters("@ErrNum").Value IsNot DBNull.Value Then
                    wErrNum = SqlCmd.Parameters("@ErrNum").Value
                Else
                    wErrNum = 0
                End If
                If wErrNum <> 0 Then
                    Call ProcErr("ButBakup_Click")
                    wOk = False
                    Exit Sub
                End If

    Et voici en cas d' erreurs

    wErrMsg = SqlCmd.Parameters("@ErrMsg").Value
            wErrSev = SqlCmd.Parameters("@ErrSev").Value
            wErrSta = SqlCmd.Parameters("@ErrSta").Value
            wErrLin = SqlCmd.Parameters("@ErrLin").Value
            '   wErrSta et wErrLin n'ont pas l'air significatif. A creuser ...
            MessageBox.Show("Erreur dans : " & wLieu & vbCrLf & _
                            "Numéro " & wErrNum & vbCrLf & _
                            "Message " & wErrMsg & vbCrLf & _
                            "Sévérité " & wErrSev)

    Dans le message d'erreur je n'ai que le n° de l'erreur !

    Pourquoi ai-je perdu les autres info ?


    Cordialement Sauveur CONSALVI

    vendredi 21 décembre 2012 09:39

Réponses

  • Quel c.. !!!

    Merci Pourtant, j'ai cherché !

    Et j'ai trouvé une autre erreur

    Pour les sorties, Il faut préciser la longueur en cas de STRING (A première vue, pas pour les entrées)

    Je me suis aperçu que je n'avais que le premier caractère pour le message

    Voici la définition qui "marche"

    ' définition des paramètres Sub New (parameterName As String,dbType As SqlDbType, size As Integer)
                Dim wcheminBackup As New SqlParameter("@cheminBackup", wFicSortie)
                wcheminBackup.Direction = Data.ParameterDirection.Input
                SqlCmd.Parameters.Add(wcheminBackup)
                Dim wBaseCherche As New SqlParameter("@BaseCherche", "t")
                wBaseCherche.Direction = Data.ParameterDirection.Input
                SqlCmd.Parameters.Add(wBaseCherche)
                '   Gestion des erreurs
                Dim ErrNum As New SqlParameter("@ErrNum", SqlDbType.Int, 1, 0)
                ErrNum.Direction = Data.ParameterDirection.Output
                SqlCmd.Parameters.Add(ErrNum)
                Dim ErrMsg As New SqlParameter("@ErrMsg", SqlDbType.NVarChar, 2000, " ")
                ErrMsg.Direction = Data.ParameterDirection.Output
                SqlCmd.Parameters.Add(ErrMsg)
                Dim ErrSEV As New SqlParameter("@ErrSev", SqlDbType.Int, 1, 0)
                ErrSEV.Direction = Data.ParameterDirection.Output
                SqlCmd.Parameters.Add(ErrSEV)
                Dim ErrSta As New SqlParameter("@ErrSta", SqlDbType.Int, 1, 0)
                ErrSta.Direction = Data.ParameterDirection.Output
                SqlCmd.Parameters.Add(ErrSta)
                Dim ErrLin As New SqlParameter("@ErrLin", SqlDbType.Int, 1, 0)
                ErrLin.Direction = Data.ParameterDirection.Output
                SqlCmd.Parameters.Add(ErrLin)


    Cordialement Sauveur CONSALVI

    • Marqué comme réponse Aurel Bera vendredi 21 décembre 2012 14:35
    vendredi 21 décembre 2012 14:31
  • Bonjour

    Vous avez 5 fois  ErrNum.Direction = Data.ParameterDirection.Output

    Et aucune fois  ErrSEV.Direction = Data.ParameterDirection.Output et les autres.

    Copier-coller ne sais pas changer le code.

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.


    vendredi 21 décembre 2012 13:10

Toutes les réponses