2017-03-03 105 views
0

我試圖將文件名列表插入到簡單的Sql Server表中。嘗試將.NET字符串[]映射到FastMember對象,但它出錯/未映射

我試圖利用SqlBulkCopy和@markgravell's FastMember庫,正如其他SO答案所建議的。

public async Task AddFileNamesAsync(string[] fileNames) 
{ 
    fileNames.ShouldNotBeNull(); 

    using (var bulkCopy = new SqlBulkCopy(ConnectionString)) 
    { 
     using (var reader = ObjectReader.Create(fileNames)) 
     { 
      bulkCopy.DestinationTableName = "FileNames"; 
      bulkCopy.ColumnMappings.Add("value", "FileName"); 
      await bulkCopy.WriteToServerAsync(reader) 
          .ConfigureAwait(false); 
     } 
    } 
} 

CREATE TABLE [dbo].[FileNames](
[FileNameId] [int] IDENTITY(1,1) NOT NULL, 
[FileName] [varchar](500) NOT NULL 

所以我覺得這是一個映射問題,要麼: - FastMember無法映射到一些內部後盾收集 - 該FastMember後盾集合並不具有相同的名稱作爲數據庫列,因此它可以地圖。

誰能幫助嗎?

+0

您可以編寫自己的IDataReader實現。 SqlBulkCopy只調用閱讀器上的GetValue,Read和FieldCount實現,因此編寫自定義閱讀器相對容易。只是一個想法。 – TnTinMn

回答

1

我從來沒有使用過這個庫,但在審查GitHub源代碼之前,它需要一個屬性來從源查詢。現在在一個字符串中沒有一個屬性value所有你必須使用的是Length屬性。使用Length。現在,這可能是FastMember庫的一個問題,它會創建一個CallSite訪問器函數來捕獲目標對象的屬性。

Source here

現在我有一齣戲,並不能獲得訪問,將工作的任何財產。乍一看,他們是Chars財產正在TypeAccessor結果返回,但這似乎不工作。

我的建議並不是真正解決問題的方法,而是解決問題的方法。如果你創建了一個具有字符串屬性的類型,那麼你可以有效地解決這個問題。

public async Task AddFileNamesAsync(string[] fileNames) 
{ 
    fileNames.ShouldNotBeNull(); 

    var list = fileNames.Select(f => new { value = f }); 

    using (var bulkCopy = new SqlBulkCopy(ConnectionString)) 
    { 
     using (var reader = ObjectReader.Create(list)) 
     { 
      bulkCopy.DestinationTableName = "FileNames"; 
      bulkCopy.ColumnMappings.Add("value", "FileName"); 

      try 
      { 
       await bulkCopy.WriteToServerAsync(reader) 
           .ConfigureAwait(false); 

      } 
      catch(Exception ex) 
      { 

      } 
     } 
    } 
} 

現在,當我們產生一種新型的具有value一個屬性,它是每一個文件名,這將工作。現在執行應該按預期工作。 (請注意,try..catch...僅用於測試)。

+0

我很害怕這個建議的答案,因爲那時我會擁有兩份數據副本。當然,我們不是在談論一個bazillion(源)字符串......但這是關鍵。這就是爲什麼我在OP中避免提及這一點。嗯.......無賴。但是,是的......我在回答這個問題的時候也是這樣想的。 –

+0

@ Pure.Krome抱歉無法找到另一種方法來破解它,而無需實際更改並重新編譯FastMember的源代碼。我嘗試了訪問方法的方法(即在一個字符串上調用'ToString()'),但它只鎖定了屬性。 – Nico

+0

沒問題。 :)儘管我非常感謝你的時間! –