2011-09-06 5 views
0

몇 개의 열이있는 레코드 목록을 저장해야합니다. 나는 그것을 할 수있는 두 가지 방법이있다.임시 테이블을 사용하여 여러 왕복하기

    단순히 해당 요소들의리스트를 생성하고 코드 내에서 프로 시저를 여러 번 수행 할 수
  1. 의 foreach (lstTestInfo에 TestInfo 시험) {// 저장 프로 시저 실행}

  2. 나는 문자열을 구축하고 나는 그것을 분할하고 임시 테이블에 저장할 수있는 데이터베이스로 전송하고 하나의 왕복

거기를 삽입 할 수 있습니다

이것은 심각한 문제는 아니지만 ... 나는 약간의 통찰력을 원합니다. 감사합니다.

답변

1

두 가지 방법으로 살펴볼 수 있습니다. 1. 쉬운 일을하십시오. 2. 올바른 일을합니까? 첫 번째 옵션은 쉽지만 장기적인 솔루션을 제공하는 옵션은 아닙니다. 조만간 당신은 올바른 수행과 그것을하기위한 가장 사소한 방법이 아니라는 것을 깨닫게 될 것입니다. 한 대의 컴퓨터에 사용자가 거의없고 모든 설정이있는 경우이 방법이 효과적 일 수 있습니다.

그러나 두 번째 방법은 전신 전송을 줄이는 것이 아니라 데이터베이스 호출을 최소화하는 것입니다. 당신은 연결이 포함될 것이라는 것을 의미하는 SP를 실행하는 것에 대해 이야기하고 있습니다. DB에 대한 모든 호출은 오버 헤드이며이를 최소화하려고 노력해야합니다. n 계층 배포 환경에서로드 균형 조정을 수행하는 경우 # 1 옵션을 사용하면 다른 서버에서 DB를 호출하는 것이 멈추게됩니다.

옵션 2를 선택 하겠지만 구현하는 데 약간의 시간이 필요하지만 나중에 내 작업을 저장합니다.

3

간단하게 유지하십시오. 가장 쉬운 방법으로 구현할 수있는 솔루션으로 시작하십시오.

그런 다음 성능이 충분한 지 테스트하고 문제가있는 경우 구현을 재고하십시오.

+0

사실 저는 첫 번째 방법을 수행하고 있습니다 ...하지만 지금은 성능에 대해 우려하고 있습니다 ... – Paras

1

두 번째 옵션을 구현하려고하면 문자열 자체의 길이가 문제가 될 수 있습니다. 보내는 데이터가 너무 많습니다. 솔루션의 효율성이 떨어지는 데이터는 더 많습니다.

DB에 대한 여러 번의 호출 (솔루션 1) 이상의 작업도 오버 헤드입니다. 또한 여러 셀이 다른 셀의 업데이트에 종속되어 있다고 가정 할 때 트랜잭션을 엉망으로 만들 수도 있습니다.

자신이 결정해야하는 트레이드 오프를 결정하십시오.

+0

응용 프로그램에서 삽입/업데이트 문을 생성하고 실행할 수 있습니까?삽입/업데이트 할 proc 작성을 고집하지 않는 한 – ViSu

1

데이터를 효율적으로 전달하기 위해 단일 연결과 명령을 사용하는 것이 간단합니다. 다른 복잡한 기술을 사용할 수는 있지만, 많은 이점을 제공하고 귀하의 sproc을 엉망으로 만들 것이라고는 생각하지 않습니다.

public void UpdateUserItems(Guid userId, string[] items) 
{ 
    using (SqlConnection conn = new SqlConnection("connectionstring...")) 
    { 
     using (SqlCommand cmd = new SqlCommand("Insert Into UserItems(UserId, Items) values (@UserId, @Items)")) 
     { 
      conn.Open(); 
      cmd.Parameters.AddWithValue("@UserId", userId); 
      foreach(string item in items) 
      { 
       cmd.Parameters.AddWithValue("@Item", Item; 
       cmd.ExecuteNonQuery(); 
      } 
     } 
    } 
} 
1

이것은 자주 묻는 질문이며 여러 가지 가능한 대답이 있습니다. 예를 들어 [다중 선택 매개 변수? This article by Joe Celko은이 옵션을 다루고 있으며 Erland Sommarskog의 주제에 대한 '고전'기사에 대한 링크를 제공합니다.