Tworzę prosty web serwis, który łączy się do bazy danych i wyrzuca dla osoby wchodzącej na link XML'a.
namespace web
{
/// <summary>
/// Opis podsumowujący dla WebService
/// </summary>
[WebService(Namespace = "test")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// Aby zezwalać na wywoływanie tej usługi sieci Web ze skryptu za pomocą kodu ASP.NET AJAX, usuń znaczniki komentarza z następującego wiersza.
// [System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService
{
public SqlConnection con;
public SqlDataAdapter adap;
public DataSet ds;
public string query;
public SqlCommand sqlcom;
public XmlReader reader;
[WebMethod]
public XmlReader GetProduct()
{
con = new SqlConnection(@"Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;pwd=;");
con.Open();
query = @"";
//adap = new SqlDataAdapter(query, con);
sqlcom = new SqlCommand(query, con);
ds = new DataSet();
reader = sqlcom.ExecuteXmlReader();
con.Close();
return reader;
// adap.Fill(ds);
// return ds;
}
}
}
I tak, jak wykorzysytwałem SqlAdapterQuery i zwracałem DataSet to wykonywało się, ale całą strukturę XML'a jaką mam stworzoną w zapytaniu rozwalało.
Dlatego zmieniłem na XMLReader, ale chyba coś robię nie tak. Ponieważ jak odpalam już web serwis i chcę pokazać XML'a to dostaję taki oto błąd::
System.InvalidOperationException: Wystąpił błąd podczas generowania dokumentu XML. ---> System.InvalidOperationException: Element System.Xml.XmlTextReaderImpl jest niedostępny z powodu swojego poziomu zabezpieczenia. Tylko typy publiczne mogą być przetwarzane.
w System.Xml.Serialization.TypeDesc.CheckSupported()
w System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
w System.Xml.Serialization.XmlSerializationWriter.CreateUnknownTypeException(Type type)
w Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write2_XmlReader(String n, String ns, XmlReader o, Boolean isNullable, Boolean needType)
w Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write3_XmlReader(Object o)
w Microsoft.Xml.Serialization.GeneratedAssembly.XmlReaderSerializer.Serialize(Object objectToSerialize, XmlSerializationWriter writer)
w System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
--- Koniec śladu stosu wyjątków wewnętrznych ---
w System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
w System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces)
w System.Web.Services.Protocols.XmlReturnWriter.Write(HttpResponse response, Stream outputStream, Object returnValue)
w System.Web.Services.Protocols.HttpServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream)
w System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)
w System.Web.Services.Protocols.WebServiceHandler.Invoke()
Dobrze mi się wydaje, że muszę jeszcze opisać w kodzie co jest Poziomem Root każdego z elementu z query? Mimo, że tam to jest opisane?
Przykład zapytania SQL poniżej
select
1 as Tag,
null as Parent,
null as [Katalog!1],
null as [Produkt!2!NumerKatalogowy!element],
null as [Produkt!2!Nazwa!Element],
null as [Produkt!2!NazwaDługa!Element],
null as [Produkt!2!Opis!CDATA],
null as [Produkt!2!VAT!Element],
null as [Produkt!2!EAN!Element],
null as [Produkt!2!StrukturaTowarowa!Element],
null as [Multimedia!3!Zdjęcie_Główne!element],
null as [Produkt!2!Producent!Element],
null as [Produkt!2!Marka!Element],
null as [Atrybut!4!Waga!Element],
null as [Atrybut!4!Pasuje_do_modelu!Element],
null as [Atrybut!4!Gwarancja!Element],
null as [Atrybut!4!Szerokość!Element],
null as [Atrybut!4!Wysokość!Element],
null as [Atrybut!4!Głębokość!Element]
// Kilka UNION ALL dla każdego poziomu pozyskującego dane
order by [Produkt!2!NumerKatalogowy!element], Parent
for xml explicit