2017-03-03 8 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バッキングコレクションは、DBの列と同じ名前を持っていません。マップはありません。

誰でも助けてください。

+0

あなたはIDataReaderの独自の実装を書くことができます。 SqlBulkCopyは読み取り専用でGetValue、Read、およびFieldCountの実装を呼び出すため、カスタムリーダーを作成するのは比較的簡単です。ちょっとした考え。 – TnTinMn

答えて

1

私はGitHubのソースコードを見直す前にこのライブラリを使用したことがありません。ソースからクエリを行うにはプロパティが必要です。文字列の上にプロパティーがありませんvalue実際に使用するのはLengthプロパティです。 Lengthを使用してください。これは、FastMemberライブラリで問題になる可能性があります。ここでは、ターゲットオブジェクトからプロパティを取得するアクセッサ関数をCallSiteに作成します。今

Source here

私はプレーを持っていたし、動作する任意のプロパティへのアクセスを得ることができません。一見するとTypeAccessor結果で返されるCharsプロパティですが、これは機能していません。

私の提案は実際には問題の答えではなく、それを機能させる方法です。文字列のプロパティを持つ型を作成した場合、これを効果的に回避できます。私たちはそれぞれのファイル名ですvalueのプロパティを持つ新しいタイプを生成したとして

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) 
      { 

      } 
     } 
    } 
} 

さて、これは動作します。これで、実行は期待通りに機能するはずです。 (try..catch...はテストのためのものだったことに注意してください)。

+0

私はこの提案された答えを恐れていました。なぜなら、データのコピーが2つあるからです。確かに、我々はbazillion(ソース)の文字列を話しているわけではない...しかし、それはポイントです。これが私がOPで言いました。うーん...バーマー。しかし、ええと...私はこの答えと同じ行に沿って考えていました。 –

+0

@ Pure.Krome申し訳ありませんが、実際にFastMemberのソースコードを変更して再コンパイルせずにハッキングする方法が見つかりませんでした。私はメソッドにアクセスする方法(文字列上で 'ToString()'を呼び出す)を試みましたが、プロパティにのみロックされていました。 – Nico

+0

問題ありません。 :)本当にありがとう! –

関連する問題