A futura memoria...

Premessa: il problema nasce se utilizziamo un datareader per recuperare il risultato di una query SQL (o di una stored procedure) fatta con il suffisso FOR XML.

Io, mi immaginavo che con un semplice ExecuteScalar sul Command potessi recuperare il risultato sotto forma di stringa, ovvero un paio di righe come quelle qui sotto potessero bastare, e invece no!!! :-)

      SqlCommand cmd = new SqlCommand("sp_CreazioneXML", cn);
      cmd.CommandType = CommandType.StoredProcedure;

      string xml = cmd.ExecuteScalar().ToString();

La cosa bastarda è che tutto funziona bene, e l'XML viene estratto correttamente, ma "qualche volta" viene troncato.
Dopo un po' di ricerche tramite San Google, mi sono imbattuto in alcuni aricoli della KB Microsoft che spiegavano che SQL Server, divide i risultati di query FOR XML più lunghi di 2033 caratteri in più rows e quindi ritorna N righe di 2033 caratteri ognuna.

 

...La soluzione...
utilizzare un normale command.ExecuteReader e "while(reader.Read())" accodare tutto in uno StringBuilder, oppure qualcosa di molto simile (non so se più performante o meno... ma mi andava di usare cmd.ExecuteXmlReader :-) )

      SqlCommand cmd = new SqlCommand("sp_CreazioneXML", cn);
      cmd.CommandType = CommandType.StoredProcedure;
      cn.Open();

      XmlReader rdr = cmd.ExecuteXmlReader();

      rdr.Read();

      StringBuilder sb = new StringBuilder();

      while (rdr.ReadState != ReadState.EndOfFile)
        sb.Append(rdr.ReadOuterXml());

      rdr.Close();

      XmlDocument doc = new XmlDocument();
      doc.LoadXml(sb.ToString());

Rif:
http://support.microsoft.com/default.aspx?scid=kb;en-us;310378