실패한 값 변환에 대한 ExecuteNquery 방법에 대한 예외
-
18-09-2019 - |
문제
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
나는 코드를 테스트하지 않았지만 이것이 효과가 있다고 생각합니다.