2012-05-28 38 views
0

我重新设计了我的项目3次,最后想到在我的应用程序变得太过失控之前我会问。我正在构建一个复杂的系统监控和报告生成应用程序。我一直在努力弄清楚哪种数据库方法最适合我的情况,我认为它是SQL Server CE,因为我在一台工作笔记本电脑上,可能需要长达一周的时间才能安装它。如果有更友好的应用程序,我应该使用,我愿意提供建议。使用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字段,每插入一条记录就会增加一个。表中的每个其他字段都设置为允许空值是,唯一号和主键号。我也使用PHP编程,并且可以在任何字段上设置索引,但是我一直无法找到在DB Explorer中设置字段索引的方法。 – user1420914

回答

0

您是否听说过数据库规范化?这避免了数据的重复,并减少了每个INSERT所需的列数。如果没有CommitMode,这个过程也会运行得更快。最后,您可以使用SqlCeUpdateRecord和TableDirect绕过查询处理程序进行快速插入。

+0

感谢您的回复!我没有听说过db规范化,但我今天会在网上搜索它,看看我能找到什么东西! – user1420914

相关问题