문제

eledbcommand.executenonquery ()를 사용하여 데이터베이스에 데이터를 삽입하고 있습니다.

ObjCommand = New OleDbCommand
ObjCommand.CommandType = CommandType.StoredProcedure
ObjCommand.CommandText = StrSQL

ObjCommand.Parameters.Add("field1", OleDbType.VarChar).Value = <something1>
ObjCommand.Parameters.Add("field", OleDbType.VarChar).Value = <something2>
(...)
(...)    
ObjCommand.Parameters.Add("field50", OleDbType.VarChar).Value = <something50>

ObjCommand.Connection = GetDBConnection(StrConnectionString)
ObjCommand.Connection.Open()


<some integer> = ObjCommand.ExecuteNonQuery()

그리고 마지막 줄에만 나타나는 변환 예외가 있습니다.

오류 DataType Varchar를 Smallint로 변환합니다

그것이 정상적인 행동인지, 전환 문제가 어디에서 발생하는지 알고 싶습니다.

업데이트:

ObjCommand.Parameters.Add("@IdMunFatoGerador", OleDbType.VarChar).Value 
                = ObjNFe.idMunFatoGerador

나는 모든 줄을 주석하고 일부를 무너 뜨려이 줄을 찾았습니다. 이것은 위의 예외를 나에게 제공합니다.

objnfe.idmunfatogerador는 문자열이며 "Datatype Varchar를 Smallint로 변환하는 오류"도 제공합니다.

도움이 되었습니까?

해결책 5

마침내 찾았습니다.

값의 형식으로 모든 것이 괜찮 았습니다. 문제는 : 매개 변수 중 하나가 누락되었습니다. 나는 여전히 그것을 완전히 이해하지 못했지만 문제는 누락 된 매개 변수 (smallint)가 다음 (Varchar)에서 해석되었다는 것이었고, 내가 찾은 오류는 두 번째에 있었다는 것이었다.

다시 말해, 필드 ~ 35가 누락되었습니다 (하하)

따라서, 절차에 명령을 장착 할 때는 항상 필드를 정확한 금액과 순서로 배치해야합니다. =))

감사합니다!

다른 팁

이는 쿼리의 매개 변수 중 하나가 잘못된 유형임을 의미합니다. 즉, 당신은 지나가고 있습니다 varchar 당신이지나 가야 할 때 smallint (short C#).

저장된 절차의 정의가 없다면 우리는 그것이 어느 쪽인지 추측 할 수있는 방법이 없습니다.

Varchar로 저장된 절차에 따라 걸리는 매개 변수 중 하나는 저장 프로 시저에서 Smallint로 입력됩니다. 그리고이 경우에 통과하는 값은 서버에 의해 정수 값으로 암시 적으로 변환 될 수 없습니다. 저장된 Proc 정의, Lala 또는 Lulu가 smallint로 입력 한 것을보십시오. 그런 다음 보내는 실제 값을보십시오 ...

데이터 세트 디자이너를 사용하면 모든 것을 생성하고 런타임 오류 대신 컴파일러 오류가 발생합니다. 프로젝트에 새 데이터 세트를 추가 한 다음 데이터 세트에 쿼리를 추가하십시오.

당신은 다음과 같은 것으로 끝납니다.

QueriesTableAdapter ta = new QueriesTableAdapter();
ta.Connection = myConnection;
ta.MySeveralParameterStoredProc(x0, x1, ..., xN);

매개 변수 수집을 통해 루프하고 값을보고 숫자가 될 수 있는지 확인할 수 있다고 생각합니다 (String.isnumeric). Debug.Assert를 사용하여 매개 변수 값이 너무 커서 작은 int 및 매개 변수 이름이라는 메시지를 출력합니다. 더 나은 것은 매개 변수 유형을 OLEDBTYPE.SMALLINT로 설정 한 다음이를 보는 것입니다. 궁극적으로 매개 변수와 기본 SQL에 해당하는 방법을 알아야합니다. 매개 변수를 올바르게 입력하여 검색을 좁히고 작동하지 않는 명령 객체에 아무것도 전달하지 않았는지 확인합니다. HTH. 가능한 코드 :

For each parameter as SqlParameter in mycommandobject.parameters
     if isnumeric(parameter.value) then
          debug.assert(convert.int32(parameter.value) <= 32,767,"This parameter could have an issue - " & parameter.parametername & " value = " & parameter.value) 
     end if

loop

나는 코드를 테스트하지 않았지만 이것이 효과가 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top