1

SQLite データベース間でデータを移動するコンソール アプリケーションを作成しています。接続のクラスとさまざまな準備済みステートメントは IDisposable を実装しているため、次のusingようにブロックを使用してこれらのオブジェクトをインスタンス化しています。

using (SQLiteConnection sqlite_conn = new SQLiteConnection(connectionString))
{
    sqlite_conn.Open();
    using (SQLiteCommand sqlite_cmd = new SQLiteCommand())
    {
        sqlite_cmd.Connection = sqlite_conn;
        sqlite_cmd.CommandText = "INSERT INTO SOMETHING SOMETHING;";
        sqlite_cmd.ExecuteNonQuery();
    }
    sqlite_conn.Close();
}     

ただし、これらの接続を 1 つのメソッドで作成し、別のメソッドで呼び出すことができる必要があります。これらの接続をインスタンス変数として保存するための最もクリーンで混乱の少ない方法は何ですか? それらのメソッドがインテリジェントな方法で呼び出されることを確認したいのですが、すべてのアクションが単一のブロック.Dispose()のコンテキスト内で発生することを確認する良い方法がわかりません。using

これはC#の初心者の質問であることを認識しているので、そのように回答を調整してください。提案された解決策がある場合は、説明するコード サンプルを含めていただければ幸いです。

編集:私のユースケースはコンソールアプリです。ソースと宛先の接続文字列が渡され、コンソール アプリが操作を実行します。実際に、コンソール クラス Program 自体に IDisposable を次のように実装させるでしょうか?:

class Program : IDisposable
{
    private SQLiteConnection sourceConnection;
    private SQLiteConnection destinationConnection;

    public void Dispose()
    {
        sourceConnection.Dispose();
        destinationConnection.Dispose();
    }  
}
4

3 に答える 3

2

これらの接続を 1 つのメソッドで作成し、別のメソッドで呼び出すことができる必要があります。これらの接続をインスタンス変数として保存するための最もクリーンで混乱の少ない方法は何ですか?

この場合、これらのインスタンス変数を保持するクラス自体が IDisposable を実装し、破棄時に接続も破棄されるようにする必要があります。

また、一度に複数の IDisposables がある場合は、このように書き直して、それらをグループ化し、コード内のネストを減らすことができます。

using (SQLiteConnection sqlite_conn = new SQLiteConnection(connectionString))
using (SQLiteCommand sqlite_cmd = new SQLiteCommand())
{
    sqlite_conn.Open();

    sqlite_cmd.Connection = sqlite_conn;
    sqlite_cmd.CommandText = "INSERT INTO SOMETHING SOMETHING;";
    sqlite_cmd.ExecuteNonQuery();
} // no need to call .Close(): IDisposable normally handles it for you
于 2009-05-06T01:28:47.843 に答える
1

クラスに IDisposable を実装させ、Dispose メソッド内で接続などを確実にクリーンアップすることができます。次に、クラスを呼び出すメソッドは us​​ing(MyClass c ...) を実行できます。

于 2009-05-06T01:29:55.783 に答える
1

1 つの方法は、クラスに IDisposable を実装させることです。クラスの Dispose メソッドで、接続やコマンドなどの Dispose メソッドを呼び出します。その後、using ブロックでクラスのインスタンスを使用できます。

于 2009-05-06T01:33:18.363 に答える