2017-01-13 3 views
0

私はデータでいっぱいDataTableオブジェクトを持っており、SQL-DB(私は挿入を行うには、foreachループを実行する必要はありません)に保存したい、私は次のようなコード:どのようにDapperを使ってDataTable全体を保存するのですか?

var dt = new DataTable(); 
// 
// ... data loading to table dt 
// 

string sql = @" 
INSERT INTO TB_Book (
    BookID, 
    BookName 
) SELECT 
    BookID, 
    BookName 
FROM 
@DataTable"; 

conn.execute(sql, new { DataTable = dt.AsTableValuedParameter("DataTable") }); 

ページが実行されると、次の例外をスローします。

カラム、パラメータ、または変数@DataTable。 :データ型が見つかりませんDataTable

このコードを改善するにはどうすればよいですか?

答えて

2

私はAsTableValuedParameterでまだ作業していませんが、私はdappers GITリポジトリで書かれたユニットテストを使用して、何か大胆なことを教えています。私はあなたの質問を調査するためにそこに行ったとき、私は次のようにあります:

https://github.com/StackExchange/dapper-dot-net/blob/61e965eed900355e0dbd27771d6469248d798293/Dapper.Tests/Tests.Parameters.cs#L251

あなたが提供する「データテーブル」タイプなしAsTableValuedParameter()を使用したいと思うでしょうように見えます。ここで

はStackExchangeからの例です:

[Fact] 
public void DataTableParameters() 
{ 
    try { connection.Execute("drop proC#DataTableParameters"); } 
    catch { } 
    try { connection.Execute("drop table #DataTableParameters"); } 
    catch { } 
    try { connection.Execute("drop type MyTVPType"); } 
    catch { } 
    connection.Execute("create type MyTVPType as table (id int)"); 
    connection.Execute("create proC#DataTableParameters @ids MyTVPType readonly as select count(1) from @ids"); 

    var table = new DataTable { Columns = { { "id", typeof(int) } }, Rows = { { 1 }, { 2 }, { 3 } } }; 

    int count = connection.Query<int>("#DataTableParameters", new { ids = table.AsTableValuedParameter() }, commandType: CommandType.StoredProcedure).First(); 
    count.IsEqualTo(3); 

    count = connection.Query<int>("select count(1) from @ids", new { ids = table.AsTableValuedParameter("MyTVPType") }).First(); 
    count.IsEqualTo(3); 

    try 
    { 
     connection.Query<int>("select count(1) from @ids", new { ids = table.AsTableValuedParameter() }).First(); 
     throw new InvalidOperationException(); 
    } 
    catch (Exception ex) 
    { 
     ex.Message.Equals("The table type parameter 'ids' must have a valid type name."); 
    } 
} 
関連する問題