65.9K
CodeProject 正在变化。 阅读更多。
Home

将动态参数列表传递给 Web 服务

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (9投票s)

2010 年 5 月 7 日

CPOL

1分钟阅读

viewsIcon

35881

使与 Web 服务的交互更简单、更易于维护

我正在开发一个 Silverlight 3 项目,需要通过 Web 服务连接到数据库。此 Web 服务的一个方面是,它有一个通用的方法,该方法接受要执行的存储过程的名称,以及一个或多个各种类型的参数。在弄清楚我的不太优雅的解决方案的过程中,我学到了一些东西:0) Silverlight 不支持 Serialize 属性。 1) Web 服务方法不能接受泛型对象列表(显然也不能接受 object 对象数组)。 经过几天的尝试,我得出了以下解决方案。简而言之,我在客户端创建了一个 xml 字符串,并在 Web 服务中对其进行解析。为了转换为 xml 字符串,我做了以下操作
//--------------------------------------------------------------------------------
public static XElement MakeXmlParameter(string name, object value)
{
    XElement element = new XElement("Parameter",
                                     new XElement("Name", name),
                                     new XElement("Type", value.GetType()),
                                     new XElement("Value", value));
    return element;
}
在服务中,我拥有此方法
public class Parameters :List<SqlParameter>
{
}


//-------------------------------------------------------------------------------------
private Parameters MakeSqlParameters(string xmlData)
{
    Parameters parameters = null;
    if (string.IsNullOrEmpty(xmlData))
    {
	XDocument  xDoc       = XDocument.Parse(xmlData);
	XElement   root       = xDoc.Element("Parameters");
	if (root.HasElements)
	{
            parameters = new Parameters();
	    IEnumerable children = (from item in root.Elements() select item);
	    foreach (XElement value in children)
	    {
		string paramName       = value.Element("Name").Value;
		string typeName        = value.Element("Type").Value;
		object obj             = Convert.ChangeType(value.Element("Value").Value, 
                                                            Type.GetType(typeName));
		SqlParameter parameter = new SqlParameter(paramName, obj);
		parameters.Add(parameter);
            }
        }
    }
    return parameters;
}
考虑到项目架构,可能还有更好的方法,但我需要快速地让一些东西正常工作。 额外好处 - 请注意对 Convert.ChangeType 方法的调用,我在 Google 上搜索了几个小时才发现你可以这样转换为命名类型。看看我为你节省了多少 Google 搜索时间! :) 编辑=========================== 你可以通过简单地在循环遍历所有子元素之前检索第一个元素来使 MakeSqlParameters() 方法更通用。 这样,无论他们如何命名根节点,都无关紧要。
© . All rights reserved.