2013-11-14 79 views
1

我試圖批量加載數據從一個.DAT文件(輸出從SQL Server)到一個SQL CE 4.0文件。我一直在使用ErikEJ的SqlCeBulkCopy類從SQL Server完全加載數據,但是.DAT一直是個問題。SqlCeBulkCopy IDataReader實施失敗

我創建了一個實現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(字符串s的NumberStyles風格的NumberFormatInfo信息) 在System.Byte.Parse(字符串s的NumberStyles樣式,NumberFormatInfo信息) at System.Convert.ToByte(String value,IFormatProvider provider) at System.Data.SqlServerCe.SqlCeUpdatableRecord.SetClrTypeValue(Int32 ordinal,Object value,String method) at 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:line 42 at MySoftware.Modules.Analysis.Services.SqlCeDataManagerService.InsertData(String connectionString,String tempWorkFolder,TableInfo tableInfo)in E:\ Code \ Desktop MySoftware \ software \ desktop_and_web \ MySoftware \ MySoftware.Analysis \ Services \ SqlCeDataManagerService.cs:line 742

+0

使用堆棧跟蹤找出拋出異常的位置。它不會從您發佈的代碼中拋出。 – Joe

+0

我已經添加了堆棧跟蹤。我可以看到它試圖將一個字符串解析爲一個字節,但爲什麼同樣的方法對SqlDataReader工作正常,而不是我自己的實現? – MrShoes

回答

0

事實證明,這個問題是我錯過的;源不是null,它實際上是一個空字符串。看起來,當我從錯誤點轉換的.DAT文件中讀取數據時。

0

導入中是否有任何數值?聽起來像它試圖轉換/解析一個int和它的失敗。

+0

Reader中的值爲空。目的地是可空的tinyint。 – MrShoes

+0

你在哪裏調用public bool IsDBNull(int i)? – ozczecho

+0

我沒有調用IsDBNull,我認爲SqlCeBulkCopy.WriteToServer可能使用它來檢查是否爲空。 – MrShoes

相關問題