0

我正在使用 SQL CLR 设置大量存储过程。我目前处于调试模式。

我正在尝试使用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是一个存储在数据库中的值 a numeric(21),但它实际上是一个六位数的数字,这就是我选择SqlDbType.BigInt作为SqlMetaData容器的原因。在我设置记录的“CASEID”(record.SetValue(1, caseId))的那一行,我不断得到一个InvalidCastException.

我是整个 SQL CLR 的新手,但在我看来 aSystem.Int32应该与SqlDbType.BigInt. 我错过了什么?

4

1 回答 1

0

你是对的,它抛出 System.InvalidCastException。更换

Dim caseId = Convert.ToInt32(identifier.CASEID)

Dim caseId = Convert.ToInt64(identifier.CASEID)

必须解决这个问题。具有 SqlDbType.BigInt 的 SqlMetaData 的 SqlDataRecord.SetValue 方法期望输入值应该是 Int64 或 SqlInt64

于 2012-05-18T16:38:03.007 回答