Ошибка реализации IDataReader с помощью SqlCeBulkCopy

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

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

Мне хочется поверить, что я каким-то образом неправильно реализовал интерфейс 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 s, стиль 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, String destinationConnectionString, String tableName) в E: \ Code \ Desktop MySoftware \ Software \ Desktop \ MySoftwareSoftware \ Software \ Desktop \ MySoftware \ Software .cs: ​​строка 42 в MySoftware.Modules.Analysis.Services.SqlCeDataManagerService.InsertData (String connectionSt ring, String tempWorkFolder, TableInfo tableInfo) в E: \ Code \ Desktop MySoftware \ software \ desktop_and_web \ MySoftware \ MySoftware.Analysis \ Services \ SqlCeDataManagerService.cs: строка 742


person MrShoes    schedule 14.11.2013    source источник
comment
Используйте трассировку стека, чтобы узнать, где возникает исключение. Его не выбрасывает опубликованный вами код.   -  person Joe    schedule 14.11.2013
comment
Я добавил трассировку стека. Я вижу, что он пытается преобразовать строку в байт, но почему тот же метод отлично работает с SqlDataReader, а не с моей собственной реализацией?   -  person MrShoes    schedule 14.11.2013


Ответы (2)


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

person pingoo    schedule 14.11.2013
comment
Значение в Reader равно нулю. Пункт назначения - tinyint, допускающий значение NULL. - person MrShoes; 14.11.2013
comment
Где вы вызываете public bool IsDBNull (int i)? - person ozczecho; 14.11.2013
comment
Я не вызываю IsDBNull, я предполагал, что SqlCeBulkCopy.WriteToServer может использовать его для проверки нулевого значения. - person MrShoes; 14.11.2013
comment
Он не используется WriteToServer - sqlcebulkcopy.codeplex.com/SourceControl/ - person ErikEJ; 14.11.2013

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

person MrShoes    schedule 14.11.2013