0

SQLCLRを使用して大量のストアドプロシージャの設定に取り組んでいます。現在、デバッグモードです。

を使用してデータセットをクライアントに書き戻そうとしています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)実際には6桁の数字であるためSqlDbType.BigIntSqlMetaDataコンテナとして選択しました。レコードの「CASEID」(record.SetValue(1, caseId))を設定した行で、。を取得し続けInvalidCastExceptionます。

私はこのSQLCLR全体に不慣れですが、System.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 に答える