944 messaggi dal 11 febbraio 2013
ciao,
sono alla prima esperienza con la serializzazione di tabelle in xml
in un database...
nello specifico quando importo ottengo errore per valori esadecimali non consentiti...

  Int16 campo1 = 0;
                String campo2 = string.Empty;
                String campo3 = string.Empty;
               
                connetionString = @"Data Source=(LocalDB)\v11.0;...";

                connection = new SqlConnection(connetionString);
             
             
                xmlFile = XmlReader.Create("Tabella.xml");

               
                ds.ReadXml(xmlFile);

                connection.Open();

                for (int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
                {

                    vcampo1 = Convert.ToInt16(ds.Tables[0].Rows[i].ItemArray[0]);
                    vcampo2 = Convert.ToString(ds.Tables[0].Rows[i].ItemArray[1]);
                    vcampo3 = Convert.ToString(ds.Tables[0].Rows[i].ItemArray[2]);
                    .....

                 

                    command = new SqlCommand("Insert", connection);
                    command.CommandType = CommandType.StoredProcedure;

                    command.Parameters.AddWithValue("@Rcampo1", campo1); //smallint,
                    command.Parameters.AddWithValue("@Rcampo2", campo2);  //varchar,
                    command.Parameters.AddWithValue("@Rcampo3", campo3);  //varchar,
                    .......

                    adpter.InsertCommand = command;
                    adpter.InsertCommand.ExecuteNonQuery();


...come faccio a modificare l'xml in lettura qui:
ds.ReadXml(xmlFile);
vorrei assicurarmi che ci siano solo valori consentiti prima di chiamare questo metodo...

grazie a tutti coloro che possano aiutarmi
saluti
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
potresti usare la classe XmlDocument o XDocument per leggere, modificare e risalvare il file, ma non se è molto grande. Queste classi infatti devono caricare il file in memoria per permetterti di leggerlo.

Con quale sistema è stato generato il file Tabella.xml? Hai la possibilità di farglielo generare già corretto?
Puoi fare un esempio dei caratteri non validi?

ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
ciao e grazie per avermi risposto...
si tratta di una tabella con 80 colonne e piu di 100k records...
debbo generare xml per 40 tabelle e poi reimportarli in un database dove ho già creato tabelle vuote con i tipi di dato specifici.

...ho notato che con SqlBulkCopy non riscontro errori di valori non consentiti e l'operazione di importazione è velocissima ...

using (SqlConnection con = new SqlConnection(cs))
            {
                //Thread.CurrentThread.CurrentCulture = new CultureInfo("it-IT");

                DataSet ds = new DataSet();
                ds.ReadXml("tabella.xml");
                DataTable dtTab = ds.Tables["tabella"];
                con.Open();
                using (SqlBulkCopy bc = new SqlBulkCopy(con))
                {
                    bc.DestinationTableName = "tabella";
                    
                    for (int col = 0; col <= 81; col++)
                    {
                        bc.ColumnMappings.Add(col, col);                        
                    }
                    
                    bc.WriteToServer(dtTab);
                }
            }

dici che va bene?
L'unico problema è la virgola...!!!

Nei file XLM i campi float hanno il punto come separatore dei decimali...
cosa mi consigli ?
Modificato da jjchuck il 02 marzo 2016 10.22 -
944 messaggi dal 11 febbraio 2013
scusa dimenticavo di rispondere alle tue domande...

per generare l'xml uso il framework...


using (SqlConnection conn = new SqlConnection(connstr))
            {
                try
                {
                    conn.Open();

                    String select = "SELECT ... FROM TABELLA ";
                    using (SqlCommand comm = new SqlCommand(select, conn))
                    {
                        SqlDataAdapter adapt = new SqlDataAdapter(comm);
                        DataSet ds = new DataSet();
                        
                        ds.DataSetName = "TABELLA_DataSet";
                        adapt.Fill(ds, "TABELLA");
                                              
                        ds.Tables["TABELLA"].WriteXml("TABELLA.xml");

                    }
                }

un esempio di caratteri non validi che ottengo:
&#x0;&#x13
944 messaggi dal 11 febbraio 2013
Per quanto riguarda il separatore dei decimali ho risolto con un
Replace(campo,'.',',') nella select...

ora mi sono reso conto che il modo piu veloce per esportare è usare un xmlreader e un xmlwriter...(sembra ovvio perchè il dataset immagazzina tutta quella roba)
però continuo ad ottenere
carattere '.' con valore esadecimale 0x00 non consentito...
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, non so perché la virgola abbia rappresentato un problema in fase di deserializzazione. Forse stai usando Culture diverse per serializzare e deserializzare?

In alternativa, anche per provare a risolvere la questione dei caratteri non validi, hai provato ad usare la serializzazione binaria?

Serializzi il DataTable così:
using (var file = System.IO.File.OpenWrite(Server.MapPath("~/App_data/file.bin")){
  var formatter = new BinaryFormatter();
  dataTable.RemotingFormat = SerializationFormat.Binary;
  formatter.Serialize(file, dataTable);
}


e lo deserializzi così:
using (var file = System.IO.File.OpenRead(Server.MapPath("~/App_data/file.bin")){
  var formatter = new BinaryFormatter();
  var dataTable = formatter.Deserialize(file) as DataTable;
}


ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
Ci ho provato ora
String constr = ConfigurationManager.ConnectionStrings["XXX"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(constr))
        {
            String select = "SELECT ...
                        " FROM ...";
            using (SqlCommand com = new SqlCommand(select,conn))

            {
                
                conn.Open();
                SqlDataReader reader =  com.ExecuteReader();
                DataTable dt = new DataTable();
                dt.Load(reader);
            
                using (var file = File.OpenWrite(Server.MapPath("~/App_data/file.bin")))
                {
                    var formatter = new BinaryFormatter();
                    dt.RemotingFormat = SerializationFormat.Binary;
                    formatter.Serialize(file, dt);
                }
            }
        }

mi da System.OutOfMemoryException
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, prova a serializzarne alcune righe alla volta come vedi in questo articolo.
http://mikehadlow.blogspot.it/2007/07/serializing-lots-of-different-objects.html

In pratica, anziché aprire il file con OpenWrite, usa questo costruttore di FileStream indicando FileMode.Append e FileAccess.Write per continuare ad aggiungere contenuto al file binario.

ciao,
Moreno

Enjoy learning and just keep making

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.