Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/03/2011, 11h07   #1
Membre du Club
 
marwa .net
Inscription : décembre 2009
Messages : 126
Détails du profil
Informations personnelles :
Nom : marwa .net
Localisation : Tunisie

Informations forums :
Inscription : décembre 2009
Messages : 126
Points : 53
Points : 53
Par défaut inserer une image dans sql server

bonjour ,
je cherche à insérer des images dans une base de données sql server mais je ne sais pas comment procéder.
pour plus d'explication, j'ai une table ayant un champ "picture" avec un type image et je veux récupérer ces images et les afficher à un utilisateur.
Comment introduire ce images dans la base en premier lieu et comment les récupérer aprés de la base et les afficher via une interface wpf ou desktop ou WP7?

j'utilise visual studio 2010 et Sql Server 2008 et mon langage de programmation est C#.

Merci de m'aider.
marwa21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 11h50   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Le type image est déprecié... remplacez le par le type varbinary(max)
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 11h52   #3
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Bonjour,

Tout d'abord il faut considérer le poids moyen de vos images, ainsi que leur nombre.
Si vous êtes certain qu'elles feront majoritairement chacune plus d'1 Mo, vous devriez utiliser la fonctionnalité FileStream de SQL Server 2008.
Mikedavem a écrit un bon tutoriel là-dessus.

Dans tous les cas votre table devra contenir une colonne de type varbinary(max).

Ensuite pour charger l'image, la meilleure solution pour vous me semble être de récupérer à partir de votre application C# (désolé je suis un profane en C#) le flux binaire représentant votre image, et de le passer en paramètre à une procédure stockée T-SQL.

Pour vous donner un exemple, supposons la table suivante :

Code :
1
2
3
4
5
6
CREATE TABLE tb_image
(
	image_id uniqueidentifier NOT NULL CONSTRAINT PKtb_image PRIMARY KEY CONSTRAINT DFtb_image__image_id DEFAULT NEWSEQUENTIALID()
	, image_document varbinary_max FILESTREAM NOT NULL
	, filename nvarchar(255) NOT NULL
)
La procédure stockée serait alors :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE PROCEDURE sp_insert_image
	@_image_document varbinary(max)
	, @_image_filename nvarchar(255)
	, @image_id uniqueidentifier = NULL OUTPUT
AS
BEGIN
	SET NOCOUNT ON
 
	DECLARE @t TABLE
	(
		image_id uniqueidentifier
	)
 
	INSERT	INTO dbo.tb_image
	(
		image_document
		, image_filename
	)
	OUTPUT	inserted.image_id INTO @t
	SELECT	@_image_document
		, @_image_filename
 
	SELECT	@image_id = image_id
	FROM	@t
END
Et une utilisation serait :

Code :
1
2
3
4
5
6
7
8
DECLARE	@image_id uniqueidentifier
 
EXEC	sp_insert_image
		0x0000
		, 'C:\toto.jpg'
		, @image_id = @image_id OUTPUT
 
SELECT	@image_id
Vous pouvez aussi, comme le suggère Mikedavem dans son tutoriel, passer en paramètre le chemin du fichier image, et laisser SQL Server le récupérer pour vous :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ALTER PROCEDURE	sp_insert_image
	@_image_filename nvarchar(255)
AS
BEGIN
	SET NOCOUNT ON
 
	DECLARE	@sql nvarchar(1024)
 
	SELECT	@sql = 'SELECT	CAST(BulkColumn AS varbinary(max)), @_image_filename_IN'
	+ ' FROM OPENROWSET(BULK ''' + @_image_filename + ''', SINGLE_BLOB) AS img'
 
	PRINT	@sql
 
	INSERT	INTO dbo.tb_image
	(
		image_document
		, image_filename
	)
	EXEC	sp_executesql
			@sql
			, N'@_image_filename_IN nvarchar(255)'
			, @_image_filename_IN = @_image_filename
 
	SELECT	image_id
	FROM	dbo.tb_image
	WHERE	image_filename = @_image_filename
END
Et une utilisation serait :

Code :
EXEC	sp_insert_image 'C:\test.jpg'
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 12h12   #4
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Quant à le récupérer en C# aucun soucis... tu devras juste utiliser de mémoire un memorystream pour le convertir en flux pour générer ton image dans un site par exemple...

Tu devrais trouver aisément des exemples d'exploitation de ce genre de données sur le WEB.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 12h35   #5
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Je penche (j'en tombe même ) pour la solution d'iberserk

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 13h08   #6
Membre du Club
 
marwa .net
Inscription : décembre 2009
Messages : 126
Détails du profil
Informations personnelles :
Nom : marwa .net
Localisation : Tunisie

Informations forums :
Inscription : décembre 2009
Messages : 126
Points : 53
Points : 53
Citation:
Envoyé par iberserk Voir le message
Le type image est déprecié... remplacez le par le type varbinary(max)
Pourquoi le type iùage est éprecié?
marwa21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 14h53   #7
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
les types image ntext, text sont déprécié et seront supprimé dans une future version.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h35   #8
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Et ont déjà été remplacés par des types bien plus simples à manipuler, respectivement à la liste de SQLPro : varbinary(max), nvarchar(max) et varchar(max).
Cela depuis la version 2005 de SQL Server, où le stockage de valeurs sous de tels types a été optimisé et permet dès SQL Server 2008 de profiter de la fonctionnalité FileStream.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h19.


 
 
 
 
Partenaires

Hébergement Web