C#の問題:何が最も簡単な方法んの負荷。MDBファイルを変更して変更を保存し、元のファイルとは何ですか?

StackOverflow https://stackoverflow.com/questions/518239

質問

私のプロジェクトまたはほぼ終了しました。私の荷重。MDBファイルコンテンツを表示するには、開発を維持-管理とそうとしていることをアピールし機関もしくは地方公共団体又はその開発を維持-管理および保存します。MDBファイルです。私もつくっていくのできる機能は無く、テーブルから。MDBファイルに保存してください。MDBファイルです。もちろん、きなことができないのでよいのか、変更を保存してください戻します。MDBファイルです。

私はGoogle広くありません答えは私の質問です。私も初心者でこの特定のトピックではないでくださいに答え複雑すぎて--さんありがとうございます。も簡単な方法を編集す。MDBファイル!ご提供プログラム例.

  1. そん貴重な機会となった接続開発を維持-管理。どうやっていけばいいですか?に化されたコードを生成するための開発を維持-管理?Imくは簡単なのに十分な答えです。
  2. そして知る必要があるい落とすことができますDatatable、データセットになったからその後そのデータセット、書き換えます。MDBファイルです。(ある場合のみに挿入し、テーブルを変更しまうとのこと。)

よろしくお願いししょうが、知ることができます。これは最終のものに思えについて聞かせていただこのトピック...ございます。

編集:

きます。mdbんで Microsoft Accessデータベースです。 (Iビーチに位置しても知があります。mdbファイル)

知っていませんに直接書き込みます。MDBファイルを介してstreamwriterは何があるので、私はここで発生する。MDBファイルのデータセットの情報をいですか?やはりそのようなことができまテーブルを追加す。MDBファイルまで積み込みの開発を維持-管理。あります。

再び、私は必要ないというこ プログラム クライアントまで、フルのC#.

編集:

でも大丈夫、自分らしいプロジェクトはかなり大きなものを使用してい別のクラスファイルすべてに対処するためのデータベースに接続します。私は知ってい設計とソースが加減だが、女将が切り盛りしているこの店の作成"にチェックを入れます。私の実現に取り組むこととし、事例を見たいのは、インターネット。

思いつなぐだけで簡単に開発を維持-管理を別の形式です。私の知りたい場合は自分のコードの開発を維持-管理形(あまりないと思いますなぜかについて知る必要がありそう。DatabaseHandling.csを取り扱2.MDBファイルです。いくつのデータセットにあります。私はこれをテーブルからデータセットおよびその他のデータセットである。うめどに保存しこれらの値に戻す。MDBファイルです。

直しとかは出来ないんですかるのか?ここではその方...

編集:

らんどろ風mikiモデルを作ってみ調査を読む...と思い答えは、右下まったと言われています。の"Update()"コマンドを実行します。今こはル-キャピタルー過疎-中間-過するにあたりのgdpの簡単ないということが、左の問題としていません-罪深-ヒンの使いかたこの更新コマンドです。

恐らくできるセットでこのように:

Oledb.OledbConnection cn = new Oledb.OledbConnection(); 
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Staff.mdb"; 
Oledb.OledbCommand cmd = new Oledb.OledbCommand(cn); 
cmd.CommandText = "INSERT INTO Customers (FirstName, LastName) VALUES (@FirstName, @LastName)"; 

ると思いあいだに手動で挿入します。したいと思い両替り:

  • 情報が変更に開発を維持-管理および更新にアクセスデータベースファイル(.mdb)から
  • 作成機能したというテーブルからもアクセスデータベースファイル(.mdb)に置き換えて二次アクセスデータベースファイル(.mdb).両方のファイルして大文字と小文字を正確に同じ構造に参加することによって異なる情報です。

私は誰かが出てくる回答のためにこ---私のプロジェクトはすべて終わるのを待っては簡単に答えます。

いただき誠にありがとうございます。

編集:

でも大丈夫...。私は今どのようにクエリは、.mdbファイルの中身そのものになっていました。).こちらのコードは、動作しないで実行時エラーにより、sqlコマンドを思うとします。すなわち私た。

新しい機能コードを追加DatabaseHandling.cs:

static public void performSynchronization(string table, string tableTwoLocation)
{
    OleDbCommand cmdCopyTables = new OleDbCommand("INSERT INTO" + table + "SELECT * FROM [MS Access;" + tableTwoLocation + ";].[" + table + "]"); // This query generates runtime error
    cmdCopyTables.Connection = dataconnectionA;
    dataconnectionA.Open();
    cmdCopyTables.ExecuteNonQuery();
    dataconnectionA.Close();
}

ご覧の通り、私は実際に管理を実行するクエリの接続自体をまとめていきたいと思いる。MDBファイルです。と言ったものの、SQLクエリか実行ファイルになれる実行時エラーで使用できるようにします。

のコマンドとして実行されるテーブルから。MDBファイルの上書きのテーブルと同じタイプの異なる。MDBファイルです。のSQLコマンドしようとすると上記のために直接アクテーブルから。mdbファイルを直接置いているか--こなしたいと思います。いすべての情報をするために設計されています。MDBファイル--のテーブルへのDatatableを追加して全てのDatatablesへのデータセット(います。) こういう仕事がしたい。MDBファイルです。一度うまくいきませんのデータセットに取り組みたい特定のテーブル各データセットについて楽しく学び、それぞれのファイルのようになります:

  • DataSetA>>>>----- [テーブルを追加す (上書きしてい)] ----->>>> DataSetB
  • DataSetB>>>>----- [テーブルを追加す (上書きしてい)] ----->>>> DataSetA

したいと思い者各データセットに入ったとしたら、それぞ。MDBファイルから.基本的に維持の両方のデータベースを同期させます。

その後、私の質問を修正は:

  1. の作成方法を教えてくださいSQLクエリーテーブルになります。MDBファイルに書き換えることで、既存の同名です。クエリをできることに動的に生成された時のランタイム配列を置き換えたにもかかわら変数のテーブル名を付け加えておきたい.
  2. どのように変化するための開発を維持-管理にDataTableしに戻DataTable(またはデータセット)で送付します。MDBファイルとは何ですか?

私た精巧などから---と思いませんexplaing私の課題です。現在この問題はwayyy長すぎます。かってしまいまして説明しています。:[

編集:

へのユーザーの以下のと思うんでほとんどが固定のキーワード ほとんど.こちらは自更新DatabaseHandling.csコードします。を取得します実行時のエラーあり"のデータ型のミスマッチ." あまりないと思いますを知ることが可能であることを考慮しいコピーこれらのテーブルを他のデータベースと全く同じ設定します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;
using System.IO;

    namespace LCR_ShepherdStaffupdater_1._0
    {
        public class DatabaseHandling
        {
            static DataTable datatableB = new DataTable();
            static DataTable datatableA = new DataTable();
            public static DataSet datasetA = new DataSet();
            public static DataSet datasetB = new DataSet();
            static OleDbDataAdapter adapterA = new OleDbDataAdapter();
            static OleDbDataAdapter adapterB = new OleDbDataAdapter();
            static string connectionstringA = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Settings.getfilelocationA();
            static string connectionstringB = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Settings.getfilelocationB();
            static OleDbConnection dataconnectionB = new OleDbConnection(connectionstringB);
            static OleDbConnection dataconnectionA = new OleDbConnection(connectionstringA);
            static DataTable tableListA;
            static DataTable tableListB;

            static public void addTableA(string table, bool addtoDataSet)
            {
                dataconnectionA.Open();
                datatableA = new DataTable(table);
                try
                {
                    OleDbCommand commandselectA = new OleDbCommand("SELECT * FROM [" + table + "]", dataconnectionA);
                    adapterA.SelectCommand = commandselectA;
                    adapterA.Fill(datatableA);
                }
                catch
                {
                    Logging.updateLog("Error: Tried to get " + table + " from DataSetA. Table doesn't exist!");
                }

                if (addtoDataSet == true)
                {
                    datasetA.Tables.Add(datatableA);
                    Logging.updateLog("Added DataTableA: " + datatableA.TableName.ToString() + " Successfully!");
                }

                dataconnectionA.Close();
            }

            static public void addTableB(string table, bool addtoDataSet)
            {
                dataconnectionB.Open();
                datatableB = new DataTable(table);

                try
                {
                    OleDbCommand commandselectB = new OleDbCommand("SELECT * FROM [" + table + "]", dataconnectionB);
                    adapterB.SelectCommand = commandselectB;
                    adapterB.Fill(datatableB);
                }
                catch
                {
                    Logging.updateLog("Error: Tried to get " + table + " from DataSetB. Table doesn't exist!");
                }



                if (addtoDataSet == true)
                {
                    datasetB.Tables.Add(datatableB);
                    Logging.updateLog("Added DataTableB: " + datatableB.TableName.ToString() + " Successfully!");
                }

                dataconnectionB.Close();
            }

            static public string[] getTablesA(string connectionString)
            {
                dataconnectionA.Open();
                tableListA = dataconnectionA.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
                string[] stringTableListA = new string[tableListA.Rows.Count];

                for (int i = 0; i < tableListA.Rows.Count; i++)
                {
                    stringTableListA[i] = tableListA.Rows[i].ItemArray[2].ToString();
                }
                dataconnectionA.Close();
                return stringTableListA;
            }

            static public string[] getTablesB(string connectionString)
            {
                dataconnectionB.Open();
                tableListB = dataconnectionB.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" });
                string[] stringTableListB = new string[tableListB.Rows.Count];

                for (int i = 0; i < tableListB.Rows.Count; i++)
                {
                    stringTableListB[i] = tableListB.Rows[i].ItemArray[2].ToString();
                }
                dataconnectionB.Close();
                return stringTableListB;
            }

            static public void createDataSet()
            {

                string[] tempA = getTablesA(connectionstringA);
                string[] tempB = getTablesB(connectionstringB);
                int percentage = 0;
                int maximum = (tempA.Length + tempB.Length);

                Logging.updateNotice("Loading Tables...");
                for (int i = 0; i < tempA.Length ; i++)
                {
                    if (!datasetA.Tables.Contains(tempA[i]))
                    {
                        addTableA(tempA[i], true);
                        percentage++;
                        Logging.loadStatus(percentage, maximum);
                    }
                    else
                    {
                        datasetA.Tables.Remove(tempA[i]);
                        addTableA(tempA[i], true);
                        percentage++;
                        Logging.loadStatus(percentage, maximum);
                    }
                }

                for (int i = 0; i < tempB.Length ; i++)
                {
                    if (!datasetB.Tables.Contains(tempB[i]))
                    {
                        addTableB(tempB[i], true);
                        percentage++;
                        Logging.loadStatus(percentage, maximum);
                    }
                    else
                    {
                        datasetB.Tables.Remove(tempB[i]);
                        addTableB(tempB[i], true);
                        percentage++;
                        Logging.loadStatus(percentage, maximum);
                    }
                }


            }

            static public DataTable getDataTableA()
            {
                datatableA = datasetA.Tables[Settings.textA];

                return datatableA;
            }
            static public DataTable getDataTableB()
            {
                datatableB = datasetB.Tables[Settings.textB];
                return datatableB;
            }

            static public DataSet getDataSetA()
            {
                return datasetA;
            }

            static public DataSet getDataSetB()
            {
                return datasetB;
            }

            static public void InitiateCopyProcessA()
            {
                DataSet tablesA;
                tablesA = DatabaseHandling.getDataSetA();

                foreach (DataTable table in tablesA.Tables)
                {
                    CopyTable(table, connectionstringB);
                }
            }

            public static void CopyTable(DataTable table, string connectionStringB)
            {
                var connectionB = new OleDbConnection(connectionStringB);
                foreach (DataRow row in table.Rows)
                {
                    InsertRow(row, table.Columns, table.TableName, connectionB);
                }
            }

            public static void InsertRow(DataRow row, DataColumnCollection columns, string table, OleDbConnection connection)
            {
                var columnNames = new List<string>();
                var values = new List<string>();

                for (int i = 0; i < columns.Count; i++)
                {
                    columnNames.Add("[" + columns[i].ColumnName + "]");
                    values.Add("'" + row[i].ToString().Replace("'", "''") + "'");
                }

                string sql = string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
                        table,
                        string.Join(", ", columnNames.ToArray()),
                        string.Join(", ", values.ToArray())
                    );

                ExecuteNonQuery(sql, connection);
            }

            public static void ExecuteNonQuery(string sql, OleDbConnection conn)
            {
                if (conn == null)
                    throw new ArgumentNullException("conn");

                ConnectionState prevState = ConnectionState.Closed;
                var command = new OleDbCommand(sql, conn);
                try
                {
                    prevState = conn.State;
                    if (prevState != ConnectionState.Open)
                        conn.Open();

                    command.ExecuteNonQuery(); // !!! Runtime-Error: Data type mismatch in criteria expression. !!!
                }
                finally
                {
                    if (conn.State != ConnectionState.Closed
                        && prevState != ConnectionState.Open)
                        conn.Close();
                }
            }

            }          
        }

なぜ私はこの映画に影響をうけました。両方のテーブルも全く同じです。なぜですか?最悪の場合には、どうやって削除は、テーブルのその他のアクセス。MDBファイルを挿入する前に全く同じ構造を持つテーブルの異なる値です。

男済ませておきたかっただけのフィギュアに出---

編集:

大丈夫、私の一部です。私の質問は殊には、このように値を求められている為.私は私の質問の答えとしてしか実行のクエリに直接接続しています。ありがとうございました。

役に立ちましたか?

解決

だから頂いたものの場合オクタコサノールはドラッグ&ドロップ操作するために席を強く型データセットが接続を使用して、ドラッグドロップのデータソースをTool"ウィンドウが表示されたVisual Studio.

あのエサンプルがなされる前に実行されます。

  1. 新しいデータセット
  2. ドラッグ&ドロップからDataConnectionツリーをサーバー Explorer
  3. 新しい形
  4. をドラッグすると、以下のようなテーブルからデータソースをツール
  5. ウィンドウの形式です。
  6. 出来上がり

更新:

最初に、私は100%理解しています。きをLinkTablesとの間でのファイルにアクセスとすることになり、そのままコピーしたデータのファイルのsql文を使用してい挿入をお選びのお客様名、姓からFile2.お客様の'.あなオプションに行きたいというニーズがとれなかっループのDataTables挿入し、手動でデータをINSERT同様、最後に編集できるようになります。としての開発を維持-管理までを追跡していただきました変更を監視するRowChangedイベント(いにある正確なイベント)のもの挿入/更新の諸表の列に変わります。

更新:

ループのdatatableまうようなものです。ません。私だけこのMakeValueDbReadyます。この試験は行っておりませんかやさんが私のすべての場合もすべての場合を修正。だってデバッグのsql文としてください発生を右の値です。各データベースのハンド価値とは異なります。◎この値解析を抽出します。また、その代わりにハード符号化のTableName対応することができるでしょうくらいの物件でDataTable

void CopyTable(DataTable table, string connectionStringB)
{
    var connectionB = new OleDbConnection(connectionStringB);
    foreach(DataRow row in table.Rows)
    {
        InsertRow(row, table.Columns, table.TableName, connectionB);
    }
}

public static void InsertRow(DataRow row, DataColumnCollection columns, string table, OleDbConnection connection)
{
    var columnNames = new List<string>();
    var values = new List<string>();

    // generate the column and value names from the datacolumns    
    for(int i =0;i<columns.Count; i++)
    {
        columnNames.Add("[" + columns[i].ColumnName + "]");
        // datatype mismatch should be fixed by this function
        values.Add(MakeValueDbReady(row[i], columns[i].DataType));
    }

    // create the sql
    string sql = string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
            table,
            string.Join(", ", columnNames.ToArray()),
            string.Join(", ", values.ToArray())
        );

    // debug the accuracy of the sql here and even copy into 
    // a new Query in Access to test
    ExecuteNonQuery(sql, connection);
}

// as the name says we are going to check the datatype and format the value
// in the sql string based on the type that the database is expecting
public string MakeValueDbReady(object value, Type dataType)
{
    if (value == null)
        return null;

    if (dataType == typeof(string))
    {
        return "'" + value.ToString().Replace("'", "''") + "'"
    }
    else if (dataType == typeof(DateTime))
    {
        return "#" + ((DateTime)value).ToString + "#"
    }
    else if (dataType == typeof(bool))
    {
        return ((bool)value) ? "1" : "0";
    }

    return value.ToString();
}

public static void ExecuteNonQuery(string sql, OleDbConnection conn)
{
    if (conn == null)
        throw new ArgumentNullException("conn");

    ConnectionState prevState = ConnectionState.Closed;
    var command = new OleDbCommand(sql, conn);
    try
    {
        // the reason we are checking the prev state is for performance reasons
        // later you might want to open the connection once for the a batch
        // of say 500 rows  or even wrap your connection in a transaction.
        // we don't want to open and close 500 connections
        prevState = conn.State;
        if (prevState != ConnectionState.Open)
            conn.Open();

        command.ExecuteNonQuery();
    }
    finally
    {
        if (conn.State != ConnectionState.Closed
            && prevState != ConnectionState.Open)
            conn.Close();
    }
}

他のヒント

更新のMDBファイルの変更 のデータセット の開発を維持-管理、そんなもんでしょUIのデータセット)だけを使用 DataAdapter.更新 コマンドです。

移動テーブルからの1のビットtrickier.の場合はテーブルが存在しなの目的地を作る必要があります SQL CREATEステートメント.その後、 DataAdapter.入 データセットからの .ループを通じて、各行に設定しの状態RowAddedを呼び出し DataRow.SetAdded.その後、通過できるDataAdapter.更新から 行先 データベースです。

編集: コードは次の問題....

.MDB拡張子を持つファイルの複数のフォーマットが実際にあります。私は間違ったものを推測するのであれば、これは間違った答えになります。しかし、それは、Microsoft Accessの問題のように聞こえるます。

あなたはMDBファイルに直接書き込みません。彼らは暗号化され、圧縮されています。 MDBファイルを変更する最も簡単な方法は、アクセスを通してそれをロードし、提供された方法によってテーブルをコピーすることです。

どのようにデータベース(.mdbファイル)に接続していますか?あなたはいくつかのサンプルコードを投稿してもらえますか?あなたが任意のSQL操作よりも、正しくそれに接続している場合は、それが自動的にデータベースに保存する必要がありますに対して実行します。

あなたはなど、あなたがデータを取得/更新/挿入し、テーブルを作成するSQLを実行することができ、データベースに接続した後ので手で.MDBファイルを作成しようとすることはお勧めできません。

ここでは一例です。

http://www.java2s.com/Code /CSharp/Database-ADO.net/Access.htmする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top