Error processing response stream. The XML element contains mixed content.
Ok, in my last post I explained how to pass an array of values to the Webget method of an Ado DataService as a primitive value (csv), in this post Im going to show how to retrieve a primitive value from a Webget method avoiding the error message above.
Lets start with the Dataservice:
[WebGet] //we are going to return an int
public IQueryable<int> DWTNewDownTime(int metricArrayID, string metricDate)
{ //create the command as we used to do in 1.1
DbCommand cmd = this.CurrentDataSource.Connection.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
//add the parameters needed for the stored procedure
EntityParameter MetricArrayID = new EntityParameter("MetricArrayID", DbType.Int16);
MetricArrayID.Value = metricArrayID;
cmd.Parameters.Add(MetricArrayID);
EntityParameter MetricDate = new EntityParameter("MetricDate", DbType.String, 50);
MetricDate.Value = metricDate;
cmd.Parameters.Add(MetricDate);
//add an output parameter, this parameter should be returned as a SELECT not return from the stored procedure
EntityParameter Res = new EntityParameter("res", DbType.Int16, 20);
Res.Direction = ParameterDirection.Output;
cmd.Parameters.Add(Res);
//constructs the command text
cmd.CommandText = string.Format(@"{0}.{1}", this.CurrentDataSource.DefaultContainerName, "DWTGetMetricValuesNewDownTimeActions");
try
{//open connection and execute an scalar
cmd.Connection.Open();
cmd.ExecuteScalar();
}
catch (System.Exception ex)
{
throw new System.Exception(ex.InnerException.Message);
}
finally
{ //always close the connection
cmd.Connection.Close();
}//return the result output value.
List<int> _list = new List<int> { Convert.ToInt32(Res.Value) };
return _list.AsQueryable();
}
As I mention above the stored procedure should return the output parameter as SELECT.
now lets see the ModelView:
public void DWTGetMetricValuesNewDownTimeActions(int metricArrayID, string metricDate)
{ //create a DataserviceQuery as we normally do for other webget methods
QryInsertMetric = this.context.CreateQuery<int>("DWTNewDownTime")
.AddQueryOption("MetricArrayID", metricArrayID)
.AddQueryOption("MetricDate", "’" + metricDate + "’");
//then create a webclient that will be used to execute the above query
WebClient wc = new WebClient();
wc.DownloadStringAsync(QryInsertMetric.RequestUri);
wc.DownloadStringCompleted += (s, e) =>
{ //we have to parse the returning XML
XDocument xdoc = XDocument.Parse(e.Result);
MetricValueID = Convert.ToInt32(xdoc.Root.Descendants(((XNamespace)@"http://schemas.microsoft.com/ado/2007/08/dataservices") + "element")
.Select(xe => xe.Value).ToList().Single());
//fire the property so you can catch it at your silverlight client
FirePropertyChanged("MetricValueID");
};
}
Finally just catch the property change at your client:
void Downtimemodel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "MetricValueID")
{
Console.WriteLine(Downtimemodel.MetricValueID.ToString());
}
}
and that’s it, I hope this help someone get home early.
some help from Invoking a WebGet throws an exception @ msdn