Gérer le forum:  Aide  •  Rechercher  •  Liste des Membres  •  Groupes d'utilisateurs   •  S'enregistrer  •  Profil  •  Se connecter pour vérifier ses messages privés  •  Connexion 
 [C#] insertion d'un byte[] en BDD MSSQL 2005 via proc stock Voir le sujet suivant
Voir le sujet précédent
Poster un nouveau sujetRépondre au sujet
Auteur Message
telynor
Résident du forum
Résident du forum


Post-BTS
Sexe: Sexe:Féminin
Messages: 345
Localisation: IDF

MessagePosté le: Sam 03 Mar 2007 - 02:46 Répondre en citantRevenir en haut

plop,

j'ai un petit soucis lors de l'insertion d'un tableau de byte dans SQL serveur que je n'arrive pas à résourdre (ca arrive) mais que personne dans mon entourage pro/scolaire ne peut resoudre non plus (plus rare deja)



j'ai une procédure stocké

Code:

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:

 /// <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:
>? 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:

  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

Code:
>? 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.

j'ai des idées à creuser.
Les proc stock ne gere pas le type image j'utilise la conversion implicite image -> binary, cette conversion ne serai pas pas aussi implicite que ca.
Je vais tenter en explicite voir changer mon type de colonne en base.

je ne vous demande pas de solution parce que je doute que quelqu'un la trouve (faudrai vraiment se plonger dedans) mais plutot des idées qui vous viennent a l'esprit.

Je suis sur de la valeur que mon application passe a ma procédure, c'est donc a priori dans la procédure que quelque chose merde et encore sous reserve la valeur que j'ai en base sur un select (qui est peu parlante) soit effectivement "fausse", dans le cas contraire c'est ma recup de données qui merde.

Donc je suis a l'écoute de toutes vos idées et sugestions

Merci
Voir le profil de l'utilisateurEnvoyer un message privéMSN Messenger

N'oubliez pas de vous inscrire à la communauté pour participer. Si vous êtes déjà membre, connectez-vous pour faire disparaître ce bandeau publicitaire.
Strato
Résident du forum
Résident du forum


Ecole d'Ingénieurs
Sexe: Sexe:Masculin
Messages: 250
Localisation: Paris

MessagePosté le: Sam 03 Mar 2007 - 15:21 Répondre en citantRevenir en haut

Code:
byte[] toto = (byte[])cmd.ExecuteScalar();

Je ne suis pas un spécialiste international certifié mais je trouve ton CAST bizarre... ExecuteScalar() renvoie le contenu de la première cellule de la première ligne, mais est-il capable de "deviner" comment le découper pour le stocker dans un tableau?

Autre idée : si j'en crois le résultat que tu obtiens (une seule valeur au lieu de 85577) peut-être qu'il te manque une boucle quelque part. Ça me fait penser à ce genre d'erreur :
Code:
Tab[i] = Reader.Value;

Alors qu'il faudrait faire :
Code:
while (Reader.Read())
{
    Tab[i] = Reader.Value;
    i++;
}

P.S : Pourquoi me snobes-tu sur MSN depuis 15 jours? Je ne comprends pas.
Voir le profil de l'utilisateurEnvoyer un message privé
telynor
Résident du forum
Résident du forum


Post-BTS
Sexe: Sexe:Féminin
Messages: 345
Localisation: IDF

MessagePosté le: Sam 03 Mar 2007 - 20:33 Répondre en citantRevenir en haut

msn reste depuis 9 jours sur le pc de chez moi parce que j'ai pas msn au taff Smile
(le soir j'ai jusqu'a 20 conversations ouvertes)

Sinon pour byte[] toto = (byte[])cmd.ExecuteScalar(); meme sans cast j'ai une valeur objet qui ne match pas trop avec ce que j'attend.

Si je pouvais avoir une idée en base de ce qui est bon ca m'aiderai
Voir le profil de l'utilisateurEnvoyer un message privéMSN Messenger
Strato
Résident du forum
Résident du forum


Ecole d'Ingénieurs
Sexe: Sexe:Masculin
Messages: 250
Localisation: Paris

MessagePosté le: Sam 03 Mar 2007 - 23:22 Répondre en citantRevenir en haut

telynor a écrit:
msn reste depuis 9 jours sur le pc de chez moi parce que j'ai pas msn au taff Smile
(le soir j'ai jusqu'a 20 conversations ouvertes)

Rhooooo! Bin tu connais pas le mode "Hors Ligne"? Wink

Alors je suppose que tu as finalement trouvé un stage. Si c'est ça je te pardonne... Razz
Voir le profil de l'utilisateurEnvoyer un message privé
telynor
Résident du forum
Résident du forum


Post-BTS
Sexe: Sexe:Féminin
Messages: 345
Localisation: IDF

MessagePosté le: Dim 04 Mar 2007 - 14:04 Répondre en citantRevenir en haut

j'ai trouvé mieux en faite Smile je te raconterai
Voir le profil de l'utilisateurEnvoyer un message privéMSN Messenger
telynor
Résident du forum
Résident du forum


Post-BTS
Sexe: Sexe:Féminin
Messages: 345
Localisation: IDF

MessagePosté le: Lun 05 Mar 2007 - 15:36 Répondre en citantRevenir en haut

Bon j'ai testé toutes les conversions possibles et imaginables, j'ai modifier le type de mon champs image en binary mais rien n'y fait.

Personne n'a une idée ?
Voir le profil de l'utilisateurEnvoyer un message privéMSN Messenger
Strato
Résident du forum
Résident du forum


Ecole d'Ingénieurs
Sexe: Sexe:Masculin
Messages: 250
Localisation: Paris

MessagePosté le: Lun 05 Mar 2007 - 15:58 Répondre en citantRevenir en haut

Si tu fais ça tu as quoi? (dans tata)
Code:
string tata = cmd.ExecuteScalar().ToString();
Voir le profil de l'utilisateurEnvoyer un message privé
telynor
Résident du forum
Résident du forum


Post-BTS
Sexe: Sexe:Féminin
Messages: 345
Localisation: IDF

MessagePosté le: Mar 06 Mar 2007 - 13:40 Répondre en citantRevenir en haut

j'ai qu'une case donc je vais avoir un "71"


le probleme a mon avis est dans l'insert
Voir le profil de l'utilisateurEnvoyer un message privéMSN Messenger
Strato
Résident du forum
Résident du forum


Ecole d'Ingénieurs
Sexe: Sexe:Masculin
Messages: 250
Localisation: Paris

MessagePosté le: Mar 06 Mar 2007 - 14:38 Répondre en citantRevenir en haut

Bon, tu sais que je suis loin d'être un spécialiste mais à tout hasard et si tu ne l'as pas essayé, tentes donc ça :
Code:
byte[] toto = new byte[85577];
SqlDataReader MonReader = cmd.ExecuteReader();
int i = 0;

while (MonReader.Read())
{
    toto[i] = MonReader[0];
    i++;
}
Voir le profil de l'utilisateurEnvoyer un message privé
telynor
Résident du forum
Résident du forum


Post-BTS
Sexe: Sexe:Féminin
Messages: 345
Localisation: IDF

MessagePosté le: Mar 06 Mar 2007 - 18:37 Répondre en citantRevenir en haut

je veux juste le contenu de la premiere celule en faite, le reader lis chacune des lignes renvoyées par la requete.
Dans mon cas elle ne revoit qu'une ligne
Voir le profil de l'utilisateurEnvoyer un message privéMSN Messenger
telynor
Résident du forum
Résident du forum


Post-BTS
Sexe: Sexe:Féminin
Messages: 345
Localisation: IDF

MessagePosté le: Dim 11 Mar 2007 - 02:19 Répondre en citantRevenir en haut

Alors en fait le type BINARY ne contient qu'un octet par default (et meme en changeant sa taille je ne resolvais pas mon probleme)

J'ai donc modif mes proc stock pour m'affranchir de ce type de merde

Code:
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          IMAGE
            ,@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
           ,CAST(@File AS IMAGE)
           ,@Tag
           ,@FkIdUSer)


SELECT @Id as id;
--Select @file as [file];


END



Code:
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),
   FkIdUSer      UniqueIdentifier
)

AS

BEGIN

INSERT INTO @Photo
(
   Id,            
   [Name],      
   Description,         
   [File],      
   Tag,
   FkIdUSer
)
SELECT
    Id =  dbo.Photo.[Id],
    [Name] = dbo.Photo.[Name] ,
    Description = dbo.Photo.Description,
    [File] = dbo.Photo.[File],
    Tag = dbo.Photo.Tag   ,
   FkIdUSer = dbo.Photo.FkIdUSer
FROM dbo.Photo
WHERE dbo.Photo.Id = @IdPhoto


RETURN

END



GO



 



Et maintenant ca fonctionne a merveille Smile


Dernière édition par telynor le Dim 11 Mar 2007 - 22:58; édité 1 fois
Voir le profil de l'utilisateurEnvoyer un message privéMSN Messenger
Strato
Résident du forum
Résident du forum


Ecole d'Ingénieurs
Sexe: Sexe:Masculin
Messages: 250
Localisation: Paris

MessagePosté le: Dim 11 Mar 2007 - 15:46 Répondre en citantRevenir en haut

Félicitations. Wink
Voir le profil de l'utilisateurEnvoyer un message privé
Montrer les messages depuis:      
Poster un nouveau sujetRépondre au sujet
 Sauter vers:   



Voir le sujet suivant
Voir le sujet précédent
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum