LinqToEntities를 사용하여 XML 문자열을 Varbinary (MAX)로 변환

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

문제

데이터베이스 값을 XML에 직렬화하고 Apps 디버그 폴더에 보관했습니다. 이제 그것을 deserialize하고 SQL 데이터베이스에 삽입하고 싶습니다.

여기 내가 한 일이있다.

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);
                }

            }

수업 내용 :

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);
            }
        }

onButton을 클릭하여 파일을 저장합니다.

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)};

그러므로; DocData = 내용;

이제 오류 표시 : 데이터 소스의 String 유형의 지정된 값을 지정된 대상 열의 varbinary 유형으로 변환 할 수 없습니다.

전문가 답변

오류 '데이터 소스의 String 유형의 지정된 값을 지정된 대상 열의 varbinary 유형으로 변환 할 수 없습니다.

그것은 매우 빈번한 오류입니다. varbinary와 같은 일부 유형의 경우 DataColumn에 대해 열 유형을 지정해야하며 그렇지 않으면 문자열로 간주되어 변환 할 수 없습니다.

그러나 DataTable이 데이터로 채워지면 열 유형을 변경할 수 없습니다. 한 가지 해결 방법은 테이블을 복제하고 데이터를 가져 오는 것입니다.

(Akhil의 원본 답변은 여기 )

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


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.