2013-07-11 2 views
-2
UPDATE Productions 
SET CountryCode = (CASE WHEN @SOffice='LA' OR @SOffice='GA' then 'USA' ELSE 'CAN' END) 

올바른 업데이트 사례인지 누구든지 확인할 수 있습니다. 나는 어떤 종류의 실수에 빠져있는 것 같다. 그것은 나에게 맞는 것 같습니다.사례를 사용하여 문을 업데이트하십시오.

나는 응용 프로그램 작업이 업데이트 한 Statment이 오전 :

SqlCommand cmd = new SqlCommand("UPDATE Productions SET CountryCode = (CASE WHEN @SOffice IN ('LA', 'GA') then 'USA' ELSE 'CAN' END), ProvinceCode = '" + user.GetProvinceCode() + "' WHERE ID = " + newProductionID, conn); 
cmd.ExecuteNonQuery(); 

을하지만 응용 프로그램을 구축하고 나는 다음과 같은 오류 얻을이 기능을 실행하면

Exception Message: Must declare the scalar variable "@SOffice". Exception Triggered by Method: OnError

를 이것이 무슨 뜻 이죠 ?? @SOffice은 당신이 당신이 필요로하는 경우, @을 제거 할 필요가 변수가없는 경우

+3

그렇게 BTW 대신'OR'를 사용하는 오류 무엇, 당신이 이런 식으로,'@SOffice IN ('LA', 'GA')를 쓸 수' –

+0

예 스마트는 생각하지 않았다 그!. 감사합니다 :) –

+0

그것은 유효한 진술, 그것은 잘 작동하고 - http://sqlfiddle.com/#!3/876d9/5 그래서 오류가 뭔가 다른 관련이 있습니다. –

답변

3

당신이 명령을 실행하기 위해 사용하는 SqlCommand 개체에 해당 매개 변수를 둘 필요는 @ 기호, SQL에서 변수를 의미 그것은

cmd.Parameters.Add(new SqlParameter("SOffice",DbType.Char,2){Value = "LA"}) 

을 실행하기 전에 명령에 SqlParameter에 추가하고 또한 매개 변수를 동적으로 SQL 문을 구축하여,의 Parameters 속성을 통해 매개 변수를 추가하기 위해 많은 안전하지로 다른 옵션을 포함해야 명령 ... using 문에 명령을 래핑해야하며 conn은 하나에 래핑되어야합니다. 오

using(var conn = new SqlConnection(ConfigurationMananger 
         .ConnectionStrings["conn"].ConnectionString) 
    using(cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = 
     @"UPDATE Productios 
      SET CountryCode = (CASE 
           WHEN @SOffice IN('LA','GA') 
          THEN 'USA' ELSE 'CAN' 
          END), 
       ProvinceCode = @ProvinceCode 
      WHERE ID = @newProductionID"; 
     cmd.Parameters.AddRange(new[]{ 
      new SqlParameter("SOffice",DbType.Char,2) 
       { 
        Value = "LA" 
       }, 
      new SqlParameter("ProvinceCode",DbType.Int) 
       { 
        Value = user.GetProvinceCode() 
       }, 
      new SqlParameter("newProductionID",DbType.Int) 
       { 
        Value = newProductionID 
       } 
     }); 
     if(!conn.State == ConnectionState.Open) 
      conn.Open(); 
     var resultCount = cmd.ExecuteNonQuery(); 


    } 
4
declare @Productions table(
    ind int not null identity(1,1)primary key clustered 
    ,CountryCode nchar(3) not null 
    ,SOFFICE NCHAR(2) NULL 
    ) 

insert into @Productions (CountryCode, SOFFICE) VALUES ('ITA','LA') 
insert into @Productions (CountryCode, SOFFICE) VALUES ('ITA','VE') 
insert into @Productions (CountryCode, SOFFICE) VALUES ('ITA','LZ') 
insert into @Productions (CountryCode, SOFFICE) VALUES ('FRA','GA') 
insert into @Productions (CountryCode, SOFFICE) VALUES ('FRA','BF') 
insert into @Productions (CountryCode, SOFFICE) VALUES ('ITA','VR') 
insert into @Productions (CountryCode, SOFFICE) VALUES ('GER','LA') 
insert into @Productions (CountryCode, SOFFICE) VALUES ('CAN','LA') 


SELECT * FROM @Productions  

UPDATE P 
    SET COUNTRYCODE = CASE P.SOFFICE WHEN 'LA' THEN 'USA' 
            WHEN 'GA' THEN 'USA' 
            ELSE 'CAN' 
        END -- CASE 
    FROM @PRODUCTIONS P 


SELECT * FROM @Productions 

복사하여 SQL 서버 2008 위의 코드를 붙여 넣습니다 당신은 그것을 잘 작동을 참조하십시오.

희망이

는 아래의 링크를 사용하여 선언되지 않은 쿼리 @SOffice의 VAR에서 마르셀로에게

+0

여기를 흘리면 안됩니다. 우리는 모두 꽤 잘 읽을 수 있습니다 (또는 아마 여기에 없을 것입니다). Shift 키는 이유가 있기 때문에 키보드에 있습니다. 텍스트를 사용하면 텍스트를 더 쉽게 읽고 이해할 수 있습니다. 그것을 사용하십시오. 감사. –

관련 문제