Stringa XML a Varbinary (MAX) utilizzando LinqToEntities

linq-to-entities linq-to-xml offlineapps sqlbulkcopy

Domanda

Ho serializzato i valori di un database in XML e l'ho tenuto nella cartella di debug delle app. Ora voglio deserializzare e inserire nel database SQL.

Ecco cosa ho fatto:

XmlDocument XDoc = new XmlDocument();

            XDoc.Load("Serialized.xml");
            var xmlcontents = XDoc.InnerXml; //All XML Contents
            DataSet ds = new DataSet();
            StringReader sr = new StringReader(xmlcontents);
            ds.ReadXml(sr);
            DataTable offlineDT = ds.Tables[0];
            var context = new SysventLinqClassDataContext();


            context.Connection.Open();
            //The transaction Part
            using (context.Transaction = context.Connection.BeginTransaction())
            {
                using (var bulkCopy = new SqlBulkCopy(context.Connection.ConnectionString, SqlBulkCopyOptions.KeepIdentity))
                {
                    bulkCopy.ColumnMappings.Add("DocTitle", "DocTitle");
                    bulkCopy.ColumnMappings.Add("DateOfReceipt", "DateOfReceipt");
                    bulkCopy.ColumnMappings.Add("Descriptions", "Descriptions");
                    bulkCopy.ColumnMappings.Add("HouseID", "HouseID");
                    bulkCopy.ColumnMappings.Add("DocData", "DocData".ToString());
                    bulkCopy.ColumnMappings.Add("SiteID", "SiteID");
                    bulkCopy.ColumnMappings.Add("EmployeeID", "EmployeeID");


                    bulkCopy.BulkCopyTimeout = 600;
                    bulkCopy.DestinationTableName = "tblDocument";
                    bulkCopy.WriteToServer(offlineDT);
                }

            }

La classe contiene:

public string DocTitle { get; set; }
        public string DateOfReceipt { get; set; }       
        public string Descriptions { get; set; }

        [System.Xml.Serialization.XmlElementAttribute("DocData", DataType ="base64Binary")]
        public byte[] DocData { get; set; } //This is a PDF document as varbinary(MAX) in mySQL Database
        public int SiteID { get; set; }
        public int HouseID { get; set; }
        public int DesignID { get; set; }
        public int EmployeeID { get; set; }


        public void Save(string filename) //TO be called inside the main
        {
            using (var stream = new FileStream(filename, FileMode.Create))
            {
                var xmlData = new XmlSerializer(typeof(Class1));
                xmlData.Serialize(stream, this);
            }
        }

Il onButton clicca per salvare il file:

FileStream fStream = File.OpenRead(filepath);
                byte[] contents = new byte[fStream.Length];
                fStream.Read(contents, 0, (int)fStream.Length);
                fStream.Close();


                Byte[] hexByte = new Byte[2]{Convert.ToByte(100),
                Convert.ToByte(50)};

Così; DocData = contenuti;

Ora mostra l'errore: il valore dato di tipo String dall'origine dati non può essere convertito in tipo varbinary della colonna di destinazione specificata.

Risposta esperta

L'errore è "Il valore dato di tipo String dall'origine dati non può essere convertito in tipo varbinary della colonna di destinazione specificata

Questo è un errore molto frequente. Per alcuni tipi come varbinary, è necessario specificare il tipo di colonna per DataColumn altrimenti, è considerato come una stringa e non può essere convertito.

Tuttavia, non è possibile modificare il tipo di colonna una volta che DataTable è pieno di dati. Una soluzione alternativa è la clonazione della tabella e l'importazione dei dati

(Risposta originale da Akhil qui )

DataTable dtCloned = dt.Clone();
dtCloned.Columns[0].DataType = typeof(byte[]);
foreach (DataRow row in dt.Rows) 
{
    dtCloned.ImportRow(row);
}


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché