Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Kika_Epilética

[Resolvido]  ao extrair valores de xml e inseri-los no SqlS

Recommended Posts

E ai galera, td beleza ?

 

Tô aprendendo a trabalhar com o C# Utilizando o Visual Studio 2005.

Porém, estou com uma enooorme dúvida :

 

Tenho que fazer a seguinte tarefa : Cria uma aplicação Windows Form contendo um label, um Textbox e um botão.

Ao clicar no botão, deve aparecer o nome do meu arquivo xml (ao menos eu acho que é isso).

Tenho duas classes : uma chamada XML (onde será extraído os valores do meu arquivo xml) e outra se chama SqlServer.

 

Dúvidas : Como consigo passar os valores extraídos do xml para serem inserido no banco de dados (trabalho com uma procedure que insere tais valores) ?

Como o meu a minha classe XML irá passar os parâmetros para a classe SqlServer ?

Como o nome do arquivo xml aparecerá no textbox quando eu apertar o botão ?

 

Estarei postando minhas classes e minha procedure.

 

http://forum.imasters.com.br/public/style_emoticons/default/excl.gif Detalhe : Criei 2 tabelas no BD NotaFiscal e ConfidenceLevel. A tabela ConfidenceLevel herda a chave primária da NotaFiscal.

 

Procedure :

========

 

CODE
Create PROCEDURE dbo.SP_GRAVA_DADOS_XML

 

-- Declaração de variáveis das tabelas NotaFiscal e ConfidenceLevel

 

@TipoDocumentoFiscal char(2),

@NumeroDocumentoFiscal varchar(10),

@Serie char(2),

@TipoDocumento char(2),

@CNPJFornecedor varchar(14),

@CNPJGerdau varchar(14),

@CNPJTransportadora varchar(14),

@DataEmissao datetime,

@CFOP char(6),

@ModeloNotaFiscal char(2),

@NumeroPedidoCompraNotaFiscal varchar(MAX),

@Placa varchar(MAX),

@ValorTotalNotaFiscal money,

@ValorTotalProduto money,

@ValorICMSNotaFiscal money,

@ValorIPINotaFiscal money,

@BaseICMS money,

@AliquotaICMS money,

@AliquotaIPI money,

@PesoTotalNota varchar(2),

@Volume char(2),

@FileSystem varchar(MAX),

@Usuario varchar(10),

@ValorISS money,

@NumeroViaNF char(2),

@DataLimiteEmissao datetime,

@NameSpace varchar(MAX),

@BaseCalculoICMSSubstituicao money,

@ValorICMSSubstituicao money,

@ValorFrete money,

@ValorSeguro money,

@OutrasDespesasAcessorias money,

@UserService varchar(MAX),

@ConfidenceLevel01 real,

@ConfidenceLevel02 real,

@ConfidenceLevel03 real,

@ConfidenceLevel04 real,

@ConfidenceLevel05 real,

@ConfidenceLevel06 real,

@ConfidenceLevel07 real,

@ConfidenceLevel08 real,

@ConfidenceLevel09 real,

@ConfidenceLevel10 real,

@ConfidenceLevel11 real,

@ConfidenceLevel12 real,

@ConfidenceLevel13 real,

@ConfidenceLevel14 real,

@ConfidenceLevel15 real,

@ConfidenceLevel16 real,

@ConfidenceLevel17 real,

@ConfidenceLevel18 real,

@ConfidenceLevel19 real,

@ConfidenceLevel20 real,

@ConfidenceLevel21 real,

@ConfidenceLevel22 real,

@ConfidenceLevel23 real,

@ConfidenceLevel24 real,

@ConfidenceLevel25 real,

@ConfidenceLevel26 real

AS

BEGIN

 

-- Inserindo valores na tabela NotaFiscal

 

INSERT INTO NotaFiscal

( TipoDocumentoFiscal, NumeroDocumentoFiscal, Serie, TipoDocumento,

CNPJFornecedor, CNPJGerdau, CNPJTransportadora, DataEmissao, CFOP,

ModeloNotaFiscal, NumeroPedidoCompraNotaFiscal, Placa, ValorTotalNotaFiscal,

ValorTotalProduto, ValorICMSNotaFiscal, ValorIPINotaFiscal, BaseICMS,

AliquotaICMS, AliquotaIPI, PesoTotalNota, FileSystem, Usuario, ValorISS,

NumeroViaNF, DataLimiteEmissao, NameSpace, BaseCalculoICMSSubstituicao,

ValorICMSSubstituicao, ValorFrete, ValorSeguro, OutrasDespesasAcessorias,

UserService ) VALUES

( @TipoDocumentoFiscal, @NumeroDocumentoFiscal, @Serie, @TipoDocumento,

@CNPJFornecedor, @CNPJGerdau, @CNPJTransportadora, @DataEmissao, @CFOP,

@ModeloNotaFiscal, @NumeroPedidoCompraNotaFiscal, @Placa,

@ValorTotalNotaFiscal, @ValorTotalProduto, @ValorICMSNotaFiscal,

@ValorIPINotaFiscal, @BaseICMS, @AliquotaICMS, @AliquotaIPI, @PesoTotalNota,

@FileSystem, @Usuario, @ValorISS, @NumeroViaNF, @DataLimiteEmissao,

@NameSpace, @BaseCalculoICMSSubstituicao, @ValorICMSSubstituicao,

@ValorFrete, @ValorSeguro, @OutrasDespesasAcessorias, @UserService )

 

-- A intrução SELECT @@identity pega o valor da chave primária/identificador

-- de cada registro inserido na tabela NotaFiscal. O valor que retornar

-- nessa consulta, será inserido no campo ID_NotaFiscal da tabela ConfidenceLevel.

 

declare @id int

set @id = (SELECT @@identity)

 

-- Inserindo valores na tabela ConfidenceLevel

 

INSERT INTO ConfidenceLevel

( ID_NotaFiscal, ConfidenceLevel01, ConfidenceLevel02, ConfidenceLevel03, ConfidenceLevel04,

ConfidenceLevel05, ConfidenceLevel06, ConfidenceLevel07, ConfidenceLevel08,

ConfidenceLevel09, ConfidenceLevel10, ConfidenceLevel11, ConfidenceLevel12,

ConfidenceLevel13, ConfidenceLevel14, ConfidenceLevel15, ConfidenceLevel16,

ConfidenceLevel17, ConfidenceLevel18, ConfidenceLevel19, ConfidenceLevel20,

ConfidenceLevel21, ConfidenceLevel22, ConfidenceLevel23, ConfidenceLevel24,

ConfidenceLevel25, ConfidenceLevel26 ) VALUES

( @id, @ConfidenceLevel01, @ConfidenceLevel02, @ConfidenceLevel03, @ConfidenceLevel04,

@ConfidenceLevel05, @ConfidenceLevel06, @ConfidenceLevel07, @ConfidenceLevel08,

@ConfidenceLevel09, @ConfidenceLevel10, @ConfidenceLevel11, @ConfidenceLevel12,

@ConfidenceLevel13, @ConfidenceLevel14, @ConfidenceLevel15, @ConfidenceLevel16,

@ConfidenceLevel17, @ConfidenceLevel18, @ConfidenceLevel19, @ConfidenceLevel20,

@ConfidenceLevel21, @ConfidenceLevel22, @ConfidenceLevel23, @ConfidenceLevel24,

@ConfidenceLevel25, @ConfidenceLevel26 )

 

 

END

 

Classe XML :

=========

CODE
using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Xml;

using System.Collections;

using System.Data.SqlClient;

 

namespace ProjetoXml

{

// Classe de geração de arquivos XML

public partial class XML : Form

{

#region Construtor

 

public XML()

{

InitializeComponent();

}

#endregion

 

#region Gera XML

private void button1_Click(object sender, EventArgs e)

{

string caminhoXml= @"C:\Arquivos de programas\Xml_Gerdau"; // caminho onde os arquivos XML se encontram

XmlDocument arqXML = new XmlDocument(); // Criando um objeto da classe XmlDocument

arqXML.Load(caminhoXml); // Fazendo Load dos arquivos XML

XmlNodeList xmlCampos = arqXML.GetElementsByTagName(textBox1.Text); // Retorna uma lista de nós filhos

 

for (int i = 0; i < xmlCampos[0].ChildNodes.Count; i++)

{

XmlNode Node = xmlCampos[0].ChildNodes; // Retorna todos os nós filhos de um nó

Hashtable param = new Hashtable(); // Criando um bjeto da classe HashTable

 

// Esses param.Add devem ser armazenados em alguma variável para eu poder passar para a classe SqlServer ? Como faço ?

param.Add("@TipoDocumentoFiscal" + Node.Name, Node.Value);

param.Add("@NumeroDocumentoFiscal" + Node.Name, Node.Value);

param.Add("@Serie" + Node.Name, Node.Value);

param.Add("@TipoDocumento" + Node.Name, Node.Value);

param.Add("@CNPJFornecedor" + Node.Name, Node.Value);

param.Add("@CNPJGerdau" + Node.Name, Node.Value);

param.Add("@CNPJTransportadora" + Node.Name, Node.Value);

param.Add("@DataEmissao" + Node.Name, Node.Value);

param.Add("@CFOP" + Node.Name, Node.Value);

param.Add("@ModeloNotaFiscal" + Node.Name, Node.Value);

param.Add("@NumeroPedidoCompraNotaFiscal" + Node.Name, Node.Value);

param.Add("@Placa" + Node.Name, Node.Value);

param.Add("@ValorTotalNotaFiscal" + Node.Name, Node.Value);

param.Add("@ValorTotalProduto" + Node.Name, Node.Value);

param.Add("@ValorICMSNotaFiscal" + Node.Name, Node.Value);

param.Add("@ValorIPINotaFiscal" + Node.Name, Node.Value);

param.Add("@BaseICMS" + Node.Name, Node.Value);

param.Add("@AliquotaICMS" + Node.Name, Node.Value);

param.Add("@AliquotaIPI" + Node.Name, Node.Value);

param.Add("@PesoTotalNota" + Node.Name, Node.Value);

param.Add("@FileSystem" + Node.Name, Node.Value);

param.Add("@Usuario" + Node.Name, Node.Value);

param.Add("@ValorISS" + Node.Name, Node.Value);

param.Add("@NumeroViaNF" + Node.Name, Node.Value);

param.Add("@DataLimiteEmissao" + Node.Name, Node.Value);

param.Add("@NameSpace" + Node.Name, Node.Value);

param.Add("@BaseCalculoICMSSubstituicao" + Node.Name, Node.Value);

param.Add("@ValorICMSSubstituicao" + Node.Name, Node.Value);

param.Add("@ValorFrete" + Node.Name, Node.Value);

param.Add("@ValorSeguro" + Node.Name, Node.Value);

param.Add("@OutrasDespesasAcessorias" + Node.Name, Node.Value);

param.Add("@UserService" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel01" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel02" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel03" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel04" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel05" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel06" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel07" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel08" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel09" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel10" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel11" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel12" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel13" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel14" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel15" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel16" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel17" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel18" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel19" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel20" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel21" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel22" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel23" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel24" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel25" + Node.Name, Node.Value);

param.Add("@ConfidenceLevel26" + Node.Name, Node.Value);

 

} // Fecha o for

 

/* Após pegar cada valor de cada campo do arquivo xml, os parâmetros serão enviados para a classe SQL.

Mas como eu faço isso ?

 

 

/* PAREI POR AQUI. FIQUEI PERDIDA <_< .

String conexao = conectar.ConnectionString;

SQLServer conectar = new SQLServer(); --> TEM QUE SER ASSIM OU conectar = new conectar = new SqlConnectio() ??

conectar.Conexao(conexao);

conectar.Query( );

conectar.getDataSet( );

conectar.ExecuteScalar( );

conectar.ExecutaProcedure( );

conectar.RetornaDadosProcedure ( );

conectar.MontaSQL( );

conectar.MontaCampos( ); */

 

 

 

}

#endregion

 

private void textBox1_TextChanged(object sender, EventArgs e)

{

// O QUE EU DEVO FAZER AQUI ?

}

 

// Fecha o método button1_Click

} // Fecha a classe GeraXml

} // Fecha o namespace

Classe SQLServer

=============

 

Essa classe eu peguei de um outro programa, tanto que é de outro namespace, mas devo utilizála para conseguir passar as informações do xml

para o banco

 

CODE
using System;

using System.Collections;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Data.SqlClient;

 

namespace ConexaoBD

{

 

public class SQLServer

{

#region AbreConexao

public static SqlConnection Conexao(string strConexao)

{

return new SqlConnection(strConexao);

}

public static SqlConnection Conexao(SqlConnectionStringBuilder strConexao)

{

return new SqlConnection(strConexao.ConnectionString);

//Retorna Data Source e ID do usuário

 

}

public static SqlConnection Conexao(string Servidor, string Usuario, string Senha, string Banco)

{

 

return new SqlConnection("Password="+ Senha +";Persist Security Info=True;User ID="+ Usuario +";Initial Catalog="+ Banco +";Data Source="+ Servidor );

}

public static SqlConnection Conexao(string Servidor, string Banco)

{

return new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=" + Banco + ";Data Source=" + Servidor);

}

#endregion

 

#region Metodos Publicos

public static DataTable Query(SqlConnection Conexao, string Tabela,List<Campo> Campos,List<Campo> Criterio)

{

// Representa uma ou mais tabelas em memória sem precisar acessar um banco de dados em disco

DataTable dt=new DataTable() ;

 

// Atualiza registros do Banco de dados

SqlDataAdapter adpt = new SqlDataAdapter(MontaSQL(Tabela, Campos, Criterio), Conexao);

 

// O SqlDataAdapter fornece as informações para o Fill que realiza as modificações necessárias

adpt.Fill(dt);

 

return dt;

}

 

public static DataTable getDataSet(SqlConnection Conexao, string SQL)

{

SqlConnection sqlCon = Conexao; // Inicia conexão única com o BD

SqlDataAdapter sqlAdpt = new SqlDataAdapter(SQL, sqlCon); //Atualiza registros

DataTable ds = new DataTable();

sqlAdpt.Fill(ds);

return ds;

}

 

 

public static string ExecuteScalar(SqlConnection Conexao, string SQL)

{

SqlConnection sqlCon = Conexao; //Inicia a conexão

SqlCommand sqlCmd = new SqlCommand(SQL, sqlCon); // comando sql ou sp para execução no banco de dados

return sqlCmd.ExecuteScalar().ToString(); // Retorna qntd de linhas da consulta

}

 

// Classe que executará uma StoreProceure

public static void ExecutaProcedure(SqlConnection Conexao, string ProcName, Hashtable ParamIn)

{

 

// Se a conexão estiver fechada, ela será aberta

if (Conexao.State == ConnectionState.Closed)

{

Conexao.Open();

}

SqlCommand sqlCmd = new SqlCommand();

 

// carrega parâmentros de entrada

foreach (DictionaryEntry Pi in ParamIn)

{

sqlCmd.Parameters.Add(new SqlParameter(Pi.Key.ToString(), Pi.Value.ToString()));

}

 

sqlCmd.CommandType = CommandType.StoredProcedure; // Diz que o tipo de comando é uma StoreProcedure

sqlCmd.CommandText = ProcName; // Recebe a procedure consulta e armazena em sqlCmd. Pode-se colocar o nome da procedure nesse local tbm

sqlCmd.Connection = Conexao; // Recebe a Conexao

sqlCmd.ExecuteNonQuery(); // Executa a query sem retornar valor

}

 

public static DataTable RetornaDadosProcedure(SqlConnection Conexao, string ProcName, Hashtable ParamIn)

{

// Se a conexão estiver fechada, ela será aberta

if (Conexao.State == ConnectionState.Closed)

{

Conexao.Open();

}

SqlCommand sqlCmd = new SqlCommand();

 

// carrega parâmentros de entrada

foreach (DictionaryEntry Pi in ParamIn)

{

sqlCmd.Parameters.Add(new SqlParameter(Pi.Key.ToString(), Pi.Value.ToString()));

}

 

sqlCmd.CommandType = CommandType.StoredProcedure;

sqlCmd.CommandText = ProcName;

sqlCmd.Connection = Conexao;

 

SqlDataAdapter sqlAdpt = new SqlDataAdapter(sqlCmd);

DataTable dtResult = new DataTable();

sqlAdpt.Fill(dtResult);

return dtResult;

}

 

public static DataTable RetornaDadosProcedure(SqlConnection Conexao, string ProcName )

{

if (Conexao.State == ConnectionState.Closed)

{

Conexao.Open();

}

SqlCommand sqlCmd = new SqlCommand();

sqlCmd.CommandType = CommandType.StoredProcedure;

sqlCmd.CommandText = ProcName;

sqlCmd.Connection = Conexao;

 

SqlDataAdapter sqlAdpt = new SqlDataAdapter(sqlCmd);

DataTable dtResult = new DataTable();

sqlAdpt.Fill(dtResult);

return dtResult;

}

 

#endregion

 

 

 

private static string MontaSQL(string Tabela, List<Campo> Campos, List<Campo> Criterio)

{

string strSQL = string.Empty; // A variável strSQL recebe um valor vazio

strSQL = "Select " + MontaCampos(Campos, false) + " from " + Tabela + " where " + MontaCampos(Criterio,true) ;

return strSQL;

 

}

private static string MontaCampos(List<Campo> Campos, bool criterio)

{

string strRetorno = string.Empty;

 

foreach(Campo campo in Campos)

{

if (criterio)

strRetorno = strRetorno + " " + campo.ToString() + " " + campo.Operador + " " + campo.ValorCampo + " " + campo.AgregadorCriterio.ToString() ;

else

strRetorno = strRetorno + " " + campo.ToString() + " ,";

 

 

 

}

return strRetorno.Substring(0,strRetorno.Length-3);

 

}

 

 

}

}

 

 

Obrigada pela atenção e espero a ajuda da galera ^^ http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Bjos .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Movido Plataforma .NET http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Plataforma .NET » Windows Applications

 

Utilize um DataSet, pesquise sobre ReadXml.

Abraços...

Bom, a parte de ler o XML, aparentemente está correta, mas o problema é passar as variáveis da que pegam os

valores do XML para a classe Sql (onde há a conexão com o banco...).

Na classe Sql existem alguns métodos, sendo que eu tenho que passar os parâmetros da classe XML para a SQL...

Minha dúvida é como ? Estudei bastante, procurei vários tutorias, mas não tenho idéia de como fazer.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro na sua classe retire o static de suas funções e métodos.

 

No seu formulário que irá utilizar a classe adicione:

using ConexaoBD;

E para ter acesso a sua classe é necessário instanciar uma variável:

SQLServer vSqlServer = new SQLServer();

Depois para utlizar basta:

vSqlServer.SeuMetodo();

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi quintelab !

Obrigada pela ajuda, mas já consegui fazer o programa uhhhhuuuulllll http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Ficou até bem simples :

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Collections;
using System.IO;

namespace ProjetoXmlGerdau
{
	// Classe de geração de arquivos XML
	public partial class XML : Form
	{
		#region Construtor

		public XML()
		{
			InitializeComponent();
		}
		#endregion

		#region Gera XML
		private void button1_Click(object sender, EventArgs e)
		{
			string[] arquivos = Directory.GetFiles(txtDirXML.Text);  // Array que recebe todos os arquivo XML de um diretório
			for (int j = 0; j < arquivos.Length; j++)				// Percorre todos os arquivos
			{

				string caminhoXml = arquivos[j];		  // a variável caminhoXml recebe o caminho de cada arquivo
				string tagPai = txtTAGPai.Text;		   // tagPai recebe o texto que existir na textBox
				XmlDocument arqXML = new XmlDocument();   // Criando um objeto da classe XmlDocument
				arqXML.Load(caminhoXml);				  // Fazendo Load dos arquivos XML
				XmlNodeList xmlCampos = arqXML.GetElementsByTagName(tagPai);  // Retorna uma lista de nós filhos
				Hashtable param = new Hashtable();							// Criando um bjeto da classe HashTable

				for (int i = 0; i < xmlCampos[0].ChildNodes.Count; i++)	  // Para cada Nó pai será retornado seus nós filhos
				{
					XmlNode Node = xmlCampos[0].ChildNodes[i];			   // Retorna o nó filho de uma posição
					param.Add("@" + Node.Name, Node.InnerText);			  // Pega o nome do nó filho e o conteúdo da tag
				} 

				// Após pegar cada valor de cada campo do arquivo xml, os parâmetros serão enviados para a classe SQLServer
				SQLServer.ExecutaProcedure(SQLServer.Conexao(@"RJASTEC-03891\SQLEXPRESS", "sa", "sa", "xmlGerdau"), "SP_GRAVA_DADOS_XML", param);

			} // Fecha primeiro For

			MessageBox.Show("Importação Concluída !");
		}
		#endregion

Resolvi não usar o outro projeto pq havia várias classes que eu não precisava usar, pois precisava apenas de 1 (a da conexão com o banco ...)

Não precisei tirar o static dos métodos dai por isso que não precisa criar objeto da classe SQLServer http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Agora falta só o tratamento de exceção...para verificar se existe algum erro e colocar em um log.

você sabe como posso fazer isso ?

 

Abraços e Obrigada !

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai quintlab, beleza ?

Já consegui fechar todo o meu programa

Ficou show de bola hehehe

Adicionei a ele um progressbar pra verificar qual arquivo xml que tá extraindo...ficou bem legal http://forum.imasters.com.br/public/style_emoticons/default/wub.gif

 

Muito obrigada pela ajuda ^^

Abraços http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.