2010-09-24 2 views
8

Эта хранимая процедура не сохраняет данные, это, похоже, проблема с VARBINARY. Я передаю ему byte[], но тогда это не сработает. Если я отправлю этот параметр как NULL, он будет работать.Как сохранить байт [] с помощью процедуры?

Я вызываю процедуру со следующим кодом:

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); 
    } 
} 

Процедура заключается в следующем:

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 

Что случилось с этим кодом? Не является VARBINARY a byte[]?


Этот код работает при выполнении SQL Server Management Studio.

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

Но при вызове из метода GetSqlQuery с чем-то на byte[] сделки говорит, что не существует и не загрязнен. НО, если byte[] - null, он работает так, как должен.

+2

Определить, что «не работает». Вы получили сообщение об ошибке? Работает ли вставка/обновление, но изображение отсутствует? Работает ли вставка/обновление и изображение повреждены? btw, код, который проверяет COUNT (*), а затем вставки или обновления прерываются при параллелизме. Вы должны использовать 'MERGE' http://technet.microsoft.com/en-us/library/bb510625.aspx –

+0

Где находится' CommandParameter'? –

ответ

5

я обнаружил, что это невозможно, как показывает this answer

Привет Gaurav, в настоящее время наш метод GetSqlQuery может не работать надлежащим образом с параметрами типа LongVarBinary или VarBinary, таким образом, , что делает невозможным выполнение процедуры хранения . Мы знаем , и мы работаем над его исправлением . Поскольку работа вокруг , вы должны попробовать и использовать Linq для достижения вашей цели. Привет, Петар Telerik team

0

Попробуйте использовать .WRITE method. На своем INSERT вставьте 0x для изображения, а затем обновите самостоятельно.

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

Я не против нисходящего, если я ошибаюсь. Однако мне не нравятся анонимные нисходящие линии без объяснения причин. Можете ли вы объяснить свое возражение? –

+0

Это кажется совершенно не связанным с проблемой. Это не проблема SQLServer, а проблема ORM Telerik. Он не может передать 'byte []' процедуре. Однако он может отправить «нуль», доказывая, что проблема находится на ORM. – BrunoLM

+0

@BrunoLM: Спасибо за отзыв.Возможно, я не понял эту проблему. Это будет для ОП. Я думал, что предлагаю разумную работу, которая, по крайней мере, может быть * испробована *. –

1

Соответственно к this table кажется либо BLOB, BINARY, VARBINARY бы допустимые типы для [] of primitive type.

Вы можете попробовать ask on their forums, может быть, кто-то сможет вам помочь.

+0

Я уже спросил здесь http://www.telerik.com/community/forums/orm/development/save-image-with-procedure.aspx – Gadonski

0

Пример (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++; 
} 

} 
Смежные вопросы