【问题标题】:how to pass dynamic parameters over webservice to sql query如何通过webservice将动态参数传递给sql查询
【发布时间】:2012-06-14 07:00:23
【问题描述】:

我构建了一个应用程序,我可以在其中选择一个国家、一个城市和一条街道。选择后,它会将 id 发送到 web 服务,我得到所有可用于所选地点的房间。但是如果我想选择多个城市或多个街道怎么办?我正在寻找一个没有运气的动态解决方案。

这是我在 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"]);



    }


}

你可以看到我有 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;
    }

我的问题是如果我选择多个城市或街道怎么办? id 应该是动态发送的,sql 查询也是如此。 提前感谢您的帮助:)

【问题讨论】:

    标签: c# asp.net ios web-services sql-server-2008


    【解决方案1】:

    我不会阅读所有代码,因为解决方案很简单。您接受一个逗号分隔的列表,而不是为每个查询参数严格采用单个字符串。当请求进来时,您将它们分解为数组并查询数据库以获取所有参数组合。

    使客户端代码也变得灵活,这样它就可以接受一系列事物,而不仅仅是一个。

    也许限制了数据库查询的总量,所以有人不会向您发送三个包含五个项目的列表,每个列表需要 125 次查询,并且数据太多而无法一次全部返回到手机。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 2013-08-02
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多