2012-05-18 2 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.CASEIDnumeric(21)으로 데이터베이스에 저장된 값이지만, 실제로 나는 SqlMetaData 컨테이너 SqlDbType.BigInt을 선택하는 이유 여섯 자리 숫자입니다. 레코드의 "CASEID"(record.SetValue(1, caseId))를 설정 한 행에서 나는 계속 InvalidCastException을 얻습니다.

저는이 전체 SQL CLR에 익숙하지만, System.Int32SqlDbType.BigInt과 호환되어야한다고 생각합니다. 내가 뭘 놓치고 있니?

+0

MSDN 정보는 SqlDataRecord.SetValue는 ArgumentOutOfRangeException – volody

+0

좋은 점을 던졌습니다 ... 다시 실행하기 내가 더 얻을 수 있는지 확인하기 위해 지금 보여줍니다 INT64 또는 sqlint64를이어야한다 기대 내 디버그 환경에서 정보 ... 감사합니다! – 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) 

를 교체하면이 문제를 해결할 수 있습니다. SqlDbType.BigInt와 SqlMetaData에 대한 SqlDataRecord.SetValue 방법은 입력 값이

+0

좁은 캐스트가 아닌데 왜 암시 적 캐스트가 허용되지 않습니까? 나는 당신의 솔루션을 테스트 할 것이고 당신 말이 맞을지 모르지만 그것은 Int64를 기대하고 Int32를 거부한다는 것이 이상하다고 생각하겠습니까? 답장을 보내 주셔서 감사합니다. – mbm29414