Hola a todos!! de primeras gracias a los que hagan el esfuerzo de leerlo y más a los que respondan.
Mi problema, aparte de q soy novato, es el hecho de pasar una variable que he capturado de un campo de un doc XML, y tratarlo en otro form para insertarlo en una tabla Oracle.
Os paso el código:
FORM1
-----------
namespace pruebaXML
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
RecogerXML_PedidoTienda();
}
private void button3_Click(object sender, EventArgs e)
{
MostrarCampos_PedidoTienda();
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
private void button4_Click(object sender, EventArgs e)
{
InsertarDatos f = new InsertarDatos();
f.ShowDialog();
}
//private static readonly string cnnStr = ConfigurationManager.ConnectionStrings["xTrelaIntegracionConnectionString"].ConnectionString;
private static readonly string cnnStrTPV = ConfigurationManager.ConnectionStrings["xTrelaTPVConnectionString"].ConnectionString;
//Código encargado de realizar la conexion con la bbdd
//y de llamar al método que realiza la recogida del XML del campo de la bbdd
//y de crear el archivo xml en la ruta especificada
private void RecogerXML_PedidoTienda()
{
XmlDocument doc = new XmlDocument();
SqlConnection cnn = new SqlConnection(cnnStrTPV);
cnn.Open();
LoadXml(cnn, doc);
cnn.Close();
doc.Save("C:\Users\davidma\Desktop\OutputXml.xml");
MessageBox.Show("Archivo XML importado y creado correctamente", "Info",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
//Método que recoge el campo xml de la bbdd
protected bool LoadXml(SqlConnection cnn, XmlDocument doc)
{
//Leemos el campo serialización(XML) de la bbdd.
string sql = @"SELECT Serializacion
FROM xTrelaTPV..OPERACIONES
WHERE IdOperacion = @IdOperacion
AND idtabla=@idtabla";
SqlCommand cm = new SqlCommand(sql, cnn);
cm.Parameters.Add(new SqlParameter("@IdOperacion", 10001901982));//id de ejemplo
cm.Parameters.Add(new SqlParameter("@Idtabla", 122));//idtabla PedidosTiendas
using (SqlDataReader dr = cm.ExecuteReader())
{
if (dr.Read())
{
SqlXml MiXml = dr.GetSqlXml(dr.GetOrdinal("Serializacion"));
doc.LoadXml(MiXml.Value);
return true;
}
else
{
return false;
}
}
}
//Método encargado de sacar los campos del xml
//moviendose por los diferentes nodos del archivo
public void MostrarCampos_PedidoTienda() {
XmlDocument xDoc = new XmlDocument();//XmlDocument nos permite editar el XML
//La ruta del documento XML permite rutas relativas
//respecto del ejecutable!
xDoc.Load("C:/Users/davidma/Desktop/OutputXml.xml");//ruta del archivo xml
XmlNodeList pedidostiendas =
xDoc.GetElementsByTagName("PedidoTienda");//idtabla=122-->PedidosTiendas
//XmlNodeList lista =
//((XmlElement)pedidotienda[0]).GetElementsByTagName("tiendapedido");
string contenido;//variable fuera del bucle para poder hacer el return
//y llamarla desde otro form
foreach (XmlElement nodo in pedidostiendas)
{
int i = 0;
XmlNodeList nEntityState = nodo.GetElementsByTagName("EntityState");
XmlNodeList nCodigoBarras = nodo.GetElementsByTagName("CodigoBarras");
contenido = String.Format
("nEntityState={0}nCodigoBarras={1}",
nEntityState
.InnerText,
nCodigoBarras.InnerText,
//-------------------------------------------------------------------
//-------------------------------------------------------------------
//separaciones para diferenciar los nodos(a la hora de sacarlo por pantalla)
//que a su vez son diferentes tablas...
string separacion = "<PedidoTienda>";
//end separaciones
string msg = (separacion + contenido);
MessageBox.Show(msg, "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
// return contenido;//kitar si peta
}
}
}
FORM2
-----------
namespace pruebaXML
{
public partial class InsertarDatos : Form
{
public InsertarDatos()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ConnectToOracle();//(OraSid,OraPass,OraUser);
}
public void ConnectToOracle()
{
System.Data.OracleClient.OracleConnection conn =
new System.Data.OracleClient.OracleConnection();
// TODO: Modify the connection string and include any
// additional required properties for your database.
conn.ConnectionString =
"Data Source=DEVELOP_ORASRVDEV03;"+//schema bbdd
"User ID=libra;"+ //usuario
"Password=libra521fordevelopers"; //password
try
{
conn.Open();
MessageBox.Show("Conexión realizada con éxito!","INFO",MessageBoxButtons.OK,MessageBoxIcon.Information);
// Insert code to process data.
//Declaro una variable de tipo command del oracle
System.Data.OracleClient.OracleCommand MiComando = new System.Data.OracleClient.OracleCommand();
//Declaro mis parametros que voy a utilizar
System.Data.OracleClient.OracleParameter EntityS;
System.Data.OracleClient.OracleParameter codigoB;
//Instanceo mis parametros
EntityS = new System.Data.OracleClient.OracleParameter();
codigoB = new System.Data.OracleClient.OracleParameter();
//Asigna a los parámetros los valores que serán almacenados
EntityS.OracleType = System.Data.OracleClient.OracleType.VarChar;
codigoB.OracleType = System.Data.OracleClient.OracleType.Int32;
//Le doy nombre a los parametros
EntityS.ParameterName = "Param1";
codigoB.ParameterName = "Param2";
//Declaro la variable "form" del tipo formulario
//para llamar a las variables del Xml
//--> Form1 coger = new Form1();
////////////////
//les digo de que tipo de parametros van a hacer.
//contenido.getstring();
// string entitystate = Form1.MostrarCampos_PedidoTienda(contenido);
//string EntityState1 = Form1.MostrarCampos_PedidoTienda(contenido.nEntityState);
//int i = 0;
//EntityState.Value = coger.nEntityState.Text.ToString();//variables(del xml) del otro form
//codigoB.Value = Int32.Parse(coger.nCodigoBarras.Text.ToString());// "
//Limpio los parametros que voy a utilizar evitando alguna basura...
MiComando.Parameters.Clear();
//agrego los parametros para la ejecucion del comando
MiComando.Parameters.Add(EntityS);
MiComando.Parameters.Add(codigoB);
//agrego el comando a ser ejecutado
MiComando.CommandText = "Insert into TO_PRUEBAS(EstadoEntidad,CodigoBarras)values(Param1,Param2)";
//simplemente y sencillamente abro la conexion ejecuto el comando
//y luego cierro la conexion
conn.Open();
MiComando.ExecuteNonQuery();
//MiComando.ExecuteOracleNonQuery();
//conn.Close();
}
catch
{
MessageBox.Show("Error al conectar/insertar datos a la base de datos","ERROR",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
finally
{
conn.Close();
}
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
MessageBox.Show("Conexión cerrada después de realizar tareas con éxito", "INFO", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
//}
-----------------------------------------------------------
-----------------------------------------------------------
Bueno llegado este punto, os comento....he borrado muchas variables para no hacerlo más engorroso, asi que solo he dejado 2 para hacer la prueba(obviamente en Oracle hay una tabla con campos vacios dond esperan estas variables).
La cosa es que, en el primer Form, recoge los campos del XML, los separa, y los mete en variables, vease nEntityState, y luego en "contenido"-->que en realidad este contenido es para juntarlo todo y sacarlo en un msg,,,supongo que no es necesario para realizar el return,,o si,, :S
Desde el Form2, se deben llamar a estas variables para poderlas insertar en la tabla,,,pero no se como trabajar con ellas desde otro form,,,he provado el tema del return pero m da error....
Espero hayais entendido toda la metodologia y m podais ayudar.
Muchisimas gracias!