2010-09-24 24 views
8

Quy trình lưu trữ này không lưu dữ liệu, có vẻ như đó là vấn đề với VARBINARY. Tôi đang chuyển một số byte[] cho nó, nhưng sau đó nó không hoạt động. Nếu tôi gửi tham số này là NULL thì nó hoạt động.Làm thế nào để lưu byte [] bằng cách sử dụng một thủ tục?

Tôi kêu gọi các thủ tục với đoạn mã sau:

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

Thủ tục như sau:

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 

Có gì sai với mã này? Không phải là VARBINARY a byte[]?


Mã này hoạt động khi thực thi trên SQL Server Management Studio.

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

Nhưng khi gọi từ phương pháp GetSqlQuery với một cái gì đó trên byte[] giao dịch nói nó không hoạt động và không bẩn. NHƯNG nếu byte[]null, nó hoạt động như bình thường.

+2

Xác định 'không hoạt động'. Bạn có mắc lỗi gì không? Công việc chèn/cập nhật có bị thiếu hình ảnh không? Công việc chèn/cập nhật và ảnh có bị hỏng không? btw, mã kiểm tra COUNT (*) và sau đó chèn hoặc cập nhật được chia theo đồng thời. Bạn nên sử dụng 'MERGE' http://technet.microsoft.com/en-us/library/bb510625.aspx –

+0

' CommandParameter' ở đâu? –

Trả lời

5

tôi thấy rằng nó là không thể như this answer lãm

Xin chào Gaurav, hiện phương pháp GetSqlQuery của chúng tôi có thể không hoạt động đúng với thông số của loại LongVarBinary hoặc VarBinary, do đó làm cho quy trình được lưu trữ không thể hoạt động như mong đợi. Chúng tôi đang nhận thức được sự cố này và chúng tôi đang làm việc để khắc phục sự cố. Là một công việc xung quanh , bạn nên thử và sử dụng LINQ để đạt được mục tiêu của mình là . Greetings, Petar the Đội Telerik

0

Thử sử dụng .WRITE method. Trên INSERT của bạn, chèn 0x cho Picture, sau đó cập nhật độc lập.

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

Tôi không quan tâm một downvote nếu tôi sai. Tuy nhiên tôi không thích downvotes vô danh mà không có lời giải thích. Bạn có thể giải thích phản đối của bạn? –

+0

Điều này có vẻ hoàn toàn không liên quan đến vấn đề. Nó không phải là một vấn đề trên SQLServer, nhưng là một vấn đề trên ORM của Telerik. Anh ta không thể truyền một 'byte []' cho thủ tục. Tuy nhiên, anh ta có thể gửi một 'null', chứng minh vấn đề là trên ORM. – BrunoLM

+0

@BrunoLM: Cảm ơn phản hồi.Chắc chắn là tôi đã hiểu lầm vấn đề. Điều đó sẽ được OP xác định. Tôi nghĩ rằng tôi đã cung cấp một công việc hợp lý xung quanh đó có thể ít nhất là * cố gắng *. –

1

Theo đó để this table có vẻ như một trong hai BLOB, BINARY, VARBINARY sẽ là loại có giá trị trong [] of primitive type.

Bạn có thể thử ask on their forums, có thể ai đó sẽ có thể giúp bạn.

+0

tôi đã yêu cầu ở đây http://www.telerik.com/community/forums/orm/development/save-image-with-procedure.aspx – Gadonski

0

Ví dụ (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++; 
} 

} 
Các vấn đề liên quan