IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Insertion d'un byte[] dans une bdd mssql 2005


Sujet :

ASP.NET

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 114
    Par défaut Insertion d'un byte[] dans une bdd mssql 2005
    Bonjour,

    j'ai un petit soucis lors de l'insertion d'un tableau de byte dans SQL serveur

    j'ai une procédure stocké

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    USE [AjaxIntranetHeig]
     
    GO
     
    IF EXISTS 
    (SELECT name FROM sysobjects WHERE name = 'AddPhototoStudent' AND type = 'P')
    DROP PROCEDURE [AddPhototoStudent]
     
    GO
    /****** Objet :  StoredProcedure [dbo].[AddPhototoStudent]    Create date : 03/01/2007 19:56:32 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE  [dbo].[AddPhototoStudent]
    				 @Name 			NVARCHAR(256)
    				,@Description 	NVARCHAR(256)
    				,@File 			BINARY
    				,@Tag			NVARCHAR(256)
    				,@FkIdUSer		UNIQUEIDENTIFIER	
    AS
     
    BEGIN
     
     
    DECLARE		@Id			UNIQUEIDENTIFIER;
    SET @Id = NEWID();
     
    INSERT INTO [AjaxIntranetHeig].[dbo].[Photo]
               ([Id]
    		   ,[Name]
               ,[Description]
               ,[File]
               ,[Tag]
               ,[FkIdUSer])
         VALUES
               (@Id
    		   ,@Name
               ,@Description
               ,@File
               ,@Tag
               ,@FkIdUSer)
     
     
    SELECT @Id as id;
     
     
    END
    J'ai un appel de cette procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
     
     /// <summary>
            ///  Create a new picture in database
            /// </summary>
            /// <param name="name">Photo's name</param>
            /// <param name="description">Photo's description</param>
            /// <param name="image">Image to add(in Byte[])</param>
            /// <param name="tag">image tag for search</param>
            /// <param name="idStudent">Id of picture's owner</param>
            public Guid AddPhototoStudent(string name, string description, byte[] image, string tag, Guid idStudent)
            {
                SqlCommand myCommand = new SqlCommand("AddPhototoStudent", Connexion);
                myCommand.CommandType = CommandType.StoredProcedure;
     
                myCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 256);
                myCommand.Parameters.Add("@Description", SqlDbType.NVarChar,256);
                myCommand.Parameters.Add("@File", SqlDbType.Binary, image.Length);
                myCommand.Parameters.Add("@Tag", SqlDbType.NVarChar, 256);
                myCommand.Parameters.Add("@FkIdUSer", SqlDbType.UniqueIdentifier);
     
                myCommand.Parameters["@Name"].Value = name;
                myCommand.Parameters["@Description"].Value = description;
                myCommand.Parameters["@File"].Value = image;
                myCommand.Parameters["@Tag"].Value = tag;
                myCommand.Parameters["@FkIdUSer"].Value = idStudent;
     
                object result = ExecProcecure(myCommand);
                if (result == null)
                    throw new Exception(Error);
                else
                    return new Guid(result.ToString());
            }

    A ce moment la mon byte[] (byte[] image) est égal à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    >? image
    {Dimensions:[85577]}
        [0]: 71
        [1]: 73
        [2]: 70
        [3]: 56
        [4]: 57
        [5]: 97
        [6]: 88
        [7]: 2
        [8]: 194
        [9]: 1
        [10]: 247
        [11]: 0
        [12]: 0
        [13]: 0
        [14]: 0
        [15]: 0
        [16]: 128
        [17]: 0
        [18]: 0
        [19]: 0
        [20]: 128
        [21]: 0
        [22]: 128
        [23]: 128
        [24]: 0
        [25]: 0
        [26]: 0
        [27]: 128
        [28]: 128
        [29]: 0
        [30]: 128
        [31]: 0
        [32]: 128
        [33]: 128
        [34]: 128
        [35]: 128
        [36]: 128
        [37]: 192
        [38]: 192
        [39]: 192
        [40]: 255
        [41]: 0
        [42]: 0
        [43]: 0
        [44]: 255
        [45]: 0
        [46]: 255
        [47]: 255
        [48]: 0
        [49]: 0
        [50]: 0
        [51]: 255
        [52]: 255
        [53]: 0
        [54]: 255
        [55]: 0
        [56]: 255
        [57]: 255
        [58]: 255
        [59]: 255
        [60]: 255
        [61]: 0
        [62]: 0
        [63]: 0
        [64]: 0
        [65]: 0
        [66]: 0
        [67]: 0
        [68]: 0
        [69]: 0
        [70]: 0
        [71]: 0
        [72]: 0
        [73]: 0
        [74]: 0
        [75]: 0
        [76]: 0
        [77]: 0
        [78]: 0
        [79]: 0
        [80]: 0
        [81]: 0
        [82]: 0
        [83]: 0
        [84]: 0
        [85]: 0
        [86]: 0
        [87]: 0
        [88]: 0
        [89]: 0
        [90]: 0
        [91]: 0
        [92]: 0
        [93]: 0
        [94]: 0
        [95]: 0
        [96]: 0
        [97]: 0
        [98]: 0
        [99]: 0
        < Plus... (Les 100 premiers des 85577 éléments ont été affichés.) >

    Hors lorsque que je recupere via un select ce meme tableau (j'ai fais un truc tout simple a l'arrache, pensant que mes problemes venaient de mon code)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      SqlCommand cmd = new SqlCommand("select [file] from photo where id = 'DF426DA8-FA72-4A23-8CDC-0C697A117C2B'",Connexion);
                Connexion.Open();
                byte[] toto = (byte[])cmd.ExecuteScalar();
                Connexion.Close();
    j'obtiens

    >? cmd.ExecuteScalar()
    {Dimensions:[1]}
    [0]: 71

    En base de donné sur un select j'ai '0x47'

    Je pense donc que c'est mon insert qui merdouille mais je vois pas pourquoi.

    Toute aide sera fortement appréciée, d'avance merci

  2. #2
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Je vote c'est ton type de donnée qui fous la merde.
    (Non, non, j'ai rien d'autre à suggérer, juste une piste de recherche et un "bon courage" )

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 114
    Par défaut
    conversion image to binary en SQL qui neserai pas si implicite que ca ?
    Sauf que le type image est pas utilisable dans les proc stock, je vais tenter de mettre un type binary en base pour voir

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 114
    Par défaut
    apres un passage en binary dans ma table j'ai toujours le meme probleme :/

    Personne n'aurai de nouvelles idées parce que j'ai epuisée les miennes

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 131
    Par défaut
    Ton dans sql server doit avoir le type IMAGE
    Et tu lui envoi ton tableau de byte et c ok
    enfin normalement

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 114
    Par défaut
    c'est ce que je fais dans ma procédure stoqué

  7. #7
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    T'as essayé de faire un insert aussi simple que ton select ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 114
    Par défaut
    Tu ne peux pas passer un byte[] en argument de procédure stocké aussi simplement que mon select il faut que passe par des parametres

  9. #9
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Ah vi.. pas con...

  10. #10
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    >? cmd.ExecuteScalar()
    {Dimensions:[1]}
    [0]: 71

    En base de donné sur un select j'ai '0x47'
    Pour Info :
    71 en base 10 donne 47 en Héxadécimal ...

  11. #11
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Ne faut-il pas donner une taille au type binary dans ta procédure stockée ???
    De plus (je me trompe peut être), mais je crois que le type de donnée Binary est limité à 8000 octets.

    Essaye d'utiliser le type de donnée IMAGE plutot (Dans ta table photo, cela doit être aussi le type image)

    Essaye comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE PROCEDURE  [dbo].[AddPhototoStudent]
      @Name  NVARCHAR(256),
      @Description NVARCHAR(256),
      @File IMAGE,
      @Tag NVARCHAR(256),
      @FkIdUSer UNIQUEIDENTIFIER
    AS

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 114
    Par défaut
    J'ai fais des modif dans l'insert j'ai en base une valeur qui l'air "correct"
    J'ai toujours un tableau a 1 dimension en sortie.

    Pour info tu ne peux pas déclarer de variable de type image dans une procédure stockée.
    J'ai passé tout mes cast en explicite pour etre sur mais pas de difference notoire.

  13. #13
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Citation Envoyé par telynor
    Pour info tu ne peux pas déclarer de variable de type image dans une procédure stockée.
    Oui, c'est vrai, mais là c'est un paramètre, ce n'est pas tout à fait la même chose.

    J'ai monté une procédure avec un paramètre image sans problème

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 114
    Par défaut
    En insert je pense que c'est bon parce que je recupere en base la valeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    0x4749463839615802C201F7000000000080000000800080800000008080008000808.....
    qui est plus parlante que le 0x47 que j'avais avant.

    Par contre le resultat de ma procédure stocké est toujours un tableau a 1 dimension

    procédure stocké de getPhoto

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    USE [AjaxIntranetHeig]
     
    GO
     
     
    IF EXISTS 
    (SELECT name FROM sysobjects WHERE name = 'GetPhotoByIdPhoto' AND type = 'TF')
    DROP FUNCTION GetPhotoByIdPhoto
     
    GO
     
    /*****************************************************
    *
    * Procédure qui retourne une photo en fonction de son id
    * 
    ******************************************************/
     
     
    CREATE FUNCTION dbo.GetPhotoByIdPhoto(@IdPhoto UniqueIdentifier) 
     
    RETURNS @Photo TABLE 
    (
    	Id				UniqueIdentifier,
    	[Name]			Varchar(50),
    	Description		Varchar(250),
    	[File]			Image,
    	Tag				Varchar(250)	
    )
     
    AS
     
    BEGIN
     
    DECLARE @Id				UniqueIdentifier;
    DECLARE @Name			Varchar(50);	
    DECLARE	@Description	Varchar(250);
    DECLARE @File			Binary;
    DECLARE	@Tag			Varchar(250);
     
     
    SET	@Id				= @IdPhoto;
    SET @Name			= (SELECT dbo.Photo.[Name] FROM dbo.Photo WHERE dbo.Photo.Id = @IdPhoto);
    SET	@Description	= (SELECT dbo.Photo.Description FROM dbo.Photo WHERE dbo.Photo.Id = @IdPhoto);
    SET @File			= CAST ((SELECT dbo.Photo.[File] FROM dbo.Photo WHERE dbo.Photo.Id = @IdPhoto) AS IMAGE);
    SET	@Tag			= (SELECT dbo.Photo.Tag FROM dbo.Photo WHERE dbo.Photo.Id = @IdPhoto);
     
    --INSERT INTO dbo.debug (TestIMage) VALUES ((SELECT dbo.Photo.[File] FROM dbo.Photo WHERE dbo.Photo.Id = @IdPhoto));
    --INSERT INTO dbo.debug (TestIMage) VALUES (@File);
     
    INSERT INTO @Photo 
    (
    	Id,				
    	[Name],		
    	Description,			
    	[File],		
    	Tag
    )
    VALUES
    (
    		@Id,				
    		@Name,			
    		@Description,			
    		@File,		
    		@Tag
    )	
     
    RETURN 
     
    END
     
    GO

  15. #15
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Oui @File est declaré en Binary qui par défaut contient 1 seule octet
    Donc normale que tu ne récupère que le premier octet

    Par contre, pourquoi tiens-tu à déclarer des variables locales ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE FUNCTION dbo.GetPhotoByIdPhoto(@IdPhoto UniqueIdentifier) 
     
    RETURNS TABLE AS
     
     SELECT 
        Id =  dbo.Photo.[Id],
        [Name] = dbo.Photo.[Name] ,
        Description = dbo.Photo.Description,
        [File] = dbo.Photo.[File],
        Tag = dbo.Photo.Tag    
    FROM dbo.Photo 
    WHERE dbo.Photo.Id = @IdPhoto
    Tu verras, c'est beaucoup plus performant comme ça et t'as pas besoin de variable locale...

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 114
    Par défaut
    Parce que je ne connaisais pas héhé

    Merci beaucoup, je test demain matin

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 114
    Par défaut
    Apres une modification de la proc stock ca fonctionne parfaitement !

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insertion de caractères arabes dans une BDD
    Par gsousou dans le forum JDBC
    Réponses: 0
    Dernier message: 22/11/2013, 10h15
  2. Réponses: 4
    Dernier message: 08/04/2011, 09h44
  3. Faire un insert ou un update dans une bdd
    Par Aspic dans le forum Développement de jobs
    Réponses: 9
    Dernier message: 08/07/2010, 17h22
  4. insertion d'un champs dans une bdd access
    Par pepper18 dans le forum SGBD
    Réponses: 1
    Dernier message: 26/05/2006, 19h47
  5. [debutant]insertion dans une BDD
    Par EssaiEncore dans le forum ASP
    Réponses: 7
    Dernier message: 10/02/2005, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo