2009-12-10 3 views
0

я использую OleDbCommand.ExecuteNonQuery() для вставки данных в базу данных:Исключения по 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() 

И есть исключение преобразования, который показывает только в последней строке:

ошибка преобразования типа данных VARCHAR в SMALLINT

Я хотел бы знать, если это нормальное поведение, и как я знаю, ш здесь возникает проблема преобразования.

обновление:

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

я нашел эту линию через комментируя каждую строку и раскомментировав некоторых, это один дает мне сказанное исключение.

ObjNFe.idMunFatoGerador является строкой и дает мне «ошибка преобразования типа данных VARCHAR в SMALLINT» слишком

+0

Обс: это более двух параметров и более 50. это сводка моего кода. – Marcelo

+0

50 параметров кажутся ужасными для хранимой процедуры. Не то, чтобы это было каким-то образом релевантным, а просто другим обс. –

+0

Почему я был заблокирован? этот вопрос уже был решен! – Marcelo

ответ

0

Я наконец нашел его.

Все было в порядке с форматами значений. Проблема была: один из параметров отсутствовал. Я все еще не понял его полностью, но проблема заключалась в том, что отсутствующий параметр (smallint) интерпретировался в следующем (varchar), и поэтому ошибка, которую я обнаружил, была во второй.

Другими словами, поле ~ 35 не хватало (ха-ха)

Так что вещь: при установке команды в порядке, помните всегда ставить поля в точном порядке и размере. =)

Спасибо, ребята!

+0

Почему я был заблокирован? – Marcelo

+0

Возможно, потому, что кто-то думал, что вы могли бы подсчитать свои параметры в коде SQL и VB, а не создавать вопрос. Нет, я не голосовал за вас, но я уверен, что это причина. – Wade73

3

Это означает, что один из параметров запроса неправильного типа. А именно, вы проезжаете varchar, когда вы должны проехать smallint (short в C#).

Без определения хранимой процедуры нет никакого способа, мы можем предположить, какой он есть ..

+0

это был Например, у меня нет только двух, иначе я бы не прочь просить, чтобы найти, где он находится. – Marcelo

2

Одним из параметров вы Пазинг хранимой процедуры как VARCHAR набираются в хранимой процедуре как SMALLINT , И в этом случае значение, которое вы передаете, не может быть преобразовано неявным образом сервером в целочисленное значение. Посмотрите на хранимое определение proc, либо lala, либо lulu набрано как smallint. Затем посмотрите фактические значения, которые вы отправляете ...

+0

это больше, чем два. Я просто хочу знать, какой из них передается неправильно, не видя каждого. – Marcelo

1

Если вы используете конструктор DataSet, он будет генерировать все для вас, и вы получите ошибку компилятора вместо ошибки во время выполнения. Добавьте новый проект DataSet в свой проект, а затем добавьте запрос в DataSet.

Вы в конечном итоге с чем-то вроде этого:

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

Я думаю, вы могли бы цикл по коллекции параметров и посмотрите на значение и посмотреть, если он может быть Numberic (string.isnumeric). Используйте debug.assert для вывода сообщения о том, что значение параметра слишком велико, чтобы быть маленьким int, а также именем параметра. Еще лучше для вас установить тип параметра oledbtype.smallint, а затем посмотреть только на них. В конечном счете, вам нужно знать ваши параметры и то, как они соответствуют базовому SQL. Я просто сужу свой поиск, набрав мои параметры правильно, а затем гарантирую, что я никогда ничего не передавал в объект команды, который бы не работал. НТН. Возможный код:

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 

Я не проверял код, но я считаю, что это будет работать.