System.FormatException: входная строка имела неправильный формат с OdbcDataReader.GetFieldValue.

У меня есть запрос, как показано ниже

SELECT NAME, MARKS, COUNT(*) AS TOTAL FROM STUDENTS GROUP BY NAME, MARKS

При повторении OdbcDataReader я сталкиваюсь с System.FormatException, код и трассировка стека были следующими:

Using dataReader As System.Data.Odbc.OdbcDataReader = CType(cmdODBCCommand.ExecuteReader(), System.Data.Odbc.OdbcDataReader)
    While (dataReader.Read())
        Dim stuName As String = dataReader.GetFieldValue(Of String)(0)
        Dim stuMarks As String = dataReader.GetFieldValue(Of String)(1)
        Dim stuCount As Int32 = dataReader.GetFieldValue(Of Int32)(2)<-- Exception here
        ' The entire database contains only 10 rows still getting the format exception.
        ' Also tried like below
        'Dim x = dataReader.Item("Name")
        'Dim y = dataReader.Item("Marks")
        'Dim z = dataReader.Item("TOTAL") <-- Exception here
        'Dim stuCount As Int64 = dataReader.GetFieldValue(Of Int64)(2)<-- Exception here
    End While
End Using

Трассировка:

System.FormatException was caught
  HResult=-2146233033
  Message=Input string was not in a correct format.
  Source=mscorlib
  StackTrace:
       at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
       at System.Number.ParseInt64(String value, NumberStyles options, NumberFormatInfo numfmt)
       at System.Data.Odbc.OdbcDataReader.internalGetInt64(Int32 i)
       at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i, TypeMap typemap)
       at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i)
       at System.Data.Common.DbDataReader.GetFieldValue[T](Int32 ordinal)
  InnerException: 

Кто-нибудь знает об этой проблеме и как от нее избавиться?

Я пробовал все решения, упомянутые по следующим URL-адресам:

Входная строка имела неверный формат. Convert.ToInt32(переменная)

Не удалось привести строку к типу int. Сообщение об ошибке: входная строка имеет неверный формат

Введенная строка имеет неверный формат?


person navule    schedule 03.12.2015    source источник
comment
У вас есть опция «Строгое отключение»? Обычно вы должны получить InvalidCastException вместо FormatException. Кроме того, я сомневаюсь, что вы получите такое же исключение в dataReader.Item("TOTAL"), потому что не задействовано приведение, которое может потерпеть неудачу.   -  person Tim Schmelter    schedule 03.12.2015
comment
Почему вы добавили еще и c#?   -  person Soner Gönül    schedule 03.12.2015
comment
@TimSchmelter У меня есть опция Strict On Option Explicit On. SonerGönül, я также принимаю ответы на С#. Но я предпочитаю vb.net   -  person navule    schedule 03.12.2015
comment
К какому движку базы данных вы обращаетесь (Oracle, Access, Sql Server и т. д.)?   -  person user957902    schedule 03.12.2015
comment
Попробуйте dataReader.GetFieldValue(Of Int64)(3) или найдите в отладчике тип dataReader("TOTAL") (что не должно привести к ошибке, иначе вы не показываете настоящий запрос/код).   -  person Tim Schmelter    schedule 03.12.2015
comment
@ user957902 против пользовательского поискового сервера от OpenText™ Search Server   -  person navule    schedule 03.12.2015
comment
@TimSchmelter dataReader(TOTAL) или dataReader.Item(TOTAL) вообще не оценивает. Также обновил код, который я пробовал, int64, long и типы объектов.   -  person navule    schedule 03.12.2015
comment
Я не профессионал VB, но разве индекс GetFieldValue не основан на нуле? Таким образом, вы бы выбрали GetFieldValue (0) до (2)   -  person Alex B.    schedule 03.12.2015
comment
@АлексБ. это опечатка. Тем не менее Dim z = dataReader.Item(TOTAL) ‹-- Исключение здесь   -  person navule    schedule 03.12.2015
comment
@viento: это опечатка, как будто вы не показываете настоящий код, который вызывает проблему. Вы также упомянули, что dataReader.Item("TOTAL") также вызывает исключение. Теперь вы утверждаете, что он вообще не оценивает. Что правильно? Что значит совсем не оценивает?   -  person Tim Schmelter    schedule 03.12.2015
comment
Что возвращает Dim z as String = dataReader.Item("TOTAL").ToString()?   -  person Alex B.    schedule 03.12.2015
comment
@TimSchmelter Под «не оценивает» я подразумеваю, где код выдает исключение. Это не модифицированный код. Я настроил пример консольного приложения и извлек оттуда код. Alex B dataReader.Item(TOTAL) сам по себе выдает исключение   -  person navule    schedule 03.12.2015
comment
Основываясь на том, что вы говорите, я бы попытался вызвать dataReader.FieldCount, чтобы убедиться, что у вас есть 3 поля, поскольку кажется, что вы не получаете 3. Возвращает ли ваш запрос то, что вы ожидаете, если вы запускаете его непосредственно в свою базу данных? Выдает ли dataReader.GetFieldType(2) также исключение? Я предполагаю, что OpenText™ Search Server может не поддерживать Count...?   -  person Daniel    schedule 03.12.2015
comment
Из дорожки стека исключений мы можем сделать вывод: 1) Индекс столбца 2 действительно существует 2) Его необработанный тип данных ODBC выглядит как тип String 3) любые возвращаемые строковые данные не имеют формата, который может быть проанализирован в целое число . Попробуйте вернуть индекс столбца 2 в виде строки как @AlexB. предложил. Думаю, это прольет свет на происходящее.   -  person user957902    schedule 03.12.2015
comment
@ user957902 Я тоже попробовал предложение Алекса Б. Выдает ту же ошибку. Stacktrace точно такой же, как указано в вопросе.   -  person navule    schedule 04.12.2015
comment
Есть ли командная строка для открытого текста, в которой вы можете выполнить запрос и посмотреть, что произойдет? Мне интересно, есть ли дополнительный текст в выходном потоке. В SQL Server отключен параметр nocount, который не позволяет информационным сообщениям попасть в поток вывода, что может вызвать проблемы с наборами результатов. Мне интересно, есть ли что-то подобное для OpenText? Как выглядит ваша строка подключения ODBC для подключения?   -  person user957902    schedule 04.12.2015
comment
После множества экспериментов и испытаний "dataReader.GetOrdinal(TOTAL)" решил проблему   -  person navule    schedule 07.12.2015
comment
GetOrdinal возвращает индекс столбца с указанным именем столбца. Он не возвращает фактическое значение столбца.   -  person user957902    schedule 07.12.2015
comment
О.. вот почему я всегда получаю одно и то же значение 2..   -  person navule    schedule 07.12.2015