Domanda

Devo restituire al client i contenuti di una colonna XML nel server SQL semplicemente facendo clic su un URL. L'xml ha istruzioni di elaborazione per aprire l'applicazione corretta (Infopath in questo caso).

Sono un po 'confuso riguardo a tutti i vari scrittori e flussi di xmlreader disponibili. Suppongo di voler inviare il contenuto di SQL ExecuteXmlReader a Response.OutputStream - ma non sono sicuro di come collegarli insieme.

Grazie è anticipo

È stato utile?

Soluzione 4

Ho funzionato semplicemente usando Response.Write con l'xml come testo, ma non sono ancora sicuro se dovrei davvero usare XmlReaders e stream. Ecco cosa ho fatto:

SqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select Name, InfopathDoc from document where id = @id";
cmd.Parameters.AddWithValue("@id", docId);

using (SqlDataReader dr = cmd.ExecuteReader())
{
    if (dr.Read())
    {
        Response.ContentType = "application/xml";
        Response.AppendHeader("Content-disposition", "attachment; filename=" + dr["Name"]);
        Response.Write(dr["InfopathDoc"]);
    }

Altri suggerimenti

Suggerirei di ottenere l'XML dal database come testo, quindi di creare una pagina in modo dinamico e impostare il tipo MIME nell'intestazione su " application / xml " ;. Questo dovrebbe dire al browser di DTRT (supponendo che sia configurato correttamente).

Se non si lavora con un'applicazione Web, è consigliabile prendere in considerazione l'utilizzo di RE per analizzare il testo e determinare l'applicazione da avviare, quindi alimentare l'XML (utilizzando un file temporaneo o tramite reindirizzamento di input di alcuni tipo).

Dal momento che non fornisci alcuna indicazione su quali tecnologie stai usando oltre XML e SQL Server, è difficile essere davvero specifici.

Perché non basta eseguire una query sul database usando SQL standard per i contenuti della colonna XML, e catturarlo in una pagina e trasmettere la stringa di nuovo all'utente?

Qualcosa del tipo:

string xmlContents = string.Empty;

using(SqlConnection _con = new SqlConnection("server=(local);database=Northwind;Integrated Security=SSPI;")
{
  string queryStatement = "SELECT XmlColumn FROM dbo.MyTable WHERE id = @ID";

  using(SqlCommand _cmd = new SqlCommand(queryStatement, _con)
  {
    _cmd.Parameters.AddWithValue("@ID", 5555);

    _con.Open();

    xmlContents = _cmd.ExecuteScalar().ToString(); // returns an object
    _con.Close();
  }
}

e quindi rispedire in streaming l'XML all'utente, ad es. usando Response.Write (xmlContents) - qualcosa di grosso modo lungo quelle linee (nessuna gestione degli errori inclusa - lascio a te gestire :-)).

Questo aiuta ??

Marc

SQL 2005 e oltre supportano l'istruzione FOR XML . Vedi qui

Ad esempio:

SELECT * FROM MyTable FOR XML RAW;

Esistono altre parole chiave per modificare i nomi dei tag XML in modo che siano diverse dalle colonne della base dati.

Quindi guarda la documentazione di ExecuteXmlReader per qualsiasi classe Command che usi in C #.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top