2011-02-11 1 views
2

OK, 여기 시나리오가 있습니다. 제 생각에 그것은 꽤 흔한 일이며, 이전의 삶에서 무차별 대입 접근법을 사용하여 그것을 해결했지만, 더 좋은 방법이 있어야한다고 생각합니다.순차적 인 이름 목록의 변경 사항을 SQL 데이터베이스에 저장하는 방법은 무엇입니까?

정렬 된 이름 목록과 사용자가 순서를 바꾸고 삭제하고 편집하고 이름을 추가 할 수있는 UI가있는 경우 SQL 데이터베이스에 저장된 목록을 어떻게 업데이트하겠습니까?

다음은 테이블 정의입니다 :

CREATE TABLE [dbo].[AssyLines](
    [AssyLineID] [int] IDENTITY(1,1) NOT NULL, 
    [ShortName] [varchar](16) NOT NULL, 
    [LongName] [varchar](45) NOT NULL, 
    [Seq] [tinyint] NOT NULL, 
CONSTRAINT [PK_AssyLines] PRIMARY KEY CLUSTERED 

내가 테이블에서 모든 항목을 읽고 UI에서 서열의 순서로 표시됩니다 싶지. 그런 다음 사용자는 ShortName 또는 LongName을 편집하고 목록의 순서를 바꾸고 새 항목을 추가하거나 기존 항목을 삭제 한 다음 수정 된 목록을 다시 데이터베이스에 저장할 수 있습니다.

차이점이 있으면 클라이언트 - 서버 응용 프로그램입니다. WCF 서비스는 데이터베이스 상호 작용을 처리하고 클라이언트는 서비스와의 일련의 레코드를 전달합니다.

나의 총잡이 접근 방식은 테이블을 잠그고, 모든 항목을 삭제 한 다음, 테이블에 새로운 레코드를 재 작성하는 것입니다. 물론 모든 트랜잭션 내에서 저장 프로 시저와 테이블 변수 또는 임시 변수를 사용합니다 표. 조잡하지만 효과적이지만, 누군가를 사소한 편집을 할 때마다 테이블을 누크하고 다시 만들지 않고도이를 수행 할 수있는 표준 방법이 있다는 것을 느낄 수는 없습니다.

아이디어가 있으십니까? 나는 현재 작업하고있는 응용 프로그램에 4 개 또는 5 개의 목록을 가지고 있습니다.

감사합니다, 데이브

+0

언급했듯이 Seq 값은 UI에서 제공됩니다. 기본적으로 들어오는 배열에서 Seq 순서로 정렬 된 목록 상자를로드합니다. 저장시 목록 상자 목록을 새 배열로 다시 읽은 다음 Seq 값을 증가시킨 다음 배열을 저장합니다. – DaveN59

+0

테이블 디자인을 변경할 수 있습니까? 이것은 당신이 보여주고있는 것 이상으로 연결된리스트 구조처럼 들린다. – Randy

+0

절대적으로 디자인을 변경할 수 있습니다. 프로젝트는 초기 단계에 있으며 데이터베이스와 애플리케이션을 모두 제어합니다. 그게 어떻게 작동하는지 설명 해주십시오 ... – DaveN59

답변

0

다른 열을 사용자가 지정한 것으로 업데이트하는 각 레코드 (변경해서는 안되는 AssyLineID로 식별 됨)에 대해 UPDATE 쿼리를 실행하지 않는 이유는 무엇입니까? 아무 것도 삭제할 필요가 없으며 사용자가 변경 한 내용을 추적하여 DB 작업의 양을 줄일 수 있습니다.

당신이 Seq 부분을 재정렬에 대해 걱정하는 경우

, 나는이 것을 위해 작동 생각 : 당신은 당신이 테이블마다 시간이 핵무기 할 필요가 느끼는 이유
if (newSeq < oldSeq) 
{ 
    sql = "UPDATE AssyLines SET Seq = Seq + 1 WHERE Seq >= @seq AND Seq < @oldSeq AND AssyLineID <> @lineID"; 
} 
else if (newSeq > oldSeq) 
{ 
    sql = "UPDATE AssyLines SET Seq = Seq - 1 WHERE Seq <= @seq AND Seq > @oldSeq AND AssyLineID <> @lineID"; 
} 

어쩌면 내가 이해가 안 돼요. Seq 부분 이외의 기본 선택 - 수정 - 저장 작업과 비슷합니다.

+0

사용자가 삭제 한 레코드를 제외하고는 제대로 작동한다고 생각합니다. 새 레코드의 경우 UPDATE 문을 INSERT 문으로 대체 할 수 있지만 여전히 삭제 된 레코드가 무엇인지 알아낼 수있는 방법이 필요합니다. – DaveN59

+0

@ DaveN59 : 표시 한 원래 목록을 추적하십시오. 그러면 어떤 레코드가 변경/삭제되었는지 알려주고 어떤 레코드가 새로운 레코드인지 알려줍니다. ASP.NET을 사용하는 경우 ViewState에 저장할 수 있습니다. –

+0

@ DaveN59 : 이벤트 처리기를 추가하여 사용자가 변경 한 사항을 추적 할 수도 있습니다. 이것은 더 나은 방법일지도 모르지만 다만 그들을 모두 붙잡는 는다는 것을 확인하십시오. –

0

I 아니에요 .NET 개발자,하지만 테이블에 3 청취자를하는 것이다 이렇게 한 번 더 우아한 방법; 추가 리스너, 업데이트 리스너 및 삭제 리스너가 있습니다. 리스너는 각각 INSERT, UPDATE 및 DELETE를 트리거합니다.

목록을 정렬해도 데이터베이스에 저장된 데이터에는 영향을주지 않습니다.

+0

클라이언트 - 서버 것을 제외하고는 작동 할 수도 있습니다. 데이터베이스를 밟을 무렵에는 일련의 레코드로 작업하고 있습니다 ... – DaveN59

+0

서버는 해고 된 순서대로 리스너를 처리합니다. 예, 데이터베이스 상태가 클라이언트의 상태와 일치하기 전에 지연이 있습니다. –

0

내가 취할 접근법은 기본 키를 사용하여 변경 사항에 업데이트, 삽입 및 삭제를 연결하고 데이터를 두 번 통과시키는 것입니다.

  1. 데이터베이스에서 UI로 목록을로드하고 항목에 대해 ID를 저장하십시오. 또한 모든 항목에 대해 처음에 false로 설정된 "changed"플래그를 저장하십시오.
  2. 이 같은 UI 내의 데이터에 대한 변경을 상기 데이터에
    • 추가 -1의 ID (기본 키)를 true로 변경 플래그를 설정, 추가하여.
    • 데이터를 편집하여 업데이트 된 플래그를 true로 설정합니다.
    • 데이터를 삭제하여 삭제합니다. 변경된 플래그 = TRUE 및 다음을 수행 목록의 각 항목을 통해
  3. 대하여 반복은 :
    • ID = -1이면 INSERT를 사용하여 새로운 레코드를 추가한다.
    • ID가 -1보다 큰 경우 UPDATE를 사용하여 업데이트하려는 레코드와 ID가 일치하는 기존 레코드를 업데이트하십시오.
  4. 데이터베이스에있는 레코드의 ID를 모두 다시 읽은 다음 각 레코드를 반복하고 목록이 있는지 확인하십시오. 그렇지 않은 경우 DELETE를 사용하여 데이터베이스에서 삭제하십시오.

많은 양의 데이터가있는 경우 4 단계가 상당히 느려질 수 있습니다. 약간 다른 효율적인 방법은 UI에서 삭제 된 레코드를 '표시'하고 제거하지 않고보기에서 숨길 수 있는지에 따라 달라집니다. 그런 다음 변경된 플래그를 삽입, 업데이트 또는 삭제 여부에 따라 'I', 'U'또는 'D'로 설정된 상태로 바꿀 수 있습니다. 그런 다음 데이터를 한 번 통과하면됩니다.

관련 문제