Russell Verdun wrote:
Yes, I did get your answer, but not sure where to start, I'm not
versed in XML, but it looks straight forward, where would XML code go?
Ahh, well we can help you out there. Unfortunately the answer to your question is a lot longer than could possibly be explained and understood in a newsgroup posting. I highly suggest reading up on XML, XML Schema and WSDL. However, I'll explain how I would do it from a pure .NET perspective and hopefully you can run with it from there.
I would suggest something like the following...
An schema like:
<xs:schema id="SimpleComma ndExample" targetNamespace ="uri:marsh-samples-SimpleCommand" elementFormDefa ult="qualified"
xmlns="uri:mars h-samples-SimpleCommand" xmlns:xs="http://www.w3.org/2001/XMLSchema"
attributeFormDe fault="unqualif ied">
<xs:complexTy pe name="SimpleCom mand">
<xs:sequence>
<xs:element name="parameter s" minOccurs="0" maxOccurs="1">
<xs:complexType >
<xs:sequence>
<xs:sequence>
<xs:element name="parameter " type="SimpleCom mandParameter" minOccurs="0" maxOccurs="unbo unded" />
</xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="text" type="xs:string " />
</xs:complexType>
<xs:complexTy pe name="SimpleCom mandParameter">
<xs:attribute name="name" type="xs:string " />
<xs:attribute name="value" type="xs:string " />
<xs:attribute name="type" type="xs:QName" />
</xs:complexType>
<xs:element name="command" type="SimpleCom mand"></xs:element>
</xs:schema>
Which would result in instance documents like:
<command xmlns="uri:mars h-samples-SimpleCommand" xmlns:xsd="http ://www.w3.org/2001/XMLSchema" text="SELECT * FROM MyTable WHERE myField = @myParameter">
<parameters>
<parameter name="@myParame ter" type="xsd:int" value="1" />
</parameters>
</command>
And a web method that handles such commands like:
<codeSnippet language="C#">
[WebMethod]
[SoapDocumentMet hod(ParameterSt yle=SoapParamet erStyle.Bare, Use=SoapBinding Use.Literal)]
[return:XmlEleme nt("results", Namespace="uri: marsh-samples-MyServiceTypes" )]
public XmlDataDocument ExecuteCommand([XmlElement("com mand", Namespace="uri: marsh-samples-SimpleCommand")] XmlElement commandElement)
{
// TODO: run a validating reader over the element if you're concerned someone might pass you invalid instances
SqlCommand command = new SqlCommand(comm andElement.GetA ttribute("text" ));
// NOTE: assumes schema is in default namespace which it probably wouldn't be, so make sure to use overload where
// XmlNamespaceMan ager is passed and use namespace prefix on XPath elements
XmlNodeList parameterElemen ts = commandElement. SelectNodes("pa rameters/parameter");
if(parameterEle ments.Count > 0)
{
SqlParameterCol lection commandParamete rs = command.Paramet ers;
foreach(XmlElem ent parameterElemen t in parameterElemen ts)
{
string xsdNamespacePre fix = commandElement. OwnerDocument.G etPrefixOfNames pace("http://www.w3.org/2001/XMLSchema");
SqlParameter parameter = new SqlParameter();
parameter.Param eterName = parameterElemen t.GetAttribute( "name");
string parameterElemen tValue = parameterElemen t.GetAttribute( "value");
string parameterXsdTyp e = parameterElemen t.GetAttribute( "type");
string[] qNameParts = parameterXsdTyp e.Split(':');
if(qNameParts[0] != xsdNamespacePre fix)
{
throw new NotSupportedExc eption("Expecti ng parameter types only from the Xml Schema Definition namespace.");
}
object parameterValue;
switch(qNamePar ts[1])
{
case "int":
case "nonNegativeInt eger":
parameterValue = XmlConvert.ToIn t32(parameterEl ementValue);
break;
case "string":
parameterValue = parameterElemen tValue;
break;
// TODO: handle all the XSD types you want support
default:
throw new NotSupportedExc eption(string.F ormat("Unsuppor ted XSD type specified: {0}.", parameterXsdTyp e));
}
parameter.Value = parameterValue;
}
}
// TODO: execute the command and get back a real, filled dataset
DataSet resultDataSet = new DataSet();
XmlDataDocument result = new XmlDataDocument (resultDataSet) ;
return result;
}
</codeSnippet>
HTH,
Drew