2017-12-28 36 views
0

DataTable에 쿼리를 실행하고 데이터를 저장하는 프로그램이 있습니다. 그런 다음 사용자가 해당 DataTable.WriteXML을 저장할 수 있습니다. 내가 가지고있는 문제는 다른 파일 이름 (XML 파일)을 다른 DataTable으로 읽는 것을 허용하고 그것을 허용하지 않는다는 것입니다. "데이터 테이블에 '결과 테이블로드 중 오류 :'가져 오기 테이블 '이 소스의 DataTable과 일치하지 않습니다."WriteXML, ReadXML 테이블 이름 문제

이제 XML에 다른 테이블 이름이 들어 있다는 메시지가 표시됩니다. DataTable 나는 그것으로 ReadXML하려고합니다. TableName 속성을 공백으로 설정하려고 시도했지만 아무런 차이가 없습니다.

그래서 제 질문은 다른 사람들이이 문제를 어떻게 해결할 수 있느냐입니다. 표준 DataTable.WriteXML (파일 이름) 및 DataTable.ReadXML 메서드 호출을 사용하고 있습니다. 일부 디자인 문제로 인해 - 데이터를 내보내는 데 사용 된 것과 다른 이름으로 가져온 DataTable을 가져야합니다.

이 문제를 해결할 데이터 테이블의 데이터를 쓰고 읽는 다른 방법이 있습니까?

예제 코드 - 문제 표시 로드 - 두 테이블을 만듭니다. 하나는 다른 가져 오기 내보내기로 이름이 지정된 것입니다. 내보내기를위한 구조체를 만들고 10 개의 레코드로 채 웁니다.

private void Form_Main_Load(object sender, EventArgs e) 
    { 
     ExportTable = new DataTable("Export"); 
     ImportTable = new DataTable("Import"); 

     ExportTable.Columns.Add("ID", Type.GetType("System.Int32")); 
     ExportTable.Columns.Add("Name", Type.GetType("System.String")); 
     ExportTable.Columns.Add("Amount", Type.GetType("System.Int32")); 

     // Populate the first one 
     DataRow workRow; 
     for (int i = 0; i <= 9; i++) 
     { 
      workRow = ExportTable.NewRow(); 
      workRow[0] = i; 
      workRow[1] = "CustName" + i.ToString(); 
      workRow[2] = i; 
      ExportTable.Rows.Add(workRow); 
     } 
    } 

그런 다음 두 개의 버튼을 만듭니다. 하나는 데이터를 내보내고 다른 하나는 데이터를 가져 오기위한 버튼입니다.

private void button_Export_Click(object sender, EventArgs e) 
    { 
     ExportTable.WriteXml("c:\\Temp\\TableOut.xml"); 
    } 

    private void button_Import_Click(object sender, EventArgs e) 
    { 
     ImportTable.ReadXmlSchema("c:\\Temp\\TableOut.xml"); 
     ImportTable.ReadXml("c:\\Temp\\TableOut.xml"); 
    } 

데이터를 내 보낸 다음 가져 오기 버튼을 클릭하십시오. 그렇게하면 - "DataTable 'Import'가 소스에있는 DataTable과 일치하지 않습니다."라는 오류 메시지가 나타납니다. XML이 XML에 임베드 된 내보내기 테이블 이름을 가지고 있기 때문에 이것이 실현되었습니다. 필자의 경우 데이터를 다른 이름의 DataTable로 가져와야합니다. 과거에 다른 사람들이 어떻게 처리했는지 궁금합니다. XML에서 수동으로 이름을 변경 했습니까? 일시적으로 데이터 테이블 이름을 변경 했습니까? 또는 DataTable의 READXML 메서드를 사용하려는이 이슈를 둘러싼 또 다른 좋은 방법이 있습니까?

+0

샘플 코드는 이제 기록했다. 이 문제를 해결하는 방법에 대한 의견이 있으십니까? – user7003495

답변

0

오케이 - 저는 이것을 가지고 놀았으며 해결책을 가지고 있습니다. 그것이 최고라고 확신하지 못합니다. (그리고 어떻게하면 좋을지에 대한 의견을 보내 주시면 감사하겠습니다.)

기본적으로 XML을 문자열 판독기에 쓰면 스키마 및 레코드 요소의 테이블 이름이 변경됩니다. <>와 태그 모두
그 다음에 내가 그것을 읽을 때 - 나는 그 반대로 - 기본적으로 파일을 문자열로 읽어야한다 - 그런 다음 모든 테이블 이름을 내가 필요한 것으로 다시 바꾼다. 그런 다음 파일을 디스크 (임시 파일)에 기록한 다음 ReadXML 메서드를 사용하여 해당 임시 파일을 읽고 파일을 삭제해야했습니다. 문자열 판독기가있는 ReadXML이 작동하지 않는 이유는 확실합니다 (유효한 매개 변수 인 것 같습니다). 그러나 READXML 메서드 및 문자열 판독기에 문제가 있음을 알 수있는 몇 가지 게시물을 발견 했으므로 간단히 썼습니다. 파일을 읽고 READXML을 파일 이름과 함께 사용하면 제대로 작동합니다.

다른 사람들에게 도움이되기를 바랍니다. '가장 좋은'해결책이 아니더라도 다른 사람이 개선 할 수 있기를 바랍니다.

쓰기 XML

// Write XML 
StringWriter sw = new StringWriter(); 
ResultDT.WriteXml(sw, XmlWriteMode.WriteSchema); 
string OutputXML = sw.ToString(); 
// now replace the Table Name 
OutputXML = OutputXML.Replace("<" + ResultDT.TableName + ">", "<" + "ExportTable" + ">"); 
OutputXML = OutputXML.Replace("</" + ResultDT.TableName + ">", "</" + "ExportTable" + ">"); 
OutputXML = OutputXML.Replace("MainDataTable=\"" + ResultDT.TableName + "\"", "MainDataTable=\"" + "ExportTable" + "\""); 
OutputXML = OutputXML.Replace("name=\"" + ResultDT.TableName + "\"", "name=\"" + "ExportTable" + "\""); 
System.IO.File.WriteAllText(fileName, OutputXML); 

읽기 XML

// Read XML 
InputXML = System.IO.File.ReadAllText(fileName); 
// now replace the Table Name 
InputXML = InputXML.Replace("<" + "ExportTable" + ">", "<" + ResultTable.TableName + ">"); 
InputXML = InputXML.Replace("</" + "ExportTable" + ">", "</" + ResultTable.TableName + ">"); 
InputXML = InputXML.Replace("MainDataTable=\"" + "ExportTable" + "\"", "MainDataTable=\"" + ResultTable.TableName + "\""); 
InputXML = InputXML.Replace("name=\"" + "ExportTable" + "\"", "name=\"" + ResultTable.TableName + "\""); 
string TempFileName = "TempDumpFile.idt"; 
System.IO.File.WriteAllText(TempFileName, InputXML); 
ResultTable.ReadXmlSchema(TempFileName); 
ResultTable.ReadXml(TempFileName); 
System.IO.File.Delete(TempFileName);