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 :
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 :
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 :
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 :
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 :
EXEC sp_insert_image 'C:\test.jpg'
@++
Partager