2012-06-14 56 views
0

我建立一個應用,在那裏我選擇一個國家一個城市和街道。選擇後,它發送的ID的WebService和我得到的所有可供選擇的地方了房間。但如果我想選擇多個城市或多個街道呢?我正在尋找一個沒有運氣的動態解決方案。如何越過web服務動態參數的sql查詢

這裏是我的iOS 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"]); 



    } 


} 

你可以看到,我有我發送到Web服務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查詢並將房間發送回iPhone:

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; 
    } 

我的問題再次是w如果我選擇多個城市或街道,請選擇帽子?該ID應該是動態發送和SQL查詢。 在此先感謝您的幫助:)

回答

2

我不會讀所有的代碼,因爲該解決方案是簡單的。而不是爲每個查詢參數嚴格採用單個字符串,而是接受逗號分隔的列表。當請求進入時,將它們分解成數組並查詢數據庫中所有參數的組合。

使客戶端代碼靈活以及因此可以接受的東西,而不僅僅是一個清單。

也許限制的數據庫查詢總量所以有人不每五項這將需要125個查詢,將太多的數據返回到手機一下子送你三個列表。

+0

好主意,謝謝你,我會嘗試一下 –