1

私たちはこのプロジェクトに取り組んでおり、ある時点で 2 つの別個の Access(mdb) ファイルからのデータを検証する必要があります。この検証では、「主キー」である列に基づいてこの 2 つのファイルのエントリを比較し、他の列の値がファイルから別のファイルに変更されているかどうかを確認します。

私の同僚は、2 つのファイルから Oracle テーブルにデータをインポートするコードを書き、ビュー内で SQL 結合を使用して検証を行いました。

問題は、ファイルのデータが多すぎるため、Oracle テーブルにロードするのに 50 分以上かかることです。

このルーチンを作成するためのより良いアプローチはありますか? すべてのデータをデータベースにインポートせずに?

編集

データをインポートするために使用しているコードは次のとおりです (私が書いたものではありません)。

protected void InsereDadosTemp()
{
    try
    {
        String vMesAno = ReportParameter.ReportData.Parameters.Item("pMesAnoCompetencia").Value;

        Hashtable hashMesAno = new Hashtable();
        hashMesAno.Add(vMesAno, 1);
        hashMesAno.Add(MesAnterior(vMesAno), 2);

        OleDbConnection objConnOracle = new OleDbConnection(ConfigurationManager.ConnectionStrings["Main"].ToString());
        objConnOracle.Open();

        OleDbCommand objCmdPciReport = new OleDbCommand("DELETE FROM ZBRICAGEM", objConnOracle);
        objCmdPciReport.ExecuteNonQuery();

        foreach (DictionaryEntry obj in hashMesAno)
        {
            string vConnectionString = MontaConnectionString(obj.Key.ToString());

            OleDbConnection objConnAccess = new OleDbConnection(vConnectionString);

            objConnAccess.Open();

            OleDbCommand objCmdAccess = new OleDbCommand("SELECT * FROM TEST where EQUIPE NOT IN  ('ONCO', 'DERMA', 'AROMA', 'SOMA', 'IDADE', 'HORMONIO')", objConnAccess);
            OleDbDataReader reader = objCmdAccess.ExecuteReader();
            if (reader.HasRows)
            {
                objCmdPciReport = new OleDbCommand("INSERT INTO ZBRICAGEM (ID_BRICK, BRICK, SETOR, EQUIPE, NOME_POOL, BRICKS_UF, BU, ARQUIVO ) Values (" +
                                                              "BRICKS_SEQ.NEXTVAL, :p1, :p2, :p3, :p4, :p5, :p6, :p7)", objConnOracle);
                objCmdPciReport.CommandType = CommandType.Text;


                while (reader.Read())
                {
                    objCmdPciReport.Parameters.Clear();
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p1", OleDbType.VarChar, 100)).Value = reader["BRICK"];
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p2", OleDbType.VarChar, 100)).Value = reader["SETOR"];
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p3", OleDbType.VarChar, 100)).Value = reader["EQUIPE"];
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p4", OleDbType.VarChar, 100)).Value = reader["NOME_POOL"];
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p5", OleDbType.VarChar, 100)).Value = reader["BRICKS_UF"];
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p6", OleDbType.VarChar, 100)).Value = reader["BU"];
                    objCmdPciReport.Parameters.Add(new OleDbParameter(":p7", OleDbType.VarChar, 100)).Value = Path.GetFileName(objConnAccess.ConnectionString);

                    objCmdPciReport.ExecuteNonQuery();
                }
            }

            objConnAccess.Close();
        }

        objConnOracle.Close();
    }
    catch (Exception ex)
    {
        throw new Exception("Erro durante a importação de Bricagem: " + ex.Message);
    }
}
4

1 に答える 1

0
  • アクセスで 1 つの .mdb を開きます
  • 他のデータベースのテーブルを開いているデータベースにアタッチします ([テーブル] ペインを右クリックし、[テーブルのリンク] を選択するか、プログラムで実行します) 。
  • [クエリ] タブで、比較を行うための新しいクエリを作成します。これは、Oracle で行ったものと似ているはずです。SQL ビューに切り替えて、同じコードを貼り付けることができる場合があります。

これが非常に遅い場合は、両方のファイルを同じハード ドライブにコピーしてみてください。ただし、更新しない場合は、おそらくその必要はありません。何らかの方法で読み取り専用モードでクエリを実行することも検討できます (MSA は .mdb をロックしようとせず、ネットワーク経由で低速になります)。Access は Oracle ほどスマートではないかもしれませんが、独自のデータ形式と単純な結合を備えた適切なものになるでしょう。そして、オラクルへのインポートのドアを吹き飛ばすでしょう。

編集

コメントへの返信:

@FastAl に感謝しますが、Access ファイルを「手動で」操作することはできません。それらはユーザーによって Web サイトのディレクトリにコピーされます。それらと対話する唯一の方法は、C# コードを使用することです。

この方法を活用することはまだ可能かもしれません。リンクされたテーブルのクエリは、速度の鍵となります。

  • コピーする 2 つのアクセス DB のパス/ファイル名を標準化します。Web アップロード コードからこれらの名前を直接書き込むか、ユーザーがネットワーク共有経由でコピーしている場合は、適切な名前を付けるように指示してください。
  • 標準化された名前/場所に配置したデータベースのコピーのテーブルに接続する 3 番目の .mdb を作成します。
  • あなたのC#プログラムでそれを開きます。http://www.connectionstrings.com/access-2007またはhttp://www.connectionstrings.com/accessを参照してください。
  • c# からクエリを実行します (MSAccess を介して 3 番目の .mdb にクエリを作成し、クエリをテーブル名として開くこともできます)。

プログラムから 3 番目の MDB を適切に閉じていることを確認してください。そうしないと、他の 2 つの DB を新しい DB で上書きできず、使用中になります。

C# からのアクセスで、プログラムによってテーブルをリンクすることも可能です。それらを oracle/SQL にリンクすることもできます。ただし、これには process.execute /.Waitforexit を実行し、それらの dbms でスクリプトを実行して処理する必要がある場合があります。たくさんのハック。彼らの「アクセスへのリンク」ドライバーがアクセスよりも高速であることはわかりません。せいぜい「ジェット エンジン」の dll を使用するだけです (推測)。

于 2012-07-19T18:42:21.210 に答える