Я пытаюсь загрузить данные из файла .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
Используйте трассировку стека, чтобы узнать, где выбрасывается исключение. Это не выбрасывается из кода, который вы опубликовали. – Joe
Я добавил трассировку стека. Я вижу, что он пытается разобрать строку в байт, но почему же этот метод отлично работает с SqlDataReader, а не с моей собственной реализацией? – MrShoes