Auteur |
Message |
telynor
Résident du forum
Sexe:
Messages: 345
Localisation: IDF
|
Posté le:
Sam 03 Mar 2007 - 02:46 |
|
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 |
|
|
|
|
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
Sexe:
Messages: 250
Localisation: Paris
|
Posté le:
Sam 03 Mar 2007 - 15:21 |
|
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. |
|
|
|
|
telynor
Résident du forum
Sexe:
Messages: 345
Localisation: IDF
|
Posté le:
Sam 03 Mar 2007 - 20:33 |
|
msn reste depuis 9 jours sur le pc de chez moi parce que j'ai pas msn au taff
(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 |
|
|
|
|
Strato
Résident du forum
Sexe:
Messages: 250
Localisation: Paris
|
Posté le:
Sam 03 Mar 2007 - 23:22 |
|
telynor a écrit: |
msn reste depuis 9 jours sur le pc de chez moi parce que j'ai pas msn au taff
(le soir j'ai jusqu'a 20 conversations ouvertes) |
Rhooooo! Bin tu connais pas le mode "Hors Ligne"?
Alors je suppose que tu as finalement trouvé un stage. Si c'est ça je te pardonne... |
|
|
|
|
telynor
Résident du forum
Sexe:
Messages: 345
Localisation: IDF
|
Posté le:
Dim 04 Mar 2007 - 14:04 |
|
j'ai trouvé mieux en faite je te raconterai |
|
|
|
|
telynor
Résident du forum
Sexe:
Messages: 345
Localisation: IDF
|
Posté le:
Lun 05 Mar 2007 - 15:36 |
|
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 ? |
|
|
|
|
Strato
Résident du forum
Sexe:
Messages: 250
Localisation: Paris
|
Posté le:
Lun 05 Mar 2007 - 15:58 |
|
Si tu fais ça tu as quoi? (dans tata)
Code: |
string tata = cmd.ExecuteScalar().ToString(); |
|
|
|
|
|
telynor
Résident du forum
Sexe:
Messages: 345
Localisation: IDF
|
Posté le:
Mar 06 Mar 2007 - 13:40 |
|
j'ai qu'une case donc je vais avoir un "71"
le probleme a mon avis est dans l'insert |
|
|
|
|
Strato
Résident du forum
Sexe:
Messages: 250
Localisation: Paris
|
Posté le:
Mar 06 Mar 2007 - 14:38 |
|
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++;
} |
|
|
|
|
|
telynor
Résident du forum
Sexe:
Messages: 345
Localisation: IDF
|
Posté le:
Mar 06 Mar 2007 - 18:37 |
|
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 |
|
|
|
|
telynor
Résident du forum
Sexe:
Messages: 345
Localisation: IDF
|
Posté le:
Dim 11 Mar 2007 - 02:19 |
|
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 |
Dernière édition par telynor le Dim 11 Mar 2007 - 22:58; édité 1 fois |
|
|
|
Strato
Résident du forum
Sexe:
Messages: 250
Localisation: Paris
|
Posté le:
Dim 11 Mar 2007 - 15:46 |
|
Félicitations. |
|
|
|
|
|