使用SqlCeBulkCopy进行IDataReader实现失败

时间:2013-11-14 11:33:42

标签: c# sql-server-ce sqlbulkcopy idatareader

我尝试将数据从.DAT文件(从SQL Server输出)批量加载到SQL CE 4.0文件。我一直在使用ErikEJ的SqlCeBulkCopy类从SQL Server中完美地加载数据,但是从.DAT开始就是一个问题。

我创建了一个实现IDataReader的类来读取.DAT,所以我可以将读者传递给SqlCeBulkCopy.WriteToServer方法。读者大多似乎很好,但我有空的问题;从.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)
     

at System.Number.ParseInt32(String s,NumberStyles style,NumberFormatInfo info)      在System.Byte.Parse(String s,NumberStyles style,NumberFormatInfo info)      at System.Convert.ToByte(String value,IFormatProvider provider)      在System.Data.SqlServerCe.SqlCeUpdatableRecord.SetClrTypeValue(Int32 ordinal,Object value,String method)      在System.Data.SqlServerCe.SqlCeUpdatableRecord.SetValue(Int32 ordinal,Object value)      在ErikEJ.SqlCe.SqlCeBulkCopy.WriteToServer(ISqlCeBulkCopyInsertAdapter适配器)      在ErikEJ.SqlCe.SqlCeBulkCopy.WriteToServer(IDataReader阅读器)      在E:\ Code \ Desktop中的MySoftware.Modules.Analysis.SqlCeFileConfiguration.SqlCeBulkDataStreamer.CopyFromReader(IDataReader reader,String destinationConnectionString,String tableName)MySoftware \ software \ desktop_and_web \ MySoftware \ MySoftware.Analysis \ SqlCeFileConfiguration \ SqlCeBulkDataStreamer.cs:第42行      在E:\ Code \ Desktop中的MySoftware.Modules.Analysis.Services.SqlCeDataManagerService.InsertData(String connectionString,String tempWorkFolder,TableInfo tableInfo)MySoftware \ software \ desktop_and_web \ MySoftware \ MySoftware.Analysis \ Services \ SqlCeDataManagerService.cs:line 742 < / p>

2 个答案:

答案 0 :(得分:0)

导入中是否有任何数值?听起来它试图转换/解析int及其失败。

答案 1 :(得分:0)

事实证明问题是我错过的;源不是null,它实际上是一个空字符串。当我从.DAT文件中读取时,我似乎在错误的位置进行转换。