我有一個存儲過程是這樣的:即通過System.Data.SqlClient
調用它Int64的脅迫爲byte []在存儲過程調用
create procedure [dbo].[Batch_of_Things_Get] (@MaxTimestamp binary(8)) as
begin
set nocount on
select top 3500
i.ThingID,
i.Name,
i.CreationDate,
i.local_timestamp
from
[dbo].[Thing] i
where
i.local_timestamp > @MaxTimestamp
end
和一些C#代碼(在.net 3.5),使用long
爲@MaxTimestamp
參數。
public static string GetUpdatedThings(long MinTimestamp)
{
// the ExecuteXmlDocument call takes: string SPName, params object[] SPParams
return new SqlProcedure(Config.ConnectionString).ExecuteXmlDocument("Batch_of_Things_Get", MinTimestamp).OuterXml;
}
它用來工作(實際上仍在生產工作相當愉快),但我的dev副本現在拋出:
InvalidCastException的:無法參數值從Int64類型轉換爲字節[ ]。
堆棧跟蹤:
at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType)
at System.Data.SqlClient.SqlParameter.GetCoercedValue()
at System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc)
at System.Data.SqlClient.SqlCommand.SetUpRPCParameters(_SqlRPC rpc, Int32 startCount, Boolean inSchema, SqlParameterCollection parameters)
at System.Data.SqlClient.SqlCommand.BuildRPC(Boolean inSchema, SqlParameterCollection parameters, _SqlRPC& rpc)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteXmlReader()
現在我明白這是爲什麼,現在失敗了,但爲什麼不早?
編輯:我改變了C#代碼將long轉換爲Byte [],現在它拋出:Failed to convert parameter value from a Byte[] to a Int64.
,這與它最初抱怨的內容相反!
什麼是C#代碼的樣子?它使用'BitConverter'類嗎? – 2010-11-03 04:39:50
添加了C#代碼... – geofftnz 2010-11-03 04:47:35
最終寫了一個解決方法,我明確指定了SP參數名稱和類型。 – geofftnz 2010-11-03 23:03:54