1

会社の在庫用にリモートの MySQL データベースがあります。在庫データベースは、機器を下請けするすべての場所のマスター データベースです。各施設には独自の在庫があり、四半期ごとの在庫の場合、各場所はラップトップとスキャナーを使用して在庫をスキャンし、マスター データベースに同期する必要があります。

問題は、すべての場所でインターネット アクセスがすぐに利用できるわけではないため、データベースをローカル ファイルにコピーする必要があることです。データベースに同時に接続されるクライアントは 1 つだけであり、各ロケーションのデータベースは比較的小さく、基本的に 7 列の 1000 行未満で構成されているため、同時実行性は問題になりません。

HDでAccessファイルを作成するところまで行きましたが、MSDNから特定のスキーマでファイルを作成する方法や、SELECTステートメントから関連データを上記のデータベースに挿入する方法を実際に推測することはできません. その場でテーブル アダプターを作成し、.NET の組み込みメソッドを使用してデータ転送を行うことを検討していましたが、プログラムで特定のスキーマを使用して MS Access ファイルを作成する方法がまだ見つかりません。誰かが以前にそのような問題に遭遇したことがある場合は、提供できる洞察をいただければ幸いです。基本的に、ローカルに保存する MS Access データベースに SELECT ステートメントの結果をコピーする必要があります。私が用意した他のすべてのコード。

現在、かなり扱いにくいクエリと foreach ループを使用して汚れた作業を行っていますが、おそらくその場で作成されたデータ ソースを使用して、より洗練されたソリューションを望んでいました。

ADOX.Catalog cat = new ADOX.Catalog();

        cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source="+ fileName + ";" + "Jet OLEDB:Engine Type=5");

        string conString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";" + "User Id=admin;Password=;";

        OleDbConnection con = new OleDbConnection(conString);

        con.Open();

        //create command to generate database schema
        OleDbCommand command = new OleDbCommand();
        command.CommandText = @"CREATE TABLE items (
            [category] VARCHAR(16) NOT NULL,
            [manufacturer] VARCHAR(32) NOT NULL,
            [model] VARCHAR(32),
            [description] TEXT NOT NULL,
            [serial_number] VARCHAR(64),
            [barcode] VARCHAR(8) NOT NULL PRIMARY KEY,
            [property] VARCHAR(4) NOT NULL,
            [present] TINYINT
        )";

        command.Connection = con;
        command.ExecuteNonQuery();

        OleDbCommand cmdInsert = new OleDbCommand();
        cmdInsert.CommandText = "INSERT INTO items([category],[manufacturer],[model],[description],[serial_number],[barcode],[property],[present]) VALUES (@cat,@man,@mod,@desc,@ser,@bar,@prop,@pres)";
        cmdInsert.Connection = con;

        foreach (DataRow row in itemsTableAdapter1.GetData())
        {
            cmdInsert.Parameters.AddWithValue("@cat",row.ItemArray[0].ToString());
            cmdInsert.Parameters.AddWithValue("@man", row.ItemArray[1].ToString());
            cmdInsert.Parameters.AddWithValue("@mod", row.ItemArray[2].ToString());
            cmdInsert.Parameters.AddWithValue("@desc", row.ItemArray[3].ToString());
            cmdInsert.Parameters.AddWithValue("@ser", row.ItemArray[4].ToString());
            cmdInsert.Parameters.AddWithValue("@bar", row.ItemArray[5].ToString());
            cmdInsert.Parameters.AddWithValue("@prop", row.ItemArray[6].ToString());
            cmdInsert.Parameters.AddWithValue("@pres", row.ItemArray[7]);
            cmdInsert.ExecuteNonQuery();
            cmdInsert.Parameters.Clear();
        }
        con.Close();
        cat = null;
4

1 に答える 1

0

以前にこれを実行しようとしましたが、新しいAccessDBを作成するには、必要なすべてのテーブルなどを含む既存のデータベースを実際にコピーする必要があることがわかりました。

sqliteを使用できますか? 小さくて安定しており、ほとんどの言語でライブラリを利用できます。クライアントマシン上で好きな構造を作成することができます。

于 2013-01-19T17:57:56.710 に答える