2010-09-24 43 views
8

這個存儲過程不保存數據,這似乎是VARBINARY的問題。我通過一個byte[]它,但它不起作用。如果我發送這個參數爲NULL它的作品。如何使用程序保存byte []?

我打電話用下面的代碼的程序:

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

定義'不起作用'。你有錯誤嗎?插入/更新工作,但圖片丟失?插入/更新工作和圖片是否損壞?順便說一句,檢查COUNT(*)的代碼,然後在併發下插入或更新被破壞。你應該使用'MERGE' http://technet.microsoft.com/en-us/library/bb510625.aspx – 2010-09-24 14:45:24

+0

'CommandParameter'在哪裏? – 2010-09-24 15:17:08

回答

5

我發現,它是不可能的,因爲this answer顯示

你好拉夫,目前我們 GetSqlQuery方法無法 類型的參數來操作 正確LongVarBinary或VarBinary,因此 使存儲的 過程無法按預期工作。我們是 意識到這個問題,我們是 正在解決它。作爲一個圍繞 的工作,您應該嘗試使用Linq來實現您的目標 。 Greetings,Petar Telerik團隊

0

嘗試使用.WRITE method。在您的INSERT上,爲圖片插入0x,然後單獨更新。

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

如果我錯了,我不介意downvote。然而,我不喜歡匿名讚譽,沒有任何解釋。你能解釋你的反對意見嗎? – 2010-09-24 14:45:13

+0

這似乎與問題完全無關。這不是SQLServer的問題,而是Telerik的ORM問題。他無法將'byte []'傳遞給過程。然而,他可以發送'null',證明ORM存在問題。 – BrunoLM 2010-09-24 15:11:03

+0

@BrunoLM:感謝您的反饋。我錯誤地理解了這個問題當然是可能的。這將由OP確定。我認爲我提供了一個合理的工作,至少可以*嘗試*。 – 2010-09-24 15:15:23

1

因此到this table它看起來或者是BLOBBINARYVARBINARY將是有效的類型[] of primitive type。您可以嘗試ask on their forums,也許有人可以幫助您。

+0

我已經在這裏問過http://www.telerik.com/community/forums/orm/development/save-image-with-procedure.aspx – Gadonski 2010-09-24 17:13:37

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

} 
相關問題