【问题标题】:IDataReader implementation failure with SqlCeBulkCopySqlCeBulkCopy 的 IDataReader 实现失败
【发布时间】:2013-11-14 11:33:42
【问题描述】:

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

我创建了一个实现 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 s, NumberStyles 样式, NumberFormatInfo 信息) 在 System.Byte.Parse(String s, NumberStyles 样式, NumberFormatInfo 信息) 在 System.Convert.ToByte(字符串值,IFormatProvider 提供程序) 在 System.Data.SqlServerCe.SqlCeUpdatableRecord.SetClrTypeValue(Int32 序数,对象值,字符串方法) 在 System.Data.SqlServerCe.SqlCeUpdatableRecord.SetValue(Int32 序数,对象值) 在 ErikEJ.SqlCe.SqlCeBulkCopy.WriteToServer(ISqlCeBulkCopyInsertAdapter 适配器) 在 ErikEJ.SqlCe.SqlCeBulkCopy.WriteToServer(IDataReader 阅读器) 在 E:\Code\Desktop MySoftware\software\desktop_and_web\MySoftware\MySoftware.Analysis\SqlCeFileConfiguration\SqlCeBulkDataStreamer.cs: 中的 MySoftware.Modules.Analysis.SqlCeFileConfiguration.SqlCeBulkDataStreamer.CopyFromReader(IDataReader reader, String destinationConnectionString, String tableName) 在 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:line 742

【问题讨论】:

  • 使用堆栈跟踪找出引发异常的位置。它不是从您发布的代码中抛出的。
  • 我已经添加了堆栈跟踪。我可以看到它正在尝试将字符串解析为字节,但是为什么相同的方法在 SqlDataReader 上运行良好,而不是在我自己的实现上运行?

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


【解决方案1】:

您的导入中有任何数值吗?听起来像是它试图转换/解析一个 int 并且它失败了。

【讨论】:

  • Reader 中的值为空。目标是一个可为空的 tinyint。
  • 你在哪里调用 public bool IsDBNull(int i)?
  • 我没有调用 IsDBNull,我假设 SqlCeBulkCopy.WriteToServer 可能会使用它来检查是否为空。
  • WriteToServer 不使用它 - sqlcebulkcopy.codeplex.com/SourceControl/…
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多