2012-05-18 57 views
0

我正在使用SQL CLR設置一大組存儲過程。我目前處於調試模式。SQL Server CLR - SqlDataRecord.SetValue InvalidCastException

我想寫一個數據集回到客戶端使用SqlPipe

這裏是我的代碼:

Dim metaData() As SqlMetaData = {New SqlMetaData("USERNAME", SqlDbType.VarChar, -1), _ 
           New SqlMetaData("CASEID", SqlDbType.BigInt), _ 
           New SqlMetaData("Reason", SqlDbType.VarChar, -1)} 
Dim record As New SqlDataRecord(metaData) 
Dim pipe As SqlPipe = SqlContext.Pipe 
pipe.SendResultsStart(record) 
Dim username = iDataRow.Item("USERNAME") 
Dim caseId = Convert.ToInt32(identifier.CASEID) 
Dim message = "Message" 
record.SetValue(0, username) 
record.SetValue(1, caseId) 
record.SetValue(2, message) 
pipe.SendResultsRow(record) 
pipe.SendResultsEnd() 

identifier.CASEID是存儲在數據庫中爲numeric(21)值,但它實際上是一個六位數字,這就是爲什麼我選擇SqlDbType.BigIntSqlMetaData容器。在我設置記錄的「CASEID」(record.SetValue(1, caseId))的行中,我不斷收到InvalidCastException

我是新來的這整個SQL CLR的事情,但在我看來,System.Int32應該與SqlDbType.BigInt兼容。我錯過了什麼?

+0

MSDN信息顯示,SqlDataRecord.SetValue只拋出ArgumentOutOfRangeException – volody

+0

好一點......再運行現在去看看,如果我能得到更多的來自我的調試環境的信息...謝謝! – mbm29414

+0

我得到了同樣的錯誤: 錯誤類型:'System.InvalidCastException' 消息:'指定的轉換是無效的.' TargetSite:'{Void SetValue(Int32,System.Object)}' 任何幫助非常感謝! – mbm29414

回答

0

你是對的,它拋出System.InvalidCastException。與

Dim caseId = Convert.ToInt64(identifier.CASEID) 

更換

Dim caseId = Convert.ToInt32(identifier.CASEID) 

有來解決這個問題。對於SqlMetaData與SqlDbType.BigInt SqlDataRecord.SetValue方法要求輸入值應爲Int64的或SqlInt64

+0

當它不是一個縮小的演員時,爲什麼不允許隱式演員?我會測試你的解決方案,你可能是對的,但我覺得它會期望一個'Int64'並拒絕一個'Int32',對嗎?感謝回覆! – mbm29414