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.
なぜそれが起こっているのですか?
この機会に質問させてください。お気軽に私を侮辱してください、私はたくさんのものを試しました
ありがとうルカ