2016-07-15 2 views
0

mvc를 사용하여 웹 사이트를 구축하고 일련의 매개 변수가 포함 된 저장 프로 시저를 사용하여 일부 데이터를 저장하려고합니다. 이러한 매개 변수 중 일부를 선택적으로 설정할 수 있는지 궁금합니다. 그 이유는 계정으로 되돌아 오는 데이터가 달라지기 때문입니다. 사용자가 계정 유형 1을 편집하면 모든 매개 변수를 다시 전송해야합니다. 계정 유형 2를 편집하면 3 개의 매개 변수 만 다시 전송됩니다.저장 프로 시저의 선택적 매개 변수

SQL 매개 변수 : 프로 시저를 호출 컨트롤러

alter PROCEDURE web.Maint_UpdateClinic 
     @AccountID INT 
     ,@IsActive BIT = 1 
     ,@AccountName VARCHAR(100) = NULL 
     ,@AccountAddress VARCHAR(100) = NULL 
     ,@City VARCHAR(100) = NULL 
     ,@State VARCHAR(2) = NULL 
     ,@ZipCode VARCHAR(10) = NULL 
     ,@PhoneNumber VARCHAR(20) = NULL 
     ,@WebID INT 

조치 : 매개 변수가 저장 프로 시저 선택하는 경우

using (OdbcConnection _conn = new OdbcConnection("FILEDSN=c:\\datasources\\RxCard.dsn")) 
      using (OdbcCommand cmd1 = new OdbcCommand()) 
      { 
       cmd1.Connection = _conn; 
       cmd1.CommandText = "{call web.Maint_UpdateClinic(?,?,?,?,?,?,?,?,?)}"; 
       cmd1.Parameters.AddWithValue("@AccountID", AccountID); 
       cmd1.Parameters.AddWithValue("@IsActive", true); 
       cmd1.Parameters.AddWithValue("@AccountName", AccountName); 
       cmd1.Parameters.AddWithValue("@Address", Address); 
       cmd1.Parameters.AddWithValue("@City", City); 
       cmd1.Parameters.AddWithValue("@State", State); 
       cmd1.Parameters.AddWithValue("@ZipCode", ZipCode); 
       cmd1.Parameters.AddWithValue("@PhoneNumber", PhoneNumber); 
       cmd1.Parameters.AddWithValue("@WebID", CookieStore.GetCookie("WebId"));    
       cmd1.CommandType = CommandType.StoredProcedure; 
       _conn.Open(); 
       cmd1.ExecuteNonQuery(); 
       _conn.Close(); 
      } 
+3

'CommandType'이'StoredProcedure' 인 경우'CommandText'는 단지 SP의 이름이어야합니다. 그런 다음 원하는만큼 매개 변수를 추가 할 수 있습니다 (그러나 이름은 SP 이름과 일치해야 함). http://stackoverflow.com/a/7542564/123422 –

+0

왜 Sql 클라이언트 클래스 대신 Odbc 클라이언트를 사용합니까? – Steve

+0

모든 매개 변수를 필수 매개 변수로 전달하고 선택적 매개 변수를 null로 전달하는 것이 좋습니다. SP에서 어떤 매개 변수가 null이 아니며 테이블을 기반으로 업데이트하는지 확인하십시오. –

답변

1

다음에 추가할지 여부를 선택할 수 있습니다. 예를 들어,

cmd1.Parameters.AddWithValue("@AccountName", AccountName); 

다음 저장 프로 시저가 @AccountName의 기본값을 사용합니다이 선 (위)를 제거합니다.

즉, 각 매개 변수를 전달할지 여부를 결정하는 방법이 필요합니다. 그렇게하는 것은 응용 프로그램의 동작에 따라 달라지기 때문에 대답하기가 더 어렵습니다.

당신은, 예를 들어,이 작업을 수행 할 수 있습니다 :

if(AccountName != null) 
    cmd1.Parameters.AddWithValue("@AccountName", AccountName); 

을 즉, 값이 다음 절차를 전송하지 않습니다 AccountName 제공되지 않은 경우. 이 방법을 사용하면 AccountName ~ null을 설정할 필요가없는 한 작동합니다.

계정 유형이 무엇인지 나타내는 매개 변수를 메소드에 전달하고이를 사용하여 추가 할 매개 변수와 제외 할 매개 변수를 결정할 수 있습니다.

난 당신이 그것을 할 수

public class ClinicUpdate 
{ 
    public string AccountId {get;set;} 
    public string Address {get;set;} 
    //etc 
} 

처럼, 각각의 값 (Account, Address 등) 당신이 클래스에 넣어 경우 작업하기 쉬울 수 있습니다에 대해 별도의 변수를 가질 것으로 나타났습니다

코드를 재정렬하기로 결정하면 훨씬 쉽습니다. 예를 들어 한 가지 계정 유형에 대한 매개 변수를 추가하는 메소드와 다른 유형에 대한 매개 변수를 추가하는 메소드 등 두 가지 메소드를 작성할 수 있습니다. 커다란 매개 변수 목록 대신 단일 객체를 전달하는 것이 훨씬 쉽습니다.
어쨌든 우수 사례입니다. 의견은 다양하지만 메소드 호출 당 최대 4 개의 매개 변수를 사용하는 것이 좋습니다. 비슷한 방법으로 매개 변수 목록을 전달하는 경우 많은 클래스가 필요합니다.

관련 문제