2016-11-24 2 views
0

데이터베이스 값을 XML로 직렬화하고 Apps 디버그 폴더에 보관했습니다. 이제 그것을 deserialize하고 SQL 데이터베이스에 삽입하고 싶습니다.XML 문자열에서 LinqToEntities를 사용하는 Varbinary (MAX)

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 유형으로 변환 할 수 없습니다.

+0

질문은 무엇을 가져 오는? 아니면 오류? 지금까지했던 코드를 보여줍니다 (훌륭합니다!). 그러나 나는 당신의 게시물에 질문이나 우리가 당신을 도와야 할 것으로 보이는 것을 보지 못합니다. –

+0

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

답변

1

The error is 'The given value of type String from the data source cannot be converted to type varbinary of the specified target column

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

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

(아킬 here에서 원래 응답)

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