Meilleur auteur de réponses
utilisation des GUID, comment realiser les insertion dans ma table

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
GOmais j ai l erreur suivante:
"Msg 102, Level 15, State 1, Line 5
Syntaxe incorrecte vers ')'."Merci
Marcelle NGOUNOU
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
-
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
-
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
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 -
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
-
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
-
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
-
-
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
-
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
-