0

私は自分のプロジェクトを 3 回再設計しましたが、最終的に、アプリケーションが手に負えなくなる前に質問することにしました。複雑なシステム監視とレポート生成アプリケーションを構築しています。私は自分の状況に最適なデータベース方法を見つけようとしてきましたが、SQL Server CE だと思います。仕事用のラップトップを使用しているため、インストールに最大 1 週間かかることがあります。もっとフレンドリーなアプリケーションを使用する必要がある場合は、提案をお待ちしています。

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が、自分の状況に合わせて使用​​する方法についての適切な説明を見つけることができませんでした。

前もって感謝します!

4

1 に答える 1

0

データベースの正規化について聞いたことがありますか? これにより、データの重複が回避され、各 INSERT に必要な列の数が減少します。このプロセスは、CommitMode.Immediate を使用しなくても、はるかに高速に実行されます。最後に、SqlCeUpdateableRecord と TableDirect を使用してクエリ プロセッサをバイパスするか、高速挿入を行うことができます。

于 2012-05-28T06:55:46.973 に答える