2012-05-18 61 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