데이터셋->MDB (MDB생성, 열기, 레코드셋이용, 압축) - C#
프로그램/c# dataset 2009. 2. 25. 17:46 |계속 데브피아에서 도움만 받기에 그동안의 고마운 마음을 담아,
허접한 자료이지만 데브피아에서 얻은 자료와 개인적으로 알아낸 방법들을 모아서 MDB사용하는데 어려움을 느끼시는 분들을 위해 올립니다.
흑흨~ 이거 알아 내는데 너무도 많은 시간이 결렸습니당~
처음엔 데이터를 엑셀로 옮겨서 사용했었는데, 옮기는 시간이.. 장난이 아니더군요, DAO를 사용하면 엄청난 속도 향상을 느끼실 수 있을 겁니다.
다량의 데이터를 사용하실 때는 MDB로 옮겨서 엑셀로 보내는 것이 정신건강상 유리할듯 ㅎ~
먼저 DAO를 이용했기 때문에 DAO를 참조하고, 나중에 압축할 것이기 때문에 JDO도 참조하셔야 합니다.
그리고 임시파일을 제거할 때 IO를 사용하기 때문에, DAO가 소문자로 참조되었기 때문에 개인적으로 불편해서 넣은 코드인
using System.IO;
using DAO = dao;
를 넣어줘야 합니다.
아래 부터 코드입니다. 현재 작업중인 관계로 원본 코드 그대로 올리니, 이해바랍니당~ ㅋㅋ~
string mdbName = "분석자료";
string 원본mdb = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\" + mdbName + ".mdb";
string 임시mdb = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\" + "tmpdb" + ".mdb";
DAO.DBEngineClass db = new DAO.DBEngineClass();
DAO.Workspace dbw = db.Workspaces[0];
DAO.Database db1;
//MDB 생성
dbw.CreateDatabase(임시mdb, DAO.LanguageConstants.dbLangKorean, DAO.DatabaseTypeEnum.dbVersion40);
//MDB 열기
db1 = dbw.OpenDatabase
(임시mdb, DAO.DatabaseTypeEnum.dbVersion40, (object)false, DAO.LanguageConstants.dbLangKorean);
//테이블 생성
DAO.TableDef dt = db1.CreateTableDef("T인력분석",Type.Missing,Type.Missing,Type.Missing);
DAO.Field df = dt.CreateField("ID_인력분석",DAO.DataTypeEnum.dbLong,4);
df.Attributes = 17; //중요! 해당 필드를 일련번호로 만듬
dt.Fields.Append(df);
for(int i=0; objds자봉자료.T인력분석.Columns.Count -1 >= i; i++)
{
if((objds자봉자료.T인력분석.Columns[i].ColumnName.ToString() != "") && (objds자봉자료.T인력분석.Columns[i].ColumnName != "ID_인력분석"))
{
string 필드이름 = objds자봉자료.T인력분석.Columns[i].ColumnName.ToString();
DAO.Field df1 = dt.CreateField(필드이름,DAO.DataTypeEnum.dbText,50);
df1.AllowZeroLength = true;
df1.Required = false;
dt.Fields.Append(df1);
}
}
db1.TableDefs.Append(dt);
//인덱스 생성
DAO.Index di = dt.CreateIndex("ID");
di.Fields = "ID_인력분석";
di.Primary = true;
db1.TableDefs["T인력분석"].Indexes.Append(di);
dao.Recordset rs =
db1.TableDefs["T인력분석"].OpenRecordset(dao.RecordsetTypeEnum.dbOpenDynaset,dao.RecordsetOptionEnum.dbDenyWrite);
for(int ii = 0; objds자봉자료.T인력분석.Count-1 >= ii; ii++)
{
rs.AddNew();
for(int i=0; objds자봉자료.T인력분석.Columns.Count -1 >= i; i++)
{
if(objds자봉자료.T인력분석.Columns[i].ColumnName != "ID_인력분석")
{
rs.Fields[i].Value = objds자봉자료.T인력분석[ii][i].ToString();
}
}
rs.Update(1,false); //이거 알아내느라 또 몇시간 보냄 위에서 오픈할때의 타입과 연관있음.
}
//사용했던것 모두 닫습니다. 안닫으면 압축할때 에러납니다.
rs.Close();
db1.Close();
dbw.Close();
rs = null;
db1 = null;
dbw = null;
db = null;
//MDB 압축하기 강좌에 있는 TIP 그대로 배꼈습니다.
JRO.JetEngineClass jro = new JRO.JetEngineClass();
jro.CompactDatabase("Provider=Microsoft.jet.OLEDB.4.0;Data Source=" + 임시mdb,"Provider=Microsoft.jet.OLEDB.4.0;Data Source=" + 원본mdb);
//임시 파일이 남아있으면 나중에 다시 압축할 때 에러납니다. (지금까지 작업했던 임시mdb가 임시파일임)
FileInfo ff = new FileInfo(임시mdb);
ff.Delete();
MessageBox.Show("완료되었습니다.");
이상입니다.
허접한 코드이지만 용기내서 올려봅니다.