2009-05-15 7 views
9

同じスキーマの2つのデータベースがある場合、2つのデータベース間でレコードを簡単に転送できますか?途中でいくつかの追加操作を実行する必要があるため、LINQをSQLに使用しています。転送しているレコードを表すオブジェクトを使用すると、はるかに簡単になります。これは小規模のヘルパーアプリケーションなので、SSISはおそらく過度のスキルであり、SQLBulkCopyでは途中のオブジェクトを簡単に調べることができません。私がやりたいのは何LINQ to SQLを使用してデータベース間でコピーする

はこれです:

public static void TransferCustomer 
        (DBDataContext DCSource, 
         DBDataContext DCDest, 
         int CustomerID) 
{ 
    Customer customer; 
    using (DCSource = new DBDataContext(SourceConnStr)) 
    { 
    customer = DCSource.Customers 
         .Where(c => c.CustomerID == CustomerID) 
         .Single(); 
    } 

    using (DCDest = new DBDataContext(DestConnStr)) 
    { 
    DCDest.Customers.InsertOnSubmit(customer); 
    DCDest.SubmitChanges(); 
    } 
} 

しかし、メッセージと例外をスローする明白な理由のために:

試みは、ANを添付または追加することが行われています新しいエンティティではなく、別のDataContextからロードされている可能性があります。これはサポートされていません。

public static Customer Clone(this Customer customer) 
{ 
    return new Customer() 
    { 
    Name = customer.Name, 
    Email = customer.Email 
    etc... 
    }; 
} 

をして、クローン化された項目を挿入:

私はこのようなオブジェクトの簡易コピーを行うことによって、このラウンドを取得することができます。問題のフィールドだけをコピーし、テーブルの関係を表す参照はコピーしないとうまくいきます。それは少し長めですが、私がやっている方法では、クローンメソッドのすべてのフィールドを手動で割り当てる必要があります。誰もがこれを簡単にする方法を提案できますか?私が知りたいのですが二つのものがあります:

  1. SQLにLINQは、簡単な方法でこれを行うことができ、
  2. が挿入されます浅いコピーを作成するためにリフレクションを使用しての良い方法はありますか?

多くの感謝!

答えて

0

これは純粋に学問的なものですか?

私は真剣にSSISを使用することについて思うだろうでない場合は、次の代わりにhttp://msdn.microsoft.com/en-us/library/ms141026.aspx、またはRhinoのETLことができない:データベース間http://ayende.com/Blog/archive/2008/01/16/Rhino-ETL-2.0.aspxfor譲渡するデータ[リンクテキスト] [1]

+1

を試してみてください。私は、各バッチの複数のテーブルに50行以上の行を転送する予定はないので、SSISはおそらく過剰なものだと思います。オブジェクトごとにクローンメソッドを使用して私の現在のソリューションは本当にうまく動作しますが、それは控えめな感じです。私はより多くのテーブルを追加する必要があるので、より多くのクローンメソッドを作成する前に、より良い方法を見つけたいと思っていました。 –

3

はここを省略(浅いクローンLINQのオブジェクトへの道です主キー):Copy Linq Objects

属性を使用していない場合は、メタモデルを使用するように調整することができます。次に、2つのデータ・コンテキスト(1つのソース、1つの宛先)が必要です。

また、あなたはSqlBulkCopyで見ることができる - これを行うためにLINQを使用する理由Copy from one database table to another C#

+0

本当に有益です。私は自動生成されたエンティティクラスを使用しているので、クローンメソッドを使用するために必要なマークアップをすべて持っています。それはLINQ to SQLがこれをより簡単にするように感じていますが、誰もそれをやる方法がわからなければ、これで多くの時間を節約できます。 –

0

を参照してください? SQL ServerのDTSを利用できるようになると、フレームワークが邪魔になることは少し残念です。

私はLINQツーSQLエンティティを切り離すことDataContractClonerを使用
+0

DTSは必要ありません。 SqlBulkCopyは動作し、約5行のコードです。 –

+0

途中でいくつかの余分な操作を実行できる必要があります。この場合、エンティティクラスを使用すると、他の方法で自分の人生が楽になります...これはレコードを転送する最も良い方法ではありませんが、私がLINQを使いたい他の要素。 –

+0

DTSでカスタムをすることができると思います。それがいかに柔軟であるかについて私はあまり確信していません。私はここで答えが見つからないかどうか調べる価値があると思います。 – uriDium

0

:すべてのLINQツーSQLエンティティがすでに注釈さ

/// <summary> 
/// Serializes the entity to XML. 
/// </summary> 
/// <returns>String containing serialized entity.</returns> 
public string Serialize() 
{ 
    return DataContractCloner.Serialize<Organization>(this); 
} 

/// <summary> 
/// Deserializes the entity from XML. 
/// </summary> 
/// <param name="xml">Serialized entity.</param> 
/// <returns>Deserialized entity.</returns> 
public static Organization Deserialize(string xml) 
{ 
    return DataContractCloner.Deserialize<Organization>(xml); 
} 

ので、これはあなたが後でで再接続することができます取り付け可能なクローンを作成しますいくつかの注意点。まず、外部キーの関係が解決されるため、依存関係の順に挿入する必要があります。循環関係がある場合は、スキーマから外部キーを削除して、転送後に再適用する必要があります。次に、LINQ-to-SQLはアイデンティティの挿入を実行しないため、自動インクリメントID列を使用している場合、サブミット時に問題が発生します。私はアイデンティティの挿入を有効にするためにDataContextを強制することに成功しなかったが、YMMV。

+0

愚かな質問かもしれませんが、DataContractClonerは何ですか?私はドキュメント内で全く参照を見つけることができません... –

+0

ええ - Googleは正確に1つの結果を示しています:このページ! –

0

代わりにSQLBulkCopyクラスを使用することをお勧めします。ここでコードプロジェクトの記事をご覧ください:http://www.codeproject.com/KB/database/SqlBulkCopy.aspx。これはもっと簡単な方法ですが、LINQ-to-SQLに代わってクエリを作成する必要があります。

3

これは本当ですが、それは私が使用するための唯一の軽量ヘルパーアプリです。この

using (DCDest = new DBDataContext(DestConnStr)) 
{ 
    DCDest.Customers.InsertOnSubmit(customer.ToList()); //note the use of .ToList() 
    DCDest.SubmitChanges(); 
} 
+0

これは私にとって完璧に機能しました。ありがとう! –

関連する問題