본문 바로가기
→ 개발/C#

[C#] DATASET XML저장 및 불러오기

by 벅스쭌 2013. 9. 24.
반응형

 

운영체제 : Windows7 64-bit

프로그램 및 버전 : VisualStudio2010

※ 주의사항

 주의사항 없음당

 

1. 작업개요

 2개의 동일 DB가 있고 나는 한쪽에있는 특정테이블을 다른한쪽에 있는 같은 테이블에 데이터를 복사하고 싶었다.

 

 

 

 

2. 작업내용

1) DB에 접속하여 DataSet으로 데이터 불러오는 함수 만들기

 

       public DataSet LoadDataSetData(string connectionString)         {             OleDbConnection connection = null;             OleDbDataAdapter adapter = null;             DataSet tmpDataSet = new DataSet();             try             {                 DataTable tmpDataTable = new DataTable();                 tmpDataTable.TableName = "테이블1명";                 connection = new OleDbConnection(connectionString);                 connection.Open();                 adapter = new OleDbDataAdapter("select * from 테이블1명", connection);                 adapter.Fill(tmpDataTable);                 tmpDataSet.Tables.Add(tmpDataTable);                 adapter = new OleDbDataAdapter("select * from 테이브2명", connection);                 tmpDataTable = new DataTable();                 tmpDataTable.TableName = "테이블2명";                 adapter.Fill(tmpDataTable);                 tmpDataSet.Tables.Add(tmpDataTable);             }             catch (Exception err)             {             }             finally             {                 if (adapter != null)                 {                     adapter.Dispose();                 }                 if (connection != null)                 {                     connection.Close();                     connection.Dispose();                 }             }             return tmpDataSet;         }

 

 아주 혹시 몰라. 넘기는 ConnectionString...은 요런것

                if (DBConnector.Open(ip, sid, userid, userpw, out oleDb))
                {
                    labCentStatus.Text = "성공";
                    labCentStatus.ForeColor = Color.Green;
 
                    centConnectionString = "Provider= " + "MSDAORA.1" + ";" +
                            "PLSQLRSet=1;" +
                            "Data Source = (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" +
                            ip + ")(PORT=" + 1521 + ")))" +
                            "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=" + sid + "))); " +
                            "User Id = " + userid + "; Password = " + userpw + ";";
 
                    tbxPw.Enabled = true;
                    btnRecover.Enabled = true;
                }

- 이런식으로 해서 나는 테이블1과 테이블2를 tmpataSet에 넣어주었다.

 

2) XML파일로 떨구는 함수 만들기

 
        public bool WriteXmlData(string xmlFilePath, string xmlFileName, DataSet tmpDataSet)
        {
            bool isOk = false;
            try
            {
                DirectoryInfo di = new DirectoryInfo(xmlFilePath);
                if (di.Exists == false)
                {
                    di.Create();
                }
                tmpDataSet.WriteXml(xmlFilePath + xmlFileName, XmlWriteMode.WriteSchema);
 
                isOk = true;
            }
            catch (Exception err)
            {
                isOk = false;
            }
            return isOk;
        }

- 여기서 포인트는 tmpDataSet.WriteXml(xmlFilePath + xmlFileName, XmlWriteMode.WriteSchema); 에서 XmlWriteMode.WriteSchema 부분이다.

DataSet에서는 Update라는 함수를 사용해서 변경된 정보를 DB에 저장할 수 있다고 했는데. 나같은경우에는 A에 있는 DB테이블데이터를 B DB로 옮기는 작업이라서 그런지 Update가 죽어라 안되었다. 그래서 내가 생각한 것은... 일단 DataSet으로 불러와 XML로 떨구고 XML로 떨군걸 다시 불러와 무분별한 Foreach로 Insert를 하는 것 이었다.
근데... 문제는 만일 옮기려는 테이블에 a,b,c라는 컬럼이 있고 3개의 Row값이 있다고 치자. 근데 b컬럼의 값이 null 이라면 위에서 언급한 XmlWriteMode.WrieSchema를 쓰지않으면 생성된 XML에서 b컬럼에 대한 정보는 저장이 되지 않고 그러다보니 다시 불러와서 insert into를 하게 될 때 누락된 표현식이라는 ORA메시지를 뿌려준다.

*tmpDataSet.WriteXmlSchema()를 제공하여 DB스키마도 저장을 할 수 있기는 하지만 나중에 불러올 때 스키마를 죽어라 불러와도 위와같은 문제가 계속 발생하였다.

 

3) XML불러오는 함수 만들기

 
                DataSet tmpDataSet = new DataSet();
 
                tmpDataSet.ReadXml(xmlFilePath);

 - 실질적으로 Write하는 부분도 간단하기는 하지만 Read하는 부분도 엄청 간단하다.

 

3. 작업결과

 뭐라 주저리 주저리 써놓기는 했지만 분명 누군가는 나같은 문제가 발생할 것이므로... 끄적끄적

 

※ 참고 사이트

 참고 : www.happytomorrow.net

 위 사이트를 참고 하였습니다.

 

 

 

반응형