2009-05-15 4 views
9

동일한 스키마의 두 데이터베이스가있는 경우 두 데이터베이스간에 레코드를 쉽게 전송할 수 있습니까? 도중에 몇 가지 추가 작업을 수행해야하고 전송할 레코드를 나타내는 개체를 사용하면 훨씬 쉽게 작업 할 수 있으므로 SQL에 LINQ를 사용하고 있습니다. 이것은 소규모 도우미 응용 프로그램이므로 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(); 
    } 
} 

:

시도가 부착 또는 추가하게되었습니다 새로운 DataContext로부터로드되었을 가능성이있는 엔티티. 지원되지 않습니다.

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

을 다음 복제 된 항목을 삽입 :

나는이 같은 개체의 단순 복사본을 수행하여이 피해 갈 수 있습니다. 테이블의 관계를 나타내는 참조가 아니라 문제의 필드 만 복사하면 정상적으로 작동합니다. 그러나 조금 오래되었지만 내가하고있는 방식은 Clone 메서드의 모든 필드를 수동으로 할당해야합니다. 누구나 쉽게이 방법을 제안 할 수 있습니까? 내가 알고 싶은 두 가지 있습니다 :

  1. 는 SQL에 LINQ 수

    는 쉬운 방법으로이 작업을 수행
  2. 삽입하는 얕은 복사본을 만들 반사를 사용하는 좋은 방법이 있나요?

감사합니다.

답변

0

이것은 학구적 인 운동입니까?

내가 심각하게 SSIS 사용하는 방법에 대해 생각하지 않으면 : 대신 http://msdn.microsoft.com/en-us/library/ms141026.aspx를, 또는 코뿔소 ETL 것을 실패 :. 데이터베이스 간의 http://ayende.com/Blog/archive/2008/01/16/Rhino-ETL-2.0.aspxfor 데이터 전달 [링크 텍스트] 다음은 [1]

+1

을 시도하지만, 내가 사용하는 전용 경량 도우미 응용 프로그램입니다. 각 배치의 여러 테이블에 50 개 이상의 행을 전송할 것으로 예상하지 않기 때문에 SSIS가 과도하게 과잉이라고 생각합니다. 객체 당 복제 방법을 사용하는 현재 솔루션은 정말 멋지게 작동하지만 멋지지 않습니다. 더 많은 테이블을 추가해야하므로 더 많은 복제 방법을 작성하기 전에 더 나은 방법을 찾고 싶었습니다! –

3

얕은 복제 LINQ 객체에 대한 방법 (생략 기본 키) : Copy Linq Objects.

속성을 사용하지 않는 경우 메타 모델을 사용하도록 조정할 수 있습니다. 그런 다음 2 개의 데이터 컨텍스트 (하나의 소스, 하나의 대상)가 필요합니다. Copy from one database table to another C#

+0

정말 감사합니다. 나는 자동 생성 엔티티 클래스를 사용하여 복제 메소드를 사용하는 데 필요한 모든 마크 업을 갖습니다. LINQ to SQL을 사용하면 SQL을 더 쉽게 만들 수 있습니다.하지만 아무도이를 수행 할 방법을 모르는 경우 시간이 많이 절약됩니다. –

0

왜 이렇게 LINQ 사용을 참조하십시오 -

또는, SqlBulkCopy 볼 수 있을까? SQL Server의 DTS를 사용할 수있게되면 프레임 워크가 방해받을 수 있습니다.

+0

DTS가 필요하지 않습니다. SqlBulkCopy가 작동하고 약 5 줄의 코드입니다. –

+0

길을 따라 몇 가지 추가 작업을 수행 할 수 있어야합니다.이 경우 엔티티 클래스를 사용하면 다른 방법으로 쉽게 작업 할 수 있습니다 ...이 방법이 레코드를 전송하는 가장 좋은 방법은 아니지만 몇 가지가 있습니다. 내가 LINQ를 사용 하게끔 만드는 다른 요인들. –

+0

DTS로 당신이 할 수 있다고 생각합니다. 나는 그것이 얼마나 유연한 지에 관해 너무 확신하지 못한다. 나는 당신이 여기에 답을 찾지 못하면 조사 할 가치가 있다고 생각합니다. – uriDium

0

내가 LINQ - 투 - SQL 개체 분리합니다 DataContractCloner를 사용

/// <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 - 투 - SQL 개체가 이미 주석이됩니다, 그래서 이것은 당신이 나중에 재 부착 할 수있는 부착 복제본을 만듭니다 몇 가지주의 사항. 먼저 외래 키 관계가 해결되므로 종속성 순서대로 삽입해야하며 순환 관계가있는 경우 스키마에서 외래 키를 제거하고 전송 후에 다시 적용해야합니다.둘째, LINQ-to-SQL은 ID 삽입을 수행하지 않으므로 자동 증가 ID 열을 사용하는 경우 제출시 문제가 발생합니다. ID 삽입을 가능하게하기 위해 DataContext를 강제 실행하지 못했지만 YMMV.

+0

바보 같은 질문 일지 모르지만 DataContractCloner는 무엇입니까? 나는 문서에서 전혀 참조를 찾을 수 없습니다 ... –

+0

예 - Google은 정확히 하나의 결과를 나타냅니다 :이 페이지! –

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

이것은 나를 위해 완벽하게 작동했습니다. 감사! –

관련 문제