2010-09-24 32 views
8

Este procedimiento almacenado no guarda los datos, parece ser un problema con el VARBINARY. Le paso un byte[], pero luego no funciona. Si envío este parámetro como NULL, funciona.¿Cómo guardar byte [] usando un procedimiento?

Voy a llamar al procedimiento con el siguiente código:

public Community AddCommunity(string name, string description, byte[] picture, User owner, int? venue, int communityID) 
{ 
    using (var database = new Database()) 
    { 
     return database.Scope.GetSqlQuery<Community>("QP_AddCommunity ?, ?, ?, ?, ?, ?", "VARCHAR Name, VARCHAR Description, VARBINARY Picture, INTEGER Owner, INTEGER Venue, INTEGER ID").GetResult(name, description, picture, owner.ID, venue, communityID); 
    } 
} 

El procedimiento es el siguiente:

CREATE PROCEDURE [dbo].[QP_AddCommunity] 
    @Name VARCHAR(120), 
    @Description VARCHAR(MAX), 
    @Picture VARBINARY(MAX), 
    @Owner INTEGER, 
    @Venue INTEGER, 
    @ID INTEGER 

AS 
BEGIN 
    SET NOCOUNT ON; 

    IF(SELECT COUNT(*) FROM QT_Community WHERE ID = @ID) = 0 
     INSERT INTO QT_Community(Name, [Description], Picture, [Owner], Venue) VALUES(@Name, @Description, @Picture, @Owner, @Venue); 

    ELSE 
     UPDATE QT_Community SET Name = @Name, [Description] = @Description, Picture = @Picture, [Owner] = @Owner, Venue = @Venue WHERE ID = @ID; 

    SELECT * FROM QT_Community WHERE ID = @@IDENTITY; 


END 

Qué le pasa a este código? ¿No es VARBINARY a byte[]?


Este código funciona cuando se ejecuta en SQL Server Management Studio.

DECLARE @X varbinary(20) 
Set @X = CAST('Testing' As varbinary(20)) 
EXECUTE [QP_AddCommunity] 'aaaaa', 'descricao', @X, 216, NULL, 0; 

Pero cuando se llama desde el método GetSqlQuery con algo en la byte[] la transacción dice que no es activo y no sucio. PERO si el byte[] es null funciona como debería.

+2

Definir 'does not work'. ¿Le da un error? ¿Funciona la inserción/actualización pero la imagen falta? ¿La inserción/actualización funciona y la imagen está dañada? Por cierto, el código que busca COUNT (*) y luego inserciones o actualizaciones se rompe bajo concurrencia. Deberías usar 'MERGE' http://technet.microsoft.com/en-us/library/bb510625.aspx –

+0

¿Dónde está el' CommandParameter'? –

Respuesta

5

he encontrado que es imposible que this answer muestra

Hola Gaurav, actualmente nuestro método GetSqlQuery puede no funcionar correctamente con parámetros de tipo LongVarBinary o VarBinary, por lo tanto haciendo imposible que el procedimiento almacenado funcione como se espera. Somos conscientes de este problema y estamos trabajando en la reparación. Como un trabajo alrededor de debe intentar y usar Linq para alcanzar su objetivo. Saludos, Petar el Equipo de Telerik

0

Intente utilizar el .WRITE method. En su INSERT, inserte 0x para Picture, luego actualice de forma independiente.

UPDATE QT_Community 
    SET Picture.Write (@Picture, 0, DATALENGTH(Picture)) 
    WHERE ID = @ID 
+2

No me importa un voto negativo si me equivoco. Sin embargo, no me gustan los votos negativos anónimos sin explicación. ¿Puedes explicar tu objeción? –

+0

Esto parece totalmente relacionado con el problema. No es un problema en SQLServer, sino un problema en el ORM de Telerik. No puede pasar un 'byte []' al procedimiento. Sin embargo, puede enviar un 'nulo', demostrando que el problema está en el ORM. – BrunoLM

+0

@BrunoLM: Gracias por los comentarios.Ciertamente es posible que haya entendido mal el problema. Eso será para que el OP lo determine. Pensé que estaba ofreciendo un trabajo razonable que al menos podría * intentarse *. –

1

De acuerdo a this table parece bien BLOB, BINARY, VARBINARY habría tipos válidos para [] of primitive type.

Puede intentar ask on their forums, tal vez alguien lo pueda ayudar.

+0

ya lo he preguntado aquí http://www.telerik.com/community/forums/orm/development/save-image-with-procedure.aspx – Gadonski

0

Ejemplo (Ado.Net):

byte[] ba = UlongsToBytes(ul); 
try 
{ 
string source = @"packet size=4096;integrated security=SSPI;data source=MyPC\MyNamedInstance;persist security info=False;initial catalog=Sandbox"; 
SqlConnection conn = new SqlConnection(source); 
conn.Open(); 
SqlCommand a = new SqlCommand("INSERT BigintsTarget(bi) SELECT * FROM dbo.ParseImageIntoBIGINTs(@BIGINTs)", conn); 
a.CommandType = System.Data.CommandType.Text; 
a.Parameters.Add(new SqlParameter("@BIGINTs", System.Data.SqlDbType.Image,2147483647)); 
for(int q=0; q<10; q++) 
{ 
a.Parameters[0].Value = ba; 
int res = a.ExecuteNonQuery(); 
} 
d2 = DateTime.Now; 
SqlCommand b = new SqlCommand("INSERT BigintsTarget1(bi) SELECT * FROM dbo.ParseVarcharMAXIntoBIGINTs(@BIGINTs)", conn); 
b.CommandType = System.Data.CommandType.Text; 
b.Parameters.Add(new SqlParameter("@BIGINTs", System.Data.SqlDbType.VarChar,2147483647)); 
for(int q=0; q<10; q++) 
{ 
b.Parameters[0].Value = sss; 
int res = b.ExecuteNonQuery(); 
} 
//b.ExecuteNonQuery(); 
conn.Close(); 
} 
catch(Exception ex) 
{ 
string s = ex.Message; 
int t=0; 
t++; 
} 

} 
Cuestiones relacionadas