0

C# と POSTGRESQL でクライアントを開発しています。

いくつかのテキストを解析し、テーブルにデータを正しく挿入する必要があるため、各テーブル (現時点では 4 つ) のディクショナリを提供する解析済みがあります。

したがって、ConcurrentQueue の辞書をキューに挿入するスレッドがあります。

これで、2 つのタイマーができました。

1) 10 秒ごとに、開いているトランザクションをコミットし、1 つを再作成します。

これらは方法です:

    void transactionTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
            try
            {
                Commit();
            }
            catch (Exception ex)
            {
                Logger.Log(Logger.LogType.ERROR, ex);
                Rollback();
            }

            Transaction();
        }
    }
    public void Commit()
    {
        if (trans != null)
        {
            trans.Commit();
            trans.Dispose();
            trans = null;
        }
    }
    public void Transaction()
    {
        if (dbCon == null || (dbCon != null && dbCon.State != ConnectionState.Open))
            dbCon = Connection;

        if (trans == null)
            trans = dbCon.BeginTransaction();
    }
    public void Rollback()
    {
        if (trans != null)
        {
            trans.Rollback();
            trans.Dispose();
            trans = null;
        }
    }

2)キューで 100 個のデータを選択し、大量の挿入を行います(次のようなパラメーターを使用して、100* だけで挿入するのではありません:

    insert into Tabletest1_HandsData( handDataId, handData) values( @handDataId0,   @handData0),( @handDataId1, @handData1),( @handDataId2, @handData2),( @handDataId3, @handData3) ....

このヘルパーを使用して

    public bool Insert(String tableName, Dictionary<String, object> data, bool usingTransaction = false)
    {
        Boolean returnCode = true;
        var sql = GetSQL(tableName, data);
        try
        {
            int rowsUpdated = -1;
            var conn = (!usingTransaction) ? Connection : dbCon;
            DbCommand mycommand = GetCommand(conn, sql);
            GetCommandByDictionary(mycommand, data);
            rowsUpdated = mycommand.ExecuteNonQuery();
            if (!usingTransaction)
            {
                conn.Close();
                conn.Dispose();
            }
        }
        catch (Exception ex)
        {
            Logger.Log(Logger.LogType.ERROR, ex);
            returnCode = false;
        }
        return returnCode;
    }
    protected override void GetCommandByDictionary(DbCommand cmd, Dictionary<string, object> data)
    {
        foreach (var val in data)
            (cmd as NpgsqlCommand).Parameters.AddWithValue(val.Key.ToString(), val.Value);
    }

したがって、キューを解析して挿入し、3 秒ごとに 100 個を選択して挿入し、10 秒ごとにトランザクションをコミットして再作成します。

私のエラーは、ExecuteNonQuery が私に与えていることです:

    There is already an open DataReader associated with this Command which must be closed first.

なぜそれが起こっているのですか?

この機会に質問させてください。お気軽に私を侮辱してください、私はたくさんのものを試しました

ありがとうルカ

4

0 に答える 0