6 messaggi dal 15 maggio 2013
Ciao a tutti,
ho un problema con la scrittura dei record di un database, in un file xml, con un proprio schema.
Sostanzialmente mi interessa evitare che ad ogni esecuzione vengano scritte nel file XML i record del DB già inseriti, stavo pensando di utilizzare un ciclo, solo che non avendo mai avuto a che fare con i file XML non so come impostarlo..
di seguito vi riporto il codice del WebMethod che sto sviluppando:


public void MostraDati()
{
Autovetture rest = new Autovetture();
SqlConnection sqlConn = new SqlConnection(@"Data Source=localhost\sqlexpress;Initial Catalog=Concessionaria;Integrated Security=True");
sqlConn.Open();
DataTable dt = new DataTable();
try
{
SqlCommand sqlComm = new SqlCommand("Select IDAuto,Marca,Modello,Cilindrata,Consumo,PrezzoBase from Auto", sqlConn);

SqlDataAdapter sqldata = new SqlDataAdapter(sqlComm);
sqldata.Fill(dt);
}
catch (Exception)
{

}
sqlConn.Close();


string percorso = Server.MapPath("Let_Dati.xml");//per oltrepassare i permessi

int a= dt.Rows.Count;

XDocument doc = XDocument.Load(percorso);

for (int cont = 0; cont < a;cont++)
{
XElement car = new XElement("auto");

if (dt.Rows.Count > 0)
{
DataRow riga = dt.Rows[cont];
rest.IDAuto = Int32.Parse(riga["IDAuto"].ToString());
rest.Marca = riga["Marca"].ToString();
rest.Modello = riga["Modello"].ToString();
rest.Cilindrata = riga["Cilindrata"].ToString();
rest.Consumo = riga["Consumo"].ToString();
rest.PrezzoBase = riga["PrezzoBase"].ToString();

//scritture file XML
//metodo con Linq to XML
//problema: creare un ciclo per escludere la duplicazione del record...
car.Add(new XComment("Auto" + rest.IDAuto.ToString()), new XAttribute("IDAuto", rest.IDAuto.ToString()),
new XAttribute("Marca", rest.Marca),
new XAttribute("Modello", rest.Modello),
new XAttribute("Cilindrata", rest.Cilindrata),
new XAttribute("Consumo", rest.Consumo),
new XAttribute("PrezzoBase", rest.PrezzoBase));

doc.Root.Add(car);
}

doc.Save("C:\\Users\\Frenk\\Documents\\Visual Studio 2012\\WebSites\\ProvaWebServices\\Let_Dati.xml");


}
//lettura file xml----->ultima soluzione, provare con linq to xml!
//lettura con Linq to xml

XElement xelement = XElement.Load("C:\\Users\\Frenk\\Documents\\Visual Studio 2012\\WebSites\\ProvaWebServices\\Let_Dati.xml");
IEnumerable<XElement> auto = xelement.Elements().Distinct();

foreach (var machine in auto)
{
var x = machine;
System.Diagnostics.Debug.WriteLine(x.Attribute("IDAuto") + " " + x.Attribute("Marca") + " " + x.Attribute("Modello") + " " + x.Attribute("Cilindrata") + " " + x.Attribute("Consumo") + " " + x.Attribute("PrezzoBase"));
System.Console.WriteLine("Ciao");
}

}

ps. per prendere i dati dal DB uso una classe, con la quale l'inserimento dei record nel file XML è più semplice.
quindi vi chiedo se avete qualche soluzione per il mio problema.
grazie in anticipo.
Ciao,
il problema è a monte. Non hai nulla che possa far da chiave ai due oggetti (file xml in questo caso)?
In ultima analisi puoi sempre confrontare i singoli campi ma esistono anche altri metodi. Uno tra questi è l'hash e, scegliendo questa strada, hai vari metodi. Tu hai detto di avere già una classe che ti rappresenta l'xml o cmq l'oggetto che scriverai nell'xml. Per confrontare due istanze di questo tipo devi sovrascrivere il GetHashCode(). Sei tu che decidi quali campi, se uguali, indicheranno l'uguaglianza delle istanze.
In alternativa puoi operare sul file e qui darei un'occhiata alla classe HashAlgorithm che ha un metodo ComputeHash che prende come parametro uno stream o un array di byte e restituisce un hash confrontabile.
Poi si potrebbe ancora salire di un livello e capire che l'uguaglianza tra due file xml potrebbe risultare a meno di determinati attributi (per WinForm esistono delle API come Xml Diff And Patch ma non ho mai provato)

Ormai programmano tutti... ma la professionalità appartiene a pochi
6 messaggi dal 15 maggio 2013
Grazie Manuel per la tua risposta,
proverò ad utilizzare i diversi metodi che mi hai suggerito.
Se permetti vorrei farti un'altra domanda.
Io uso Visual Studio 2012, sempre con c#, e ho notato che il metodo "Console.WriteLine("Stringa")" non mi mostra nessun output a differenza del metodo "System.Diagnostics.Debug.WriteLine("Stringa")" che mi mostra il risultato sull'output di debug; quindi vorrei sapere se è un errore mio, di visual studio.
Se sbaglio io, mi potresti dire dove "Console.WriteLine" stampa il risultato??
Grazie ancora! :)
Non penso ci siano Console in ascolto se ti riferisci a una web application. Va bene il metodo che hai usato e che vedi nella finestra di Output.

Ormai programmano tutti... ma la professionalità appartiene a pochi
6 messaggi dal 15 maggio 2013
Ok, grazie ancora una volta per la tua risposta! :)

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.