2013-11-14 2 views
1

Я пытаюсь загрузить данные из файла .DAT (вывод из SQL Server) в файл SQL CE 4.0. Я использую класс SqlCeBulkCopy от ErikEJ для полной загрузки данных с SQL Server, но из .DAT была проблема.Ошибка реализации IDataReader с SqlCeBulkCopy

Я создал класс, который реализует IDataReader для чтения из .DAT, поэтому я могу передать читателя в метод SqlCeBulkCopy.WriteToServer. Читателю, в основном, кажется, все в порядке, но у меня проблемы с нулями; исключение генерируется, когда нуль считывается из файла .DAT и вставляется в столбец с нулевым значением в таблице адресатов.

У меня возникает соблазн поверить, что я каким-то образом реализовал интерфейс IDataReader. У меня есть значения, хранящиеся в массиве System.Object, а метод IsDBNull реализуется следующим образом:

public bool IsDBNull(int i) 
{ 
    return Values[i] == null; 
} 

Стоит отметить, что я поставил точку останова здесь и метод не вызывается.

В противном случае, мои соответствующие методы:

public object GetValue(int i) 
     { 
      return Values[i] ?? DBNull.Value; 
     } 
    object IDataRecord.this[int i] 
     { 
      get { return GetValue(i); } 
     } 

    object IDataRecord.this[string name] 
     { 
      get 
      { 
       return GetValue(GetOrdinal(name)); 
      } 
     } 

Исключение я получаю это FormatException с сообщением «Входная строка не была в правильном формате.» Кто-нибудь знает, где я ошибаюсь?

Это трассировки стека из исключения:

at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 

на System.Number.ParseInt32 (String с, NumberStyles стиль, NumberFormatInfo информация) на System.Byte.Parse (String s, NumberStyles стиль, NumberFormatInfo информация) на System.Convert.ToByte (значение String, поставщик IFormatProvider) в System.Data.SqlServerCe.SqlCeUpdatableRecord.SetClrTypeValue (Int32 порядковое, значение объекта, метод String) на System.Data.SqlServerCe.SqlCeUpdatableRecord. SetValue (Int32 ординал, значение объекта)на ErikEJ.SqlCe.SqlCeBulkCopy.WriteToServer (ISqlCeBulkCopyInsertAdapter адаптер) на ErikEJ.SqlCe.SqlCeBulkCopy.WriteToServer (IDataReader читателя) на MySoftware.Modules.Analysis.SqlCeFileConfiguration.SqlCeBulkDataStreamer.CopyFromReader (IDataReader читатель, Строка destinationConnectionString, строка таблицы) в E: \ Code \ Desktop MySoftware \ software \ desktop_and_web \ MySoftware \ MySoftware.Analysis \ SqlCeFileConfiguration \ SqlCeBulkDataStreamer.cs: строка 42 на MySoftware.Modules.Analysis.Services.SqlCeDataManagerService.InsertData (String connectionString, String tempWorkFolder, TableInfo tableInfo) в E: \ Code \ Desktop MySoftware \ software \ desktop_and_web \ MySoftware \ MySoftware.Analysis \ Services \ SqlCeDataManagerService.cs: строка 742

+0

Используйте трассировку стека, чтобы узнать, где выбрасывается исключение. Это не выбрасывается из кода, который вы опубликовали. – Joe

+0

Я добавил трассировку стека. Я вижу, что он пытается разобрать строку в байт, но почему же этот метод отлично работает с SqlDataReader, а не с моей собственной реализацией? – MrShoes

ответ

0

Оказывается, проблема была в том, что я пропустил; источник не был нулевым, это была пустая строка. Кажется, когда я читал из файла .DAT, я конвертировал в неверную точку.

0

У вас есть числовые значения в вашем импорте? Похоже, что он пытается конвертировать/разбирать int и его провал.

+0

Значение в Reader равно null. Пункт назначения является нулевым tinyint. – MrShoes

+0

Где вы называете public bool IsDBNull (int i)? – ozczecho

+0

Я не звоню в IsDBNull, я предположил, что SqlCeBulkCopy.WriteToServer может использовать его для проверки нулевого. – MrShoes