2012-06-14 5 views
0

나는 한 국가에서 도시와 거리를 선택하는 응용 프로그램을 빌드합니다. 선택 후 ID를 웹 서비스로 보내고 선택된 장소에서 사용할 수있는 모든 공간을 얻습니다. 하지만 하나 이상의 도시 또는 하나 이상의 거리를 선택하려면 어떻게해야합니까? 나는 운이없는 역동적 인 솔루션을 찾고 있습니다. 여기 webservice를 통해 동적 매개 변수를 SQL 쿼리에 전달하는 방법

는 아이폰 OS에 내 roomdownloader입니다 :

-(void)raumDownloader 
{ 
    NSMutableArray *object=[[NSMutableArray alloc]init]; 

    NSLog(@"RaumklasseID: %@ StadtID: %@  GebäudeID: %@  RegionID: %@",raumklasseid, stadtid, gebaudeid, regionid);  

    NSString *emptyString = @""; 
    [object addObject:raumklasseid]; 

    if (stadtid==nil) 
    { 
     [object addObject:emptyString]; 
    } 
    else { 
     [object addObject:stadtid]; 
    } 


    if (gebaudeid==nil) 
    { 
     [object addObject:emptyString]; 
    }else { 
     [object addObject:gebaudeid]; 
    } 

    if (regionid==nil) 
    { 
     [object addObject:emptyString]; 
    }else { 
     [object addObject:regionid]; 

    } 


    NSMutableArray *key =[[NSMutableArray alloc]init]; 
    [key addObject:@"RAUMKLASSE_ID"]; 
    [key addObject:@"STADT_ID"]; 
    [key addObject:@"GEBAEUDE_ID"]; 
    [key addObject:@"REGION_ID"]; 

    NSDictionary* info = [[NSDictionary alloc]initWithObjects:object forKeys:key]; 
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:info 
                 options:NSJSONWritingPrettyPrinted error:nil]; 

    NSString *name = [[NSString alloc] initWithData:jsonData           
              encoding:NSUTF8StringEncoding]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://nexxtsolutions-entwicklung.de/Webdienst22/service1.asmx/Raum"]]; 

    [request setHTTPMethod: @"POST"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

    NSData *reqData = [NSData dataWithBytes:[name UTF8String] length:[name length]]; 
    [request setHTTPBody:reqData]; 

    NSURLResponse *response =[[NSURLResponse alloc]init]; 
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; 

    NSMutableDictionary *dict = [[NSMutableDictionary alloc]init ]; 
    dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 

    raumeArray = [dict objectForKey:@"d"]; 
    for(int n=0; n<[raumeArray count]; n++) 
    { 


     NSLog(@"AUSGABE: %@",[[raumeArray objectAtIndex:n] objectForKey:@"RaumName"]); 



    } 


} 
당신은 내가이 웹 서비스에 보내 4 정적 매개 변수가 있음을 알 수

:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    [WebMethod] 
    public List<RaumHelper.RAUM> Raum(string RAUMKLASSE_ID, string STADT_ID, string GEBAEUDE_ID, string REGION_ID) 
    { 
     return RaumHelper.Raum(RAUMKLASSE_ID, STADT_ID, GEBAEUDE_ID, REGION_ID); 
    } 

및 헬퍼 클래스가 사용하는 정적 매개 변수를 SQL 쿼리 및 다시 방을 아이폰에 보내십시오 :

internal static List<RAUM> Raum(string RAUMKLASSE_ID, string STADT_ID, string GEBAEUDE_ID, string REGION_ID) 
    { 
     List<RAUM> strasseObject = new List<RAUM>(); 


     using (SqlConnection con = new SqlConnection(@"Data Source=Localhost\SQLEXPRESS;Initial Catalog=BOOK-IT-V2;Integrated Security=true;")) 
     using (SqlCommand cmd = new SqlCommand(@"SELECT r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID, ra.BEZEICHNUNG AS raumBEZEICHNUNG FROM RAUM r, RAUMATTRIBUTE ra WHERE RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) AND STADT_ID = ISNULL(@Stadt_ID, STADT_ID) AND GEBAEUDE_ID = ISNULL(@Gebaeude_ID, GEBAEUDE_ID) AND REGION_ID = ISNULL(@Region_ID, REGION_ID) INNER JOIN RAZUORDNUNG ON RAZUORDNUNG.RAUM_ID = RAUM.ID 
INNER JOIN RAUMATTRIBUTE ON RAZUORDNUNG.RAUMATTRIBUTE_ID = RAUMATTRIBUTE.", con)) 
     { 
      con.Open(); 
      if (!StringExtensions.IsNullOrWhiteSpace(RAUMKLASSE_ID)) 
       cmd.Parameters.AddWithValue("@Raumklasse_ID", RAUMKLASSE_ID); 
      else 
       cmd.Parameters.AddWithValue("@Raumklasse_ID", DBNull.Value); 

      if (!StringExtensions.IsNullOrWhiteSpace(STADT_ID)) 
       cmd.Parameters.AddWithValue("@Stadt_ID", STADT_ID); 
      else 
       cmd.Parameters.AddWithValue("@Stadt_ID", DBNull.Value); 

      if (!StringExtensions.IsNullOrWhiteSpace(GEBAEUDE_ID)) 
       cmd.Parameters.AddWithValue("@Gebaeude_ID", GEBAEUDE_ID); 
      else 
       cmd.Parameters.AddWithValue("@Gebaeude_ID", DBNull.Value); 

      if (!StringExtensions.IsNullOrWhiteSpace(REGION_ID)) 
       cmd.Parameters.AddWithValue("@Region_ID", REGION_ID); 
      else 
       cmd.Parameters.AddWithValue("@Region_ID", DBNull.Value); 



      using (SqlDataReader rdr = cmd.ExecuteReader()) 
      { 



       while (rdr.Read()) 
       { 



        if (rdr["BEZEICHNUNG"] != DBNull.Value && rdr["ID"] != DBNull.Value) 
        { 

         strasseObject.Add(new RAUM() 
         { 
          RaumName = rdr["BEZEICHNUNG"].ToString(), 
          RaumID = rdr["ID"].ToString() 

         }); 
        } 

       } 
      } 
     } 
     return strasseObject; 
    } 

내 질문 다시입니다 모자를 하나 이상의 도시 또는 거리를 선택한다면? ID는 동적으로 SQL 쿼리를 보내야합니다. 도움을 주셔서 미리 감사드립니다.

답변

2

해결책이 간단하기 때문에이 코드를 모두 읽지는 않을 것입니다. 각 쿼리 매개 변수에 대해 단일 문자열을 엄격하게 사용하는 대신 쉼표로 구분 된 목록을 사용합니다. 요청이 들어 오면이를 배열로 분해하고 데이터베이스에 모든 매개 변수 조합을 조회합니다.

클라이언트 쪽 코드를 유연하게 만들어서 단지 하나가 아닌 목록을 받아 들일 수 있습니다.

아마도 db 쿼리의 총량을 제한하여 누군가가 125 개의 쿼리를 요구하는 5 개의 항목이있는 세 개의 목록을 보내지 않고 한꺼번에 너무 많은 데이터를 휴대 전화에 반환 할 수 있습니다.

+0

좋은 아이디어 감사합니다. 시도해 보겠습니다. –

관련 문제