2015-06-08 4 views
0

Я получаю странную ошибку в Visual Studio, и, конечно же, это замечательное программное обеспечение не может сказать мне, где ошибка, просто я получаю сообщение об ошибке. Я думаю, лучшее, что я могу сделать, это вставить мой код.Не удается найти InvalidCastException в приложении C#

using (SQLiteCommand cmd = new SQLiteCommand(query, con)) 
{ 
    using (SQLiteDataReader rdr = cmd.ExecuteReader()) 
    { 
     while (rdr.Read()) 
     { 
      //Console.WriteLine("{0} ", rdr["logLnNum"]); 
      ulong start, end, delta = 0; 
      string contentStr; 
      string contentMarkup; 
      String group; 

      start = (ulong)rdr["startTime"]; 
      end = (ulong)rdr["endTime"]; 
      convertTimes(start, end, 2728232, delta); 

      contentStr = String.Format("{0}, {1}, {2}, {3}, {4} (ms)", 
       rdr["offsetOfData"], rdr["amountOfData"], rdr["filename"], 
       rdr["logLnNum"], (delta * .001)); 
      contentMarkup = "<div title=\"" + contentStr + "\">" + contentStr + "</div>"; 

      group = String.Format("{0:X}", rdr["threadId"]); 
      group = group + ", " + rdr["threadName"]; 

      TimelineData inputData = new TimelineData(contentMarkup, end, group, start); 
      Console.WriteLine("Data processed"); 
      dataSet.Add(inputData); 
     } 
    } 
} 

Опять же, единственная ошибка, которую я получаю, это «System.InvalidCastException», произошедший в .exe.

+2

Что линии исключение происходит в? У вас есть 2 (улонг) отливки, это может быть –

+1

Да, отливка непосредственно из элемента DataReader не будет работать. Для тестирования попробуйте заменить (то есть) 'start = (ulong) rdr [" startTime "];' с 'start = ulong.Parse (rdr [" startTime "].ToString()) ' – helrich

+0

@DenisYarkovoy Большой вопрос, но, как я объяснил, он не скажет мне строки. Он говорит только, что это происходит, не более того. – Dagrooms

ответ

1

Прямое кастинг с объекта работает только тогда, когда этот объект наследуется от типа, на который вы производите (где-то вдоль линии, так или иначе).

Простой способ получить тип вам нужно из DataReader является вызов

[type].Parse(reader[index].ToString()) 

где [type] является то, что вы хотите, чтобы бросить в, т.е.

ulong.Parse(rdr["startTime"].ToString()) 

В DataReader объекты обычно имеют a .GetInt32(int), .GetDecimal(int) и т. д., что просто требует, чтобы вы перешли в индекс столбца для синтаксического анализа. Если у вас есть только имя столбца, вы можете использовать Reader.GetOrdinal("yourColumnName").

0

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

protected T getDataValue<T>(object value) 
{ 
     if (value != null && DBNull.Value != value) 
      return (T)value; 
     else 
      return default(T); 
} 

Затем вызовите его внутри DataReader итерации для каждого значения извлеченной, это поможет вам во время отладки, чтобы определить, какие поля вызывает исключение. Пример:

start = getDataValue<ulong>(rdr["startTime"]); 
end = getDataValue<ulong>(rdr["endTime"]); 

В двух словах, я обычно следую этим правилам при работе с доступом к данным, чтобы избежать исключения:

  • Если у вас есть доступ к базе данных, проверьте ваши данные с помощью DB клиента перед выполнение запросов из ADO, это может быть выполнено с тем же запросом.

  • Рассмотрите возможность использования одних и тех же типов в обоих слоях (DB и App), чтобы избежать исключений исключения -> это не то же самое, что и преобразование из varchar в int, что делает простой перевод из int в int (из Конечно, он приходит как объект, но наверняка имеет ожидаемое значение типа), вы уменьшаете много логики проверки при использовании одних и тех же типов.

  • Если поля вашей таблицы принимают значения NULL, рассмотрите возможность использования стратегии преобразования (например, метод, который я дал вам), чтобы присвоить действительное значение при нулевом значении.

  • Постарайтесь не писать слишком много «логики» в методах DataAccess, просто держите его простым, вы можете использовать DTO или бизнес-класс, чтобы хранить все значения, которые у вас есть из db, а затем использовать его/изменить/создать логику в бизнес-слое.

Надеется, что это помогает

Смежные вопросы