none
utilisation des GUID, comment realiser les insertion dans ma table RRS feed

  • Question

  • bonjour,

    je definie une table dossier ainsi:

    USE [RECLACSR-DB]
    GO

    /****** Object:  Table [dbo].[CSR_DOSSIER]    Script Date: 04/29/2012 14:01:26 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    SET ANSI_PADDING ON
    GO

    CREATE TABLE [dbo].[CSR_DOSSIER](
    [DOS_ID] [uniqueidentifier] NOT NULL,
    [PID_CODE] [nchar](4) NOT NULL,
    [TIT_CODE] [nchar](3) NOT NULL,
    [NAT_CODE] [char](4) NOT NULL,
    [DOS_NOBR] [nvarchar](50) NULL,
     CONSTRAINT [PK_DOSSIER] PRIMARY KEY CLUSTERED 
    (
    [DOS_ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF
    GO

    ALTER TABLE [dbo].[CSR_DOSSIER]  WITH CHECK ADD  CONSTRAINT [FK_CSR_DOSSIER_PAR_CATEGORIE] FOREIGN KEY([CAT_CODE])
    REFERENCES [dbo].[PAR_CATEGORIE] ([CAT_CODE])
    GO

    " je l ai tronquee car elle est longue.

    je voudrais faire le test d execution en insertion sous SQL avec une procedure stockee mais j ai toujours une erreur. voila ma procedure

    USE [RECLACSR-DB]
    GO

    DECLARE @return_value int

    EXEC @return_value = [dbo].[CreerDossier]
    @DOS_ID = newid(),
    @PID_CODE = NULL,
    @TIT_CODE = NULL,
    @NAT_CODE = NULL,
    @DOS_NOBR = NULL,

    SELECT 'Return Value' = @return_value

    GO

    mais j ai l erreur suivante: 

    "Msg 102, Level 15, State 1, Line 5
    Syntaxe incorrecte vers ')'."

    Merci


    Marcelle NGOUNOU

    lundi 30 avril 2012 03:45

Réponses

  • Bonjour,

    Tout dépend de qui doit générer l'identifiant... Est-ce la base de données (dans ce cas, il faut mettre le NEWID() dans la procédure stockée), ou alors votre code C# (dans ce cas là il faut passer en paramètre à votre procédure stockée un Guid généré : Guid.NewGuid()).

    Pour appeler une procédure stockée en C#, consultez la documentation suivante : http://support.microsoft.com/kb/310070

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    • Marqué comme réponse marclas lundi 30 avril 2012 10:10
    lundi 30 avril 2012 09:35
    Modérateur
  • Je vous conseille de mettre newid() comme valeur par défaut de la colonne DOS_ID dans la table CSR_DOSSIER:

    ALTER TABLE [dbo].[CSR_DOSSIER] ADD  CONSTRAINT [DF_CSR_DOSSIER_DOS_ID]  DEFAULT (newid()) FOR [DOS_ID]

    Si vous voulez récupérer la valeur de la colonne DOS_ID après l'insertion, vous pouvez le faire de la manière suivante:

    ALTER PROCEDURE  [dbo].[CreerDossier] 
    (
    	@DOS_ID uniqueidentifier = '00000000-0000-0000-0000-000000000000' OUTPUT,
    	@PID_CODE nchar(3) ,
    	@TIT_CODE nchar(3) ,
    	@NAT_CODE char(4) ,
    	@DOS_NOBR nvarchar(50),
    	@DOS_NODE nchar(10) ,
    	@DOS_VERSEMENT money ,
    	@DOS_TYDE char(2) ,
    	@DOS_NOPREC nchar(10) ,
    	@DOS_NOM nvarchar(100), 
    	@DOS_PRENOM nvarchar(100) ,
    	@DOS_DDN date ,
    	@DOS_SEX char(1) ,
    	@DOS_LNAIS nvarchar(50),
    	@DOS_CONTACT nvarchar(50) ,
    	@DOS_NPERE nvarchar(50) ,
    	@DOS_NMERE nvarchar(50) ,
    	@DOS_PROF nvarchar(50) ,
    	@DOS_TAILLE int ,
    	@DOS_LRED nvarchar(50) ,
    	@DOS_DTEN datetime ,
    	@CAT_CODE char(1) 
    
    )
    AS
    	SET NOCOUNT ON;
        IF @DOS_ID IS NULL OR @DOS_ID = '00000000-0000-0000-0000-000000000000' 
        BEGIN
          SET @DOS_ID = NEWID()
        END
    
    	INSERT INTO [RECLACSR-DB].[dbo].[CSR_DOSSIER]
    	(
    		[DOS_ID]
           ,[PID_CODE]
           ,[TIT_CODE]
           ,[NAT_CODE]
           ,[DOS_NOBR]
           ,[DOS_NODE]
           ,[DOS_VERSEMENT]
           ,[DOS_TYDE]
           ,[DOS_NOPREC]
           ,[DOS_NOM]
           ,[DOS_PRENOM]
           ,[DOS_DDN]
           ,[DOS_SEX]
           ,[DOS_LNAIS]
           ,[DOS_CONTACT]
           ,[DOS_NPERE]
           ,[DOS_NMERE]
           ,[DOS_PROF]
           ,[DOS_TAILLE]
           ,[DOS_LRED]
           ,[DOS_DTEN]
           ,[CAT_CODE]
         )
         VALUES
               (
    				@DOS_ID ,
    				@PID_CODE  ,
    				@TIT_CODE ,
    				@NAT_CODE ,
    				@DOS_NOBR ,
    				@DOS_NODE ,
    				@DOS_VERSEMENT  ,
    				@DOS_TYDE  ,
    				@DOS_NOPREC  ,
    				@DOS_NOM , 
    				@DOS_PRENOM  ,
    				@DOS_DDN  ,
    				@DOS_SEX  ,
    				@DOS_LNAIS ,
    				@DOS_CONTACT  ,
    				@DOS_NPERE  ,
    				@DOS_NMERE  ,
    				@DOS_PROF ,
    				@DOS_TAILLE  ,
    				@DOS_LRED  ,
    				@DOS_DTEN  ,
    				@CAT_CODE  
    			);

    Ensuite, pour récupérer la valeur de l'ID en csharp il faut déclarer le SqlParameter correspondant à Dos_ID comme ça:

    var idParam = new SqlParameter
    				  {
    					  ParameterName = "@DOS_ID",
    					  SqlDbType = SqlDbType.UniqueIdentifier,
    					  Direction = ParameterDirection.Output
    				  };

    Pour exécuter la procédure stockée de type Insert, vous pouvez vous faire une méthode générique comme ça:

    public bool ExecuteStoredProcedure(string storedProcedureName, params SqlParameter[] sqlParameters)
    {
    	try
    	{
    		using (var sqlConnection = new SqlConnection(_sqlConnectionString))
    		using (var command = new SqlCommand(storedProcedureName, sqlConnection))
    		{
    			command.CommandType = CommandType.StoredProcedure;
    			command.Parameters.AddRange(sqlParameters);
    			sqlConnection.Open();
    			command.ExecuteNonQuery();
    		}
    	}
    	catch (Exception e)
    	{
    		// todo: log4Net
    		return false;
    	}
    	return true;
    }

    Généralement ce genre de méthodes doit être placé dans le tier Data dans les architectures N-tiers.

    Voilà, j'espère que c'est plus clair maintenant.


    My blog

    Whether you’re a construction worker, a forum moderator, or just someone that likes helping people. I think these guidelines can be helpful in keeping you helpful when being helpful.

    • Marqué comme réponse marclas lundi 30 avril 2012 16:04
    lundi 30 avril 2012 14:19
    Auteur de réponse
  • Voici un exemple:

    bool success = ExecuteStoredProcedure("dbo.CreerDossier", idParam, new SqlParameter("@PID_CODE", "val"), ...);
    Il faut que vous remplaciez les ... par les autres paramètres de votre procédure stockée et leurs valeurs correspondantes.


    My blog

    Whether you’re a construction worker, a forum moderator, or just someone that likes helping people. I think these guidelines can be helpful in keeping you helpful when being helpful.

    • Marqué comme réponse marclas lundi 30 avril 2012 20:08
    lundi 30 avril 2012 18:31
    Auteur de réponse

Toutes les réponses

  • Bonjour,

    Vous devez passer des variables ou des litérales en paramètres et non l'appel à une fonction. Voici la version corrigée :

    USE [RECLACSR-DB]
     GO
     
    DECLARE  @return_value int
    
    DECLARE @id uniqueidentifier
     SET @id = NEWID()
    
    EXEC  @return_value = [dbo].[CreerDossier]
     @DOS_ID = @id,
     @PID_CODE = NULL,
     @TIT_CODE = NULL,
     @NAT_CODE = NULL,
     @DOS_NOBR = NULL
     
    SELECT  'Return Value' = @return_value
     
    GO

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    lundi 30 avril 2012 06:26
    Modérateur
  • bnjour Gilles,

    Merci pour ton observation.

    ceci se passe bien.

    toutefois j ai une autre preocupetion,

    est ce que je dois declarer 

    DECLARE @id uniqueidentifier
     SET @id = NEWID()

    dans ma procedure d'insertion? qui devient alors..

    USE [RECLACSR-DB]
    GO
    /****** Object:  StoredProcedure [dbo].[CreerDossier]    Script Date: 04/30/2012 07:36:52 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE  [dbo].[CreerDossier] 
    (
    	@DOS_ID uniqueidentifier ,
    	@PID_CODE nchar(3) ,
    	@TIT_CODE nchar(3) ,
    	@NAT_CODE char(4) ,
    	@DOS_NOBR nvarchar(50),
    	@DOS_NODE nchar(10) ,
    	@DOS_VERSEMENT money ,
    	@DOS_TYDE char(2) ,
    	@DOS_NOPREC nchar(10) ,
    	@DOS_NOM nvarchar(100), 
    	@DOS_PRENOM nvarchar(100) ,
    	@DOS_DDN date ,
    	@DOS_SEX char(1) ,
    	@DOS_LNAIS nvarchar(50),
    	@DOS_CONTACT nvarchar(50) ,
    	@DOS_NPERE nvarchar(50) ,
    	@DOS_NMERE nvarchar(50) ,
    	@DOS_PROF nvarchar(50) ,
    	@DOS_TAILLE int ,
    	@DOS_LRED nvarchar(50) ,
    	@DOS_DTEN datetime ,
    	@CAT_CODE char(1) 
    
    )
    AS
    	SET NOCOUNT ON;
    DECLARE @id uniqueidentifier
    	SET @id = NEWID()
        -- Inserer une ligne du dossier crée dans la table dossier
    	INSERT INTO [RECLACSR-DB].[dbo].[CSR_DOSSIER]
    	(
    		[DOS_ID]
           ,[PID_CODE]
           ,[TIT_CODE]
           ,[NAT_CODE]
           ,[DOS_NOBR]
           ,[DOS_NODE]
           ,[DOS_VERSEMENT]
           ,[DOS_TYDE]
           ,[DOS_NOPREC]
           ,[DOS_NOM]
           ,[DOS_PRENOM]
           ,[DOS_DDN]
           ,[DOS_SEX]
           ,[DOS_LNAIS]
           ,[DOS_CONTACT]
           ,[DOS_NPERE]
           ,[DOS_NMERE]
           ,[DOS_PROF]
           ,[DOS_TAILLE]
           ,[DOS_LRED]
           ,[DOS_DTEN]
           ,[CAT_CODE]
         )
         VALUES
               (
    				@id ,
    				@PID_CODE  ,
    				@TIT_CODE ,
    				@NAT_CODE ,
    				@DOS_NOBR ,
    				@DOS_NODE ,
    				@DOS_VERSEMENT  ,
    				@DOS_TYDE  ,
    				@DOS_NOPREC  ,
    				@DOS_NOM , 
    				@DOS_PRENOM  ,
    				@DOS_DDN  ,
    				@DOS_SEX  ,
    				@DOS_LNAIS ,
    				@DOS_CONTACT  ,
    				@DOS_NPERE  ,
    				@DOS_NMERE  ,
    				@DOS_PROF ,
    				@DOS_TAILLE  ,
    				@DOS_LRED  ,
    				@DOS_DTEN  ,
    				@CAT_CODE  
    			);
    
    IF @@ERROR > 0
    	ROLLBACK
    
    autres point suis je abliger d'avoir la partie "
    ALTER PROCEDURE  [dbo].[CreerDossier]

    Dans ma procédure?

    et enfin comment réaliserl appel de cette procéduredansmon code C#?

    merci


    Marcelle NGOUNOU

    lundi 30 avril 2012 06:50
  • Bonjour,

    Tout dépend de qui doit générer l'identifiant... Est-ce la base de données (dans ce cas, il faut mettre le NEWID() dans la procédure stockée), ou alors votre code C# (dans ce cas là il faut passer en paramètre à votre procédure stockée un Guid généré : Guid.NewGuid()).

    Pour appeler une procédure stockée en C#, consultez la documentation suivante : http://support.microsoft.com/kb/310070

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    • Marqué comme réponse marclas lundi 30 avril 2012 10:10
    lundi 30 avril 2012 09:35
    Modérateur
  • Je vous conseille de mettre newid() comme valeur par défaut de la colonne DOS_ID dans la table CSR_DOSSIER:

    ALTER TABLE [dbo].[CSR_DOSSIER] ADD  CONSTRAINT [DF_CSR_DOSSIER_DOS_ID]  DEFAULT (newid()) FOR [DOS_ID]

    Si vous voulez récupérer la valeur de la colonne DOS_ID après l'insertion, vous pouvez le faire de la manière suivante:

    ALTER PROCEDURE  [dbo].[CreerDossier] 
    (
    	@DOS_ID uniqueidentifier = '00000000-0000-0000-0000-000000000000' OUTPUT,
    	@PID_CODE nchar(3) ,
    	@TIT_CODE nchar(3) ,
    	@NAT_CODE char(4) ,
    	@DOS_NOBR nvarchar(50),
    	@DOS_NODE nchar(10) ,
    	@DOS_VERSEMENT money ,
    	@DOS_TYDE char(2) ,
    	@DOS_NOPREC nchar(10) ,
    	@DOS_NOM nvarchar(100), 
    	@DOS_PRENOM nvarchar(100) ,
    	@DOS_DDN date ,
    	@DOS_SEX char(1) ,
    	@DOS_LNAIS nvarchar(50),
    	@DOS_CONTACT nvarchar(50) ,
    	@DOS_NPERE nvarchar(50) ,
    	@DOS_NMERE nvarchar(50) ,
    	@DOS_PROF nvarchar(50) ,
    	@DOS_TAILLE int ,
    	@DOS_LRED nvarchar(50) ,
    	@DOS_DTEN datetime ,
    	@CAT_CODE char(1) 
    
    )
    AS
    	SET NOCOUNT ON;
        IF @DOS_ID IS NULL OR @DOS_ID = '00000000-0000-0000-0000-000000000000' 
        BEGIN
          SET @DOS_ID = NEWID()
        END
    
    	INSERT INTO [RECLACSR-DB].[dbo].[CSR_DOSSIER]
    	(
    		[DOS_ID]
           ,[PID_CODE]
           ,[TIT_CODE]
           ,[NAT_CODE]
           ,[DOS_NOBR]
           ,[DOS_NODE]
           ,[DOS_VERSEMENT]
           ,[DOS_TYDE]
           ,[DOS_NOPREC]
           ,[DOS_NOM]
           ,[DOS_PRENOM]
           ,[DOS_DDN]
           ,[DOS_SEX]
           ,[DOS_LNAIS]
           ,[DOS_CONTACT]
           ,[DOS_NPERE]
           ,[DOS_NMERE]
           ,[DOS_PROF]
           ,[DOS_TAILLE]
           ,[DOS_LRED]
           ,[DOS_DTEN]
           ,[CAT_CODE]
         )
         VALUES
               (
    				@DOS_ID ,
    				@PID_CODE  ,
    				@TIT_CODE ,
    				@NAT_CODE ,
    				@DOS_NOBR ,
    				@DOS_NODE ,
    				@DOS_VERSEMENT  ,
    				@DOS_TYDE  ,
    				@DOS_NOPREC  ,
    				@DOS_NOM , 
    				@DOS_PRENOM  ,
    				@DOS_DDN  ,
    				@DOS_SEX  ,
    				@DOS_LNAIS ,
    				@DOS_CONTACT  ,
    				@DOS_NPERE  ,
    				@DOS_NMERE  ,
    				@DOS_PROF ,
    				@DOS_TAILLE  ,
    				@DOS_LRED  ,
    				@DOS_DTEN  ,
    				@CAT_CODE  
    			);

    Ensuite, pour récupérer la valeur de l'ID en csharp il faut déclarer le SqlParameter correspondant à Dos_ID comme ça:

    var idParam = new SqlParameter
    				  {
    					  ParameterName = "@DOS_ID",
    					  SqlDbType = SqlDbType.UniqueIdentifier,
    					  Direction = ParameterDirection.Output
    				  };

    Pour exécuter la procédure stockée de type Insert, vous pouvez vous faire une méthode générique comme ça:

    public bool ExecuteStoredProcedure(string storedProcedureName, params SqlParameter[] sqlParameters)
    {
    	try
    	{
    		using (var sqlConnection = new SqlConnection(_sqlConnectionString))
    		using (var command = new SqlCommand(storedProcedureName, sqlConnection))
    		{
    			command.CommandType = CommandType.StoredProcedure;
    			command.Parameters.AddRange(sqlParameters);
    			sqlConnection.Open();
    			command.ExecuteNonQuery();
    		}
    	}
    	catch (Exception e)
    	{
    		// todo: log4Net
    		return false;
    	}
    	return true;
    }

    Généralement ce genre de méthodes doit être placé dans le tier Data dans les architectures N-tiers.

    Voilà, j'espère que c'est plus clair maintenant.


    My blog

    Whether you’re a construction worker, a forum moderator, or just someone that likes helping people. I think these guidelines can be helpful in keeping you helpful when being helpful.

    • Marqué comme réponse marclas lundi 30 avril 2012 16:04
    lundi 30 avril 2012 14:19
    Auteur de réponse
  • Merci Link,

    c'est tres clair...

    MErci


    Marcelle NGOUNOU

    lundi 30 avril 2012 16:07
  • Link,

    j ai un petit souci au niveau de l appel de la procedure 

    j arrive pas a passer les parametres, pour le nom de la procedure c est OK

    mais celle de type parameter, j ai toujours une erreur.

    Pourrais tu stp me simuler un appel de cette fonction?

    merci


    Marcelle NGOUNOU

    lundi 30 avril 2012 17:18
  • Voici un exemple:

    bool success = ExecuteStoredProcedure("dbo.CreerDossier", idParam, new SqlParameter("@PID_CODE", "val"), ...);
    Il faut que vous remplaciez les ... par les autres paramètres de votre procédure stockée et leurs valeurs correspondantes.


    My blog

    Whether you’re a construction worker, a forum moderator, or just someone that likes helping people. I think these guidelines can be helpful in keeping you helpful when being helpful.

    • Marqué comme réponse marclas lundi 30 avril 2012 20:08
    lundi 30 avril 2012 18:31
    Auteur de réponse
  • Merci Link

    C Parfait...


    Marcelle NGOUNOU

    lundi 30 avril 2012 20:08