Fórum Duvidas na Utilização de Geração de Arquivos XML #2180

23/01/2009

0

Caros Colegas   Estou solicitando uma consultoria na questão de geração de arquivos XML. Implementei o código abaixo, mas na hora de executar o VS2005 informa que o dt (dataSet) não esta serializado.   Não entendi o que significa.   Aguardo retorno!   *********** CODIGO ****** using System; using System.Data; using System.Data.SqlClient; using System.IO; using System.Xml; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using MyNameSpace.Data; public partial class Default2 : System.Web.UI.Page { DataTable dt = new DataTable("Arquivo"); protected void Page_Load(object sender, EventArgs e) { string NomeArquivo = "C:\\Teste.XML"; string sSQL = "SELECT top 10 FC_ID_PROFISSIONAL AS CODIGO, CLIENTE_NOME_PROFISSIONAL AS PROFISSIONAL, CLIENTE_PRIMEIRO_NOME AS NOME, CLIENTE_NOMES_MEIO AS MEIO, "+ "CLIENTE_SOBRENOME AS SOBRENOME "+ "FROM FC_NOVARTIS001 "; DataAccess da = new DataAccess(); da.OpenConection(); dt = da.ExecuteReader(sSQL); dt.WriteXml(NomeArquivo); gvAcao.DataSource = dt; gvAcao.DataBind(); da.CloseConection();   } protected void Button1_Click(object sender, EventArgs e) { /*dt = new DataTable(); dt.Columns.Add("Codigo"); dt.Columns.Add("PROFISSIONAL"); dt.Columns.Add("NOME"); dt.Columns.Add("MEIO"); dt.Columns.Add("SOBRENOME"); */ // StreamReader arquivoOpen = new StreamReader(); /* while (!arquivoOpen.EndOfStream) { dt.Rows.Add(arquivoOpen.ReadLine.Split(Convert.ToChar(";"))); } arquivoOpen.Close(); */ dt.WriteXml("C:\Teste_FC.xml"); } }
Sergio Santos

Sergio Santos

Responder

Posts

23/01/2009

Fabio Mans

Olá Sérgio segue abaixo um exemplo, eu utilizei um DataSet para simular sua tabela.     using System; using System.Data; public partial class DevMedia : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } private static DataSet GetDataSet() { using (DataSet ds = new DataSet()) { DataTable dt = new DataTable("Table"); dt.Columns.Add("CODIGO", Type.GetType("System.String")); dt.Columns.Add("PROFISSIONAL", Type.GetType("System.String")); dt.Columns.Add("NOME", Type.GetType("System.String")); DataRow dr = dt.NewRow(); dr["CODIGO"] = "10"; dr["PROFISSIONAL"] = "PROGRAMADOR"; dr["NOME"] = "JOS HENRIQUE"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["CODIGO"] = "11"; dr["PROFISSIONAL"] = "TECNICO"; dr["NOME"] = "CARLOS FERREIRA"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["CODIGO"] = "12"; dr["PROFISSIONAL"] = "TECNICO"; dr["NOME"] = "FELIPE"; dt.Rows.Add(dr); ds.Tables.Add(dt); return ds; } }   protected void Button1_Click(object sender, EventArgs e) { const string NomeArquivo = "C:\\Teste.XML"; using (DataSet ds = GetDataSet()) { ds.WriteXml(NomeArquivo, XmlWriteMode.IgnoreSchema); } } }             Resultado    
Responder

Gostei + 0

23/01/2009

Sergio Santos

Fábio   Vou implementar o código q vc mandou, mas surgiu umas duvidas.   1o) me explique melhor o funcionamento desta linh a-> using (DataSet ds = new DataSet()).  PQ este using? Pq não definir simplementes o DataSet?   2o) Sobre a questão da Serialização, pd me explicar melhor?     []s Sérgio  
Responder

Gostei + 0

23/01/2009

Fabio Mans

1 - O using atende a liberação de recursos. O objeto que será instânciado no comando "using", é liberado automaticamente, ou seja, é chamado o "Dispose" deste objeto de forma totalmente automática.   O using é um tipo de atalho da liguagem. O compilador traduz o  using para um comando muito semelhante a instrução nativa  try/finaly.     Na prática como funciona? Vejamos um exemplo simples:   ====================================================== SqlConnection cn = new SqlConnection (ConnectionString);
SqlCommand cm = new SqlCommand(commandString, cn); SqlCommand cm = novo SqlCommand (commandString, cn);
cn.Open(); cn.Open ();
cm.ExecuteNonQuery();
cn.Close(); cn.Close (); ======================================================   SEMPRE UTILIZE ESTA OPÇÃO   using (SqlConnection cn = new SqlConnection(connectionString))
{
    using (SqlCommand cm = new SqlCommand(commandString, cn))
    {
        cn.Open();
        cm.ExecuteNonQuery();
    }
}   PERCEBA QUE NÃO PRECISEI ME PREOCUPAR EM FECHAR A CONEXÃO.   ======================================================   SqlConnection cn =  null;
SqlCommand cm = null; try
{
    cn = new SqlConnection(connectionString);
    cm = new SqlCommand(commandString, cn);
    cn.Open();
    cm.ExecuteNonQuery();
}
finally
{
    if (null != cm);
        cm.Dispose();
    if (null != cn)
        cn.Dispose();
} ============================================================     2 - Serialização (serialization) é o processo onde você converte um objeto em um stream de bytes para persistí-lo na memória, em um banco de dados ou em arquivo. A idéia é salvar o estado do objeto para que a aplicação seja capaz de restaurar o estado atual do objeto quando necessário. O processo inverso é chamado de deserialização (deserialization).
Responder

Gostei + 0

23/01/2009

Sergio Santos

  Mais uma duvida...   Qdo eu uso o comando "... using (DataSet ds = new Dataset()) "
 tudo o que escrevo entre as chaves é referente ao DataSet (no caso), em questão ?   using (DataSet ds = new Dataset()) {    // Tudo relacionado ao DataSet ds }     Outra duvida, ao invés de montar os dados através do DataRow dr, vc teria algum outro exemplo usando apenas o dataSet com os dados vindo de uma Select? // DataReader   Abs Sérgio  
Responder

Gostei + 0

23/01/2009

Sergio Santos

Segue o meu novo código... Mas estou tendo algumas duvidas, em relação a popular a 2a. dataTable, com os dados que vieram da Select.   ****  SEGUE CODIGO ***   public partial class Default2 : System.Web.UI.Page { DataTable dt = new DataTable("Tabela"); string sSQL = "SELECT top 10 FC_ID_PROFISSIONAL AS CODIGO, CLIENTE_NOME_PROFISSIONAL AS PROFISSIONAL, CLIENTE_PRIMEIRO_NOME AS NOME, CLIENTE_NOMES_MEIO AS MEIO, "+ "CLIENTE_SOBRENOME AS SOBRENOME "+ "FROM FC_NOVARTIS001 "; protected void Page_Load(object sender, EventArgs e) { MostraDados(); } private void MostraDados() { da.OpenConection(); dt = da.ExecuteReader(sSQL); gvAcao.DataSource = dt; gvAcao.DataBind(); da.CloseConection(); } private static DataSet GetDataSet() { DataAccess da = new DataAccess(); using (DataSet ds = new DataSet()) { DataTable dt = new DataTable("Table"); dt.Columns.Add("CODIGO", Type.GetType("System.String")); dt.Columns.Add("PROFISSIONAL", Type.GetType("System.String")); dt.Columns.Add("NOME", Type.GetType("System.String")); // Como pegar os dados aqui da que virão da SQL ? } } protected void Button1_Click(object sender, EventArgs e) { const string NomeArquivo = "C:\\Teste.XML"; using (DataSet ds = GetDataSet()) { dt.WriteXml(NomeArquivo); } } }
Responder

Gostei + 0

23/01/2009

Fabio Mans

Não entendi sua dúvida, você pode postar uma por vez?    
Responder

Gostei + 0

23/01/2009

Sergio Santos

Fabio   A aplicação que estou montando irá gerar o arquivo XML, a partir de uma consulta(ExecuteReader), o qual irá gerar os dados para um GRIDVIEW.  Após gerar estes dados na gridView, o usuário irá decidir ou não se via gerar o arquivo XML.   Acontece que eu já consegui fazer com que o sistema "crie no disco o arquivo XML", mas não conigo fazer com que ele leve os dados da GRID, que vieram do DataTable. ou seja, uma vez populado o DataTable, estes memsos dados deverão ir para a GRIDVIEW e para o Arquivo XML.   ***  SEGUE A MINHA ULTIMA VERSÂO DOS FONTES ****   public partial class Default2 : System.Web.UI.Page { // DataTable dt = new DataTable("Tabela"); DataAccess da = new DataAccess(); DataTable dt = new DataTable(); string sSQL = "SELECT top 10 FC_ID_PROFISSIONAL AS CODIGO, CLIENTE_NOME_PROFISSIONAL AS PROFISSIONAL, CLIENTE_PRIMEIRO_NOME AS NOME, CLIENTE_NOMES_MEIO AS MEIO, "+ "CLIENTE_SOBRENOME AS SOBRENOME "+ "FROM FC_NOVARTIS001 "; protected void Page_Load(object sender, EventArgs e) { MostraDados(); } private void MostraDados() { da.OpenConection(); dt = da.ExecuteReader(sSQL); gvAcao.DataSource = dt; gvAcao.DataBind(); da.CloseConection(); } private static DataSet GetDataSet() { using (DataSet ds = new DataSet()) { DataTable dt = new DataTable("Table"); dt.Columns.Add("CODIGO", Type.GetType("System.String")); dt.Columns.Add("PROFISSIONAL", Type.GetType("System.String")); dt.Columns.Add("NOME", Type.GetType("System.String")); // Como pegar os dados aqui da que virão da SQL ? return ds; } } protected void Button1_Click(object sender, EventArgs e) { const string NomeArquivo = "C:\\Teste.XML"; using (DataSet ds = GetDataSet()) { ds.WriteXml(NomeArquivo, XmlWriteMode.IgnoreSchema); } } }
Responder

Gostei + 0

26/01/2009

Fabio Mans

Sérgio basta você criar um método que retorno um DataSet (não pode ser DataTable e nem DataReader), com este método você pode fazer um Bind no Grid e gerar o arquivo XML.   Espero ter ajudado   ============================================= A aplicação que estou montando irá gerar o arquivo XML, a partir de uma consulta(ExecuteReader), o qual irá gerar os dados para um GRIDVIEW.  Após gerar estes dados na gridView, o usuário irá decidir ou não se via gerar o arquivo XML.
 
Acontece que eu já consegui fazer com que o sistema "crie no disco o arquivo XML", mas não conigo fazer com que ele leve os dados da GRID, que vieram do DataTable.
ou seja, uma vez populado o DataTable, estes memsos dados deverão ir para a GRIDVIEW e para o Arquivo XML.
 
Responder

Gostei + 0

26/01/2009

Fabio Mans

Sérgio basta você criar um método que retorno um DataSet (não pode ser DataTable e nem DataReader), com este método você pode fazer um Bind no Grid e gerar o arquivo XML.   Espero ter ajudado   ============================================= A aplicação que estou montando irá gerar o arquivo XML, a partir de uma consulta(ExecuteReader), o qual irá gerar os dados para um GRIDVIEW.  Após gerar estes dados na gridView, o usuário irá decidir ou não se via gerar o arquivo XML.
 
Acontece que eu já consegui fazer com que o sistema "crie no disco o arquivo XML", mas não conigo fazer com que ele leve os dados da GRID, que vieram do DataTable.
ou seja, uma vez populado o DataTable, estes memsos dados deverão ir para a GRIDVIEW e para o Arquivo XML.
 
Responder

Gostei + 0

26/01/2009

Sergio Santos

Fabio,   Bom Dia   Continuo com dúvida. Não estou conseguindo saber o lugar certo de fazer isto.   []s Sérgio
Responder

Gostei + 0

26/01/2009

Sergio Santos

Fabio,   Bom Dia   Continuo com dúvida. Não estou conseguindo saber o lugar certo de fazer isto.   Eu preciso criar os nòs antes? ou ele vai pegar direto os nomes dos campos da Select?   []s Sérgio
Responder

Gostei + 0

26/01/2009

Fabio Mans

Vamos tentar explicar novamente, vou criar o projeto inteiro para você.     Página ASPX tem dois botões e um grid.     using System; using System.Configuration; using System.Data; using System.Data.SqlClient; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } /// <summary> /// Retorna o dataset, select no seu banco. /// </summary> /// <returns></returns> private DataSet RetornaDataSet() { DataSet ds = new DataSet(); using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["cnnString"].ConnectionString)) { string sql = "SELECT top 10 FC_ID_PROFISSIONAL AS CODIGO, CLIENTE_NOME_PROFISSIONAL AS PROFISSIONAL, CLIENTE_PRIMEIRO_NOME AS NOME, CLIENTE_NOMES_MEIO AS MEIO, " + "CLIENTE_SOBRENOME AS SOBRENOME " + "FROM FC_NOVARTIS001 "; using (SqlCommand cmd = new SqlCommand(sql, cn)) { SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(ds); } } return ds; }   //Aqui vc preenche o Grid, chamando o RetornaDataSet protected void btnGrid_Click(object sender, EventArgs e) { GridView1.DataSource = RetornaDataSet(); GridView1.DataBind(); } //Aqui vc gera o XML, usando o mesmo metodo protected void btnXML_Click(object sender, EventArgs e) { const string NomeArquivo = "C:\\Teste.XML"; using (DataSet ds = RetornaDataSet()) { ds.WriteXml(NomeArquivo, XmlWriteMode.IgnoreSchema); } } } ====================================================   Resultado do Grid     CODIGO PROFISSIONAL NOME MEIO SOBRENOME 1 PEDRO JOSE FERREIRA JOSE 2 MARIA DAS DORES SOARES DAS DORES 3 RITA CASSIA SILVA CASSIA 4 LUCIO FERNANDO CARLOS FERNANDO       =====================================================   Resultado o arquivo XML - Não precisa fazer nada, o WriteXml faz tudo para você.     <?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Table>
    <CODIGO>1</CODIGO>
    <PROFISSIONAL>PEDRO</PROFISSIONAL>
    <NOME>JOSE</NOME>
    <MEIO>FERREIRA</MEIO>
    <SOBRENOME>JOSE</SOBRENOME>
  </Table>
  <Table>
    <CODIGO>2</CODIGO>
    <PROFISSIONAL>MARIA </PROFISSIONAL>
    <NOME>DAS DORES</NOME>
    <MEIO>SOARES</MEIO>
    <SOBRENOME>DAS DORES</SOBRENOME>
  </Table>
  <Table>
    <CODIGO>3</CODIGO>
    <PROFISSIONAL>RITA</PROFISSIONAL>
    <NOME>CASSIA</NOME>
    <MEIO>SILVA</MEIO>
    <SOBRENOME>CASSIA</SOBRENOME>
  </Table>
  <Table>
    <CODIGO>4</CODIGO>
    <PROFISSIONAL>LUCIO</PROFISSIONAL>
    <NOME>FERNANDO</NOME>
    <MEIO>CARLOS</MEIO>
    <SOBRENOME>FERNANDO</SOBRENOME>
  </Table>
</NewDataSet>    
Responder

Gostei + 0

26/01/2009

Sergio Santos

Valeu Fabio   Agora que entendi. Como vem da Select, não preciso especificar o nome para o XML e nem criar o nome das labels da Coluna.   Era isto q eu estava me enrolando.   Obrigado! Pd fechar este post!  
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar