2012-05-28 2 views
0

프로젝트를 3 번 ​​다시 디자인했으며 응용 프로그램이 너무 많이 작동하기 전에 요청할 것이라고 생각했습니다. 복잡한 시스템 모니터링을 구축하고 응용 프로그램을 생성하는 중입니다. 필자는 상황에 가장 적합한 데이터베이스 방법을 찾아 내려고 노력해 왔으며 SQL Server CE라고 생각합니다. 업무용 랩톱에 설치되어있어 물건을 설치하는 데 최대 1 주가 걸릴 수 있기 때문입니다. 좀 더 친숙한 응용 프로그램을 사용해야한다면 제안을 할 수 있습니다.SQL Server CE를 사용하여 데이터베이스에 삽입

SQL Server CE를 사용한다고 가정하면 많은 열이있는 .sdf 파일에 레코드를 삽입하는 가장 좋은 방법은 무엇입니까? 예를 들어 DB의 테이블에는 100 개의 열이 포함될 수 있습니다. 그것은 지금처럼 잘 작동하지만 삽입 된 모든 행에 약 1 초가 걸리는 것으로 보입니다.

이 상황을 바탕으로
con.Open(); 

SqlCeTransaction trans = con.BeginTransaction(); 

String insertRecord = "INSERT INTO AS400_Objects(projectName, obBuildObjectName, " + 
        "obBuildLibrary, obBuildType, obBuildExtendedAttribute, obBuildFormatLevel, " + 
        "obBuildUserAttribute, obBuildChangeDate, obBuildCreationDate, " + 
        "obBuildCreatorSystem, obBuildCreatorUserProfile, obBuildJournal, " + 
        "obBuildJournalStatus, obBuildLastUsedDate, obBuildObjectSize, obBuildOwner, " + 
        "obBuildRestoreDate, obBuildSaveDate, obBuildSourceFile, " + 
        "obBuildSourceFileUpdatedDate, obBuildTextDescription, obBuildSystemVersion)" + 
        "VALUES(@projectName, @obBuildObjectName, @obBuildLibrary, @obBuildType, " + 
        "@obBuildExtendedAttribute, @obBuildFormatLevel, @obBuildUserAttribute, " + 
        "@obBuildChangeDate, @obBuildCreationDate, @obBuildCreatorSystem, " + 
        "@obBuildCreatorUserProfile, @obBuildJournal, @obBuildJournalStatus, " + 
        "@obBuildLastUsedDate, @obBuildObjectSize, @obBuildOwner, @obBuildRestoreDate, " + 
        "@obBuildSaveDate, @obBuildSourceFile, @obBuildSourceFileUpdatedDate, " + 
        "@obBuildTextDescription, @obBuildSystemVersion)"; 

SqlCeCommand cmd = new SqlCeCommand(insertRecord, con); 
cmd.Transaction = trans; 

cmd.Parameters.Clear(); 
cmd.Parameters.AddWithValue("@projectName", packageName); 
cmd.Parameters.AddWithValue("@obBuildObjectName", od[i].getValue(ObjectDescription.NAME).ToString()); 
cmd.Parameters.AddWithValue("@obBuildLibrary", od[i].getValue(ObjectDescription.LIBRARY).ToString()); 
cmd.Parameters.AddWithValue("@obBuildType", od[i].getValue(ObjectDescription.TYPE).ToString()); 
cmd.Parameters.AddWithValue("@obBuildExtendedAttribute", od[i].getValue(ObjectDescription.EXTENDED_ATTRIBUTE).ToString()); 
cmd.Parameters.AddWithValue("@obBuildFormatLevel", ""); 
cmd.Parameters.AddWithValue("@obBuildUserAttribute", od[i].getValue(ObjectDescription.USER_DEFINED_ATTRIBUTE).ToString()); 
cmd.Parameters.AddWithValue("@obBuildChangeDate", changeDate); 
cmd.Parameters.AddWithValue("@obBuildCreationDate", creationDate); 
cmd.Parameters.AddWithValue("@obBuildCreatorSystem", od[i].getValue(ObjectDescription.CREATOR_SYSTEM).ToString()); 
cmd.Parameters.AddWithValue("@obBuildCreatorUserProfile", od[i].getValue(ObjectDescription.CREATOR_USER_PROFILE).ToString()); 
cmd.Parameters.AddWithValue("@obBuildJournal", od[i].getValue(ObjectDescription.JOURNAL).ToString()); 
cmd.Parameters.AddWithValue("@obBuildJournalStatus", journalStatus); 
cmd.Parameters.AddWithValue("@obBuildLastUsedDate", lastUsedDate); 
cmd.Parameters.AddWithValue("@obBuildObjectSize", od[i].getValue(ObjectDescription.OBJECT_SIZE).ToString()); 
cmd.Parameters.AddWithValue("@obBuildOwner", od[i].getValue(ObjectDescription.OWNER).ToString()); 
cmd.Parameters.AddWithValue("@obBuildRestoreDate", restoreDate); 
cmd.Parameters.AddWithValue("@obBuildSaveDate", saveDate); 
cmd.Parameters.AddWithValue("@obBuildSourcefile", od[i].getValue(ObjectDescription.SOURCE_FILE).ToString()); 
cmd.Parameters.AddWithValue("@obBuildSourceFileUpdatedDate", sourceFileUpdatedDate); 
cmd.Parameters.AddWithValue("@obBuildTextDescription", od[i].getValue(ObjectDescription.TEXT_DESCRIPTION).ToString()); 
cmd.Parameters.AddWithValue("@obBuildSystemVersion", od[i].getValue(ObjectDescription.SYSTEM_LEVEL).ToString()); 

cmd.ExecuteNonQuery(); 
trans.Commit(CommitMode.Immediate); 

cmd.Dispose(); 

con.Close(); 
con.Dispose(); 

, 나는 쿼리의 성능을 향상시키기 위해 할 수있는 일이있다 : 코드는 (결국이있을 것 이상의 열)과 같습니다? 나는 AS400 메인 프레임 세계에서 왔습니다. 1 초가 수천 줄이 아니라 수백 줄을 줄 것입니다. 응용 프로그램의 최종 결과는 어딘을 전송할 출력 파일을 만든 다음 파일을 두 번 클릭하면이 데이터가 모두 원격 시스템에로드됩니다. 나는 SqlCEAdapter을 보았지만, 내 상황에 맞게 사용하는 방법에 대한 좋은 설명을 찾을 수 없었습니다.

미리 감사드립니다.

+0

AS400_Objects에는 몇 개의 인덱스가 있습니까? 정의를 게시 할 수 있습니까? – Dennis

+0

나는 PC 데이터베이스 세계를 배우는 중이라는 것을 인정해야한다. 조금이라도 뒤죽박죽이라면 용서해 보라. :) 저는 Visual Studio 데이터베이스 탐색기를 사용하고 있으며 유일한 유일한 기본 키는 레코드가 삽입 될 때마다 하나씩 증가하는 ID 필드입니다. 테이블의 다른 모든 필드는 nulls yes, unique no 및 primary key no를 허용하도록 설정됩니다. 또한 PHP로 프로그램을 작성하고 모든 필드에 인덱스를 설정할 수 있지만 DB 익스플로러의 필드에 인덱스를 설정할 수있는 방법을 찾지 못했습니다. – user1420914

답변

0

데이터베이스 정규화에 대해 들었습니까? 이렇게하면 데이터 중복을 방지하고 각 INSERT에 필요한 열 수를 줄일 수 있습니다. 이 프로세스는 CommitMode.Immediate 없이도 훨씬 빠르게 실행됩니다. 마지막으로 SqlCeUpdateableRecord 및 TableDirect를 사용하여 빠른 삽입을 위해 쿼리 프로세스를 무시할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다! DB 정규화에 대해 들어 본 적이 없지만 오늘 인터넷에서 검색하여 아무 것도 찾을 수 있는지 확인합니다. – user1420914

관련 문제